정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

AT명령어 사용하여 초음파센서값 thingspeak에 전송
닉닉닉 | 2018-06-25

현재 아두이노 우노 + esp8266(01)을 사용중에 있습니다.

 

2자리 3자리 센서값들은 정상적으로 thingspeak에 전송되는데 1자리 센서값이 전송되면

 

thingspeak가 0으로 인식하는 문제를 발견하였습니다. 시리얼 모니터 확인결과 한자리 값도 정상적으로 

 

프린트 합니다. 

 

소스 올리겠습니다. 수정해야할 부분 알려주시면 감사하겠습니다.

 

#include <SoftwareSerial.h>
#include <stdlib.h>
#define DEBUG true
#define ULTRASONIC_ECHO 8 
#define ULTRASONIC_TRIG 9
 
// 자신의 thingspeak 채널의 Write API key 입력
String apiKey = "HGJJA4DJG81BV6T5";
 
SoftwareSerial esp8266(2,3); // TX/RX 설정, esp8266 객체생성
 
void setup() {
  pinMode(ULTRASONIC_ECHO, INPUT); 
  pinMode(ULTRASONIC_TRIG, OUTPUT); // 초음파센서 활성화
  //시리얼통신속도 9600보드레이트 설정    
  Serial.begin(9600); 
  //소프트웨어 시리얼 시작
  esp8266.begin(9600);
  esp8266.println("AT+RST");
 
  /*AT 커맨드 이용*/
  sendData("AT+RST\r\n", 2000, DEBUG); //모듈을 리셋
  sendData("AT+CWMODE=1\r\n", 1000, DEBUG); //dual mode로 설정
  sendData("AT+CWJAP=\"Hi\",\"53007257\"\r\n", 5000, DEBUG); //사용할 공유기 설정
}
 
void loop() {
  float ultrasonic_val =  Dist_cm();
  Serial.print("Ultrasonic : ");
  Serial.print(ultrasonic_val);
  Serial.println("cm");
 
  // String 변환
  char buf[16];
  String strVal = dtostrf(ultrasonic_val, 4, 1, buf);
  
  Serial.println(strVal);
  
  // TCP 연결
  String cmd = "AT+CIPSTART=\"TCP\",\"";
  cmd += "184.106.153.149"; // api.thingspeak.com 접속 IP
  cmd += "\",80";           // api.thingspeak.com 접속 포트, 80
  esp8266.println(cmd);
   
  if(esp8266.find("Error")){
    Serial.println("AT+CIPSTART error");
    return;
  }
  
  // GET 방식으로 보내기 위한 String, Data 설정
  String getStr = "GET /update?api_key=";
  getStr += apiKey;
  getStr +="&field1=";
  getStr += String(strVal);
  getStr += "\r\n\r\n";
 
  // Send Data
  cmd = "AT+CIPSEND=";
  cmd += String(getStr.length());
  esp8266.println(cmd);
 
  if(esp8266.find(">")){
    esp8266.print(getStr);
  }
  else{
    esp8266.println("AT+CIPCLOSE");
    // alert uesp8266
    Serial.println("AT+CIPCLOSE");
  }
    
  // Thingspeak 최소 업로드 간격 15초를 맞추기 위한 delay
  delay(16000);  
}
 
//ESP8266의 정보를 알아내고 설정하기 위한 함수 선언
String sendData(String command, const int timeout, boolean debug){
  String response = "";
  esp8266.print(command); //command를 ESP8266에 보냄
  long int time=millis();
  
  while((time+timeout)>millis()){
    while(esp8266.available()){
      //esp가 가진 데이터를 시리얼 모니터에 출력하기 위함
      char c=esp8266.read(); //다음 문자를 읽어옴
      response+=c;
    }
  }
  if(debug){
    Serial.print(response);
  }
 
  return response;
}
 
uint16_t Dist_cm(void) //초음파센서 거리값 계산
{
  uint32_t timer = 0;
  uint16_t dist = 0;
  digitalWrite(ULTRASONIC_TRIG, LOW);
  delayMicroseconds(2);
  digitalWrite(ULTRASONIC_TRIG, HIGH);
  delayMicroseconds(10);
  digitalWrite(ULTRASONIC_TRIG, LOW);
 
  timer = pulseIn(ULTRASONIC_ECHO,HIGH,24000);
  if(timer == 0)
    dist = 400;
  else
  {
    dist = timer * 0.034 / 2;
  }
  return dist;
}
이전글   |    네오픽셀이 안켜져요ㅜㅜ 2018-06-23
다음글   |    오렌지보드WIFI 타임아웃(TIME OUT)문제 어떻게 해결하나요? ... 2018-06-27