코코아팹은 누구나 창의적 아이디어를 현실로 만들어 낼 수 있도록
만들고, 공유하고, 배울 수 있는 터전이
되고자 합니다.
아이디와 비밀번호를 잊으셨나요?아이디 / 비밀번호 찾기
코코아팹 회원이 아니신가요? 회원가입
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 |