반응형


아두이노에 연결된 온도센서의 값을 읽어서 ESP8266과 PHP를 이용하여 MySQL에 저장하는 예제입니다.



2016.  5. 21. 최초작성

2018. 10. 17. 마지막 업데이트




1. 다음 포스팅에 Arduino Uno와 ESP8266 연결하는 방법과 필요한 라이브러리를 설치하는 방법이 소개되어있습니다.

먼저 진행을 해야 합니다.



Arduino Uno에 ESP8266 WiFi 모듈을 연결하여 사용하는 방법

http://webnautes.tistory.com/755





2. 다음 포스팅에 Arduino Uno와 DB18B20 연결 방법과 필요한 라이브러리를 설치하는 방법이 소개되어 있습니다.

먼저 진행을 해야 합니다.



Arduino Uno에서 DS18B20 1-Wire 온도 센서 사용하기

http://webnautes.tistory.com/631





2.  윈도우 또는 리눅스에 아파치 웹서버, MySQL, PHP를 설치합니다.



Ubuntu 16.04에 LAMP ( Apache2, MySQL , PHP7) 설치하는 방법

http://webnautes.tistory.com/1028


Ubuntu 18.04에 LAMP ( Apache2, MySQL , PHP 7) 설치하는 방법

http://webnautes.tistory.com/1185


윈도우 기반 웹 개발 환경 만들기 ( Apache2, PHP, MySQL, PhpMyAdmin )

http://webnautes.tistory.com/1206


Raspberry Pi 3에 LAMP (Linux, Apache, MySQL, PHP) 설치하는 방법

http://webnautes.tistory.com/842





3. 데이터를 저장할 테이블을 생성합니다.


mysql> create database db;
Query OK, 1 row affected (0.00 sec)

mysql> use db;
Database changed
mysql> create table data(num int(10));
Query OK, 0 rows affected (0.01 sec)




4. 데이터베이스에 값을 넣을때 사용할 PHP 파일을 생성하여 다음 내용을 복사하여 붙여넣기 해줍니다.


리눅스

sudo nano /var/www/html/insert_data.php


윈도우

C:\wamp64\www 위치에 insert_data.php 파일 생성



<?php
$con = mysqli_connect("localhost", "MySQL 계정 아이디", "MySQL 계정 패스워드", "사용할 데이터베이스 이름");

if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

  $num = $_GET["num"];

  $sql = "insert into db.data(num) values($num)";
  mysqli_query($con, $sql);

  mysqli_close($con);
?>




5. 다음 아두이노 코드를 업로드 합니다.


#include <OneWire.h>    
#include <DallasTemperature.h>    
#include <string.h>  

#include "ESP8266.h"
#include <SoftwareSerial.h>  
   

#define SSID        "공유기의 SSID"

#define PASSWORD    "공유기의 비밀번호"

#define SERVERIP   "서버 아이피"

 

//SoftwareSerial mySerial(11, 10); /* RX:D11, TX:D10 */

SoftwareSerial mySerial(10, 9); /* RX:D10, TX:D9 */


   
     
//DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 3번에 연결합니다.     
#define ONE_WIRE_BUS 3  
     
//1-wire 디바이스와 통신하기 위한 준비    
OneWire oneWire(ONE_WIRE_BUS);    
     
// oneWire선언한 것을 sensors 선언시 참조함.    
DallasTemperature sensors(&oneWire);    
     
//다비아스 주소를 저장할 배열 선언    
DeviceAddress insideThermometer;    
     
     
     
char * floatToString(char * outstr, double val, byte precision, byte widthp){  
char temp[16]; //increase this if you need more digits than 15  
byte i;  
 
temp[0]='\0';  
outstr[0]='\0';  
 
if(val < 0.0){  
  strcpy(outstr,"-\0");  //print "-" sign  
  val *= -1;  
}  
 
if( precision == 0) {  
  strcat(outstr, ltoa(round(val),temp,10));  //prints the int part  
}  
else {  
  unsigned long frac, mult = 1;  
  byte padding = precision-1;  
    
  while (precision--)  
    mult *= 10;  
 
  val += 0.5/(float)mult;      // compute rounding factor  
    
  strcat(outstr, ltoa(floor(val),temp,10));  //prints the integer part without rounding  
  strcat(outstr, ".\0"); // print the decimal point  
 
  frac = (val - floor(val)) * mult;  
 
  unsigned long frac1 = frac;  
 
  while(frac1 /= 10)   
    padding--;  
 
  while(padding--)   
    strcat(outstr,"0\0");    // print padding zeros  
 
  strcat(outstr,ltoa(frac,temp,10));  // print fraction part  
}  
 
// generate width space padding   
if ((widthp != 0)&&(widthp >= strlen(outstr))){  
  byte J=0;  
  J = widthp - strlen(outstr);  
 
  for (i=0; i< J; i++) {  
    temp[i] = ' ';  
  }
 
  temp[i++] = '\0';  
  strcat(temp,outstr);  
  strcpy(outstr,temp);  
}  
 
return outstr;  
}  
 
 
     
void setup(void)    
{    
   
 //시리얼 포트 초기화    
 Serial.begin(9600);    
 
  
/////////////////////////////////////////////////////////////////////////  
 Serial.setTimeout(5000);  
 mySerial.begin(9600);   
 Serial.println("ESP8266 connect");  
 
   
  boolean connected=false;  
  for(int i=0;i<10;i++)  
  {
      if(connectWiFi())  
      {
        connected = true;  
        break;  
      }
  }
    
  if (!connected){while(1);}  
  delay(5000);  
   
  mySerial.println("AT+CIPMUX=0");  
 ///////////////////////////////////////////////////////////////////////////     
      
        
 //1-wire 버스 초기화    
 sensors.begin();    
       
 //발견한 디바이스 갯수    
 Serial.print("Found ");    
 Serial.print(sensors.getDeviceCount(), DEC);    
 Serial.println(" devices.");    
     
 // parasite power 모드일 때에는  2핀(GND와 DQ 핀)만 연결하면 됨.
 Serial.print("Parasite power is: ");     
 if (sensors.isParasitePowerMode()) Serial.println("ON");    
 else Serial.println("OFF");    
       
      
 //버스에서 첫번째 장치의 주소를 가져온다.    
 if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");     
       
 //버스에서 발견한 첫번째 장치의 주소 출력    
 Serial.print("Device 0 Address: ");    
 printAddress(insideThermometer);    
 Serial.println();    
     
 //데이터시트에서 확인결과 9~12비트까지 설정 가능    
 sensors.setResolution(insideThermometer, 10);    
      
 Serial.print("Device 0 Resolution: ");    
 Serial.print(sensors.getResolution(insideThermometer), DEC);     
 Serial.println();    
}    
     
     
// 온도를 출력하는 함수    
void printTemperature(DeviceAddress deviceAddress)    
{    
 //섭씨 온도를 가져옴    
 float  tempC = sensors.getTempC(deviceAddress);    
       
 Serial.print("Temp C: ");    
 Serial.print(tempC);    
 Serial.print(" Temp F: ");    
       
 //화씨 온도로 변환    
 Serial.println(DallasTemperature::toFahrenheit(tempC));  
 
 
 
    String cmd = "AT+CIPSTART=\"TCP\",\"";  
    cmd += SERVERIP;  
    cmd += "\",80";  
    Serial.println(cmd);  
    mySerial.println(cmd);  
    if(mySerial.find("Error"))  
   {
     Serial.println( "TCP connect error" );  
     return;  
   }
    
 
   char test[20];  
   String temp(floatToString(test,tempC, 2, 0));  
     
    cmd = "GET /insert_data.php?num="+temp+"\r\n";  
    mySerial.print("AT+CIPSEND=");  
    mySerial.println(cmd.length());  
         
      
    Serial.println(cmd);  
      
      
    if(mySerial.find(">"))  
    {
      Serial.print(">");  
      }else  
      {
        mySerial.println("AT+CIPCLOSE");  
        Serial.println("connect timeout");  
        delay(1000);  
        return;  
      }
        
      mySerial.print(cmd);  
      delay(2000);  
      //Serial.find("+IPD");  
      while (Serial.available())  
      {
        char c = Serial.read();  
        mySerial.write(c);  
        if(c=='\r') mySerial.print('\n');  
      }
      Serial.println("====");  
      delay(1000);  
}    
     
//디바이스 주소를 출력하는 함수    
void printAddress(DeviceAddress deviceAddress)    
{    
 for (uint8_t i = 0; i < 8; i++)    
 {   
   if (deviceAddress[i] < 16) Serial.print("0");    
       Serial.print(deviceAddress[i], HEX);    
 }   
}    
     
     
void loop(void)    
{     
 Serial.print("Requesting temperatures...");    
 //sensors.requestTemperatures();   //연결되어 있는 전체 센서의 온도 값을 읽어옴
 sensors.requestTemperaturesByIndex(0); //첫번째 센서의 온도값 읽어옴    
 Serial.println("DONE");    
      
 //센서에서 읽어온 온도를 출력    
 printTemperature(insideThermometer);    
}    
 
 
boolean connectWiFi()  
{  
  //mySerial.println("AT+CWMODE=1");  
    
  String cmd="AT+CWJAP=\"";  
  cmd+=SSID;  
  cmd+="\",\"";  
  cmd+=PASSWORD;  
  cmd+="\"";  
  mySerial.println(cmd);  
  Serial.println(cmd);  
  delay(3000);  
   
  if(mySerial.find("OK"))  
  {
    Serial.println("OK, Connected to WiFi.");  
    return true;  
  }
  else  
  {
    Serial.println("Can not connect to the WiFi.");  
    return false;  
  }
}  





6. 아두이노 IDE에서 툴 > 시리얼모니터를 선택합니다.


공유기에 접속 성공하면 “OK, Connected to WiFi” 메시지가 보입니다.

아두이노에 연결된 DB18B20를 찾았다면 “Found 1 devices”라는 메시지가 보입니다.


이후 온도를 가져오고(Requesting temperatures...Done)

웹서버에 온도를 저장하는 것(GET /insert_data.php?num=온도)을 반복합니다.





7. MySQL을 확인해보면 데이터가 입력되는 것을 볼 수 있습니다.



반응형

해보고 확인한 것을 문서화하여 기록합니다.


부족함이 있지만 도움이 되었으면 합니다.
잘못된 부분이나 개선점을 알려주시면 감사하겠습니다.



포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
문제가 생기면 포스트와 바뀐 환경이 있나 먼저 확인해보세요.

질문을 남겨주면 가능한 빨리 답변드립니다.


제가 쓴 책도 한번 검토해보세요 ^^

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기

댓글을 달아 주세요

">
  1. 이전 댓글 더보기
  2. thumbnail
    dsd
    2019.06.03 17:40

    선생님 안녕하세요. 위 첫번째 덧글 다신 분과 같이

    링크에 있는 wifi 연결하기는 성공했는데 소스에서는 wifi에 연결이 안되네요 ㅠ
    AT+CWJAP="SSID","PASSWORD"(잘 채웠는데 안되네요..ㅠ)
    Can not connect to the WiFi
    아두이노에 코딩 할때 ,로 구분하는것도 맞는것 같은데 왜 안될까요ㅠ

    공유기에는 비밀번호가 없어서 모바일 핫스팟 사용했습니다.

    -------------------------------------------------------------------
    지금 이상황이랑 같습니다.. ㅠ 선생님께서 링크 주신 아두이노 우노와 esp-01 연결에서 맨 처음에는

    카페 wifi로 해서 도저히 안되다가 핸드폰 핫스팟으로 wifi변경을 하니 되서 거기까지는 성공했습니다.

    (도대체 무슨 차이인지를 모르겠더군요)

    그래서 똑같이 이대로 소스 코드 하고 했는데도 (분명 SSID와 비밀번호가 같습니다. 서버 아이피도 IPCONFIG로 확인해서 제대로 쳤구요..)

    그런데도 WIFI연결이 실패했다고만 뜨네요 ㅠ 도대체 무슨 문제일까요 ?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.06.03 18:03 신고

      에러 메시지 상으로는 코드에 적은 SSID와 PASSWORD로는 공유기로부터 IP를 할당받을 수 없다는 겁니다.

      카페의 경우는 안되는 이유를 알기 힘들듯합니다.

    • thumbnail
      sdsd
      2019.06.03 18:07

      현재는 스마트폰 핫스팟으로 wifi연결을 한 상태입니다.. 카페 wifi는 사용하지 않고 있구요.

      스마트폰 핫스팟으로 wifi로 연결하고 나니

      아두이노 우노와 esp-01 연결은 잘 되었습니다. 무엇이 문제일까요 ?

      한 가지 걸리는게 있다면 ,

      현재 제 컴퓨터 아이피 주소를 주소창에 치면 오류가 뜹니다.

      wamp도 주황색으로 뜨구요. 이게 문제가 될까요 ?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.06.03 18:11 신고

      wamp가 초록색이 되어야 합니다.

      다음 위치에 있는 로그를 확인해보세요..

      C:\wamp64\logs

    • thumbnail
      sdfsd
      2019.06.03 18:13

      log에서 어떤 로그를 보면 될까요 ?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.06.03 18:18 신고

      apache_error.log를 확인해보고

      wamp 아이콘에서 마우스 오른쪽 버튼을 눌러서 tools > Test Port 80을 선택하여 테스트해보세요.

    • thumbnail
      ㅇㄴㅁㅇ
      2019.06.03 18:26

      ***** Test which uses port 80 *****

      ===== Tested by command netstat filtered on port 80 =====


      Test for TCP
      Your port 80 is used by a processus with PID = 3704
      The processus of PID 3704 is 'httpd.exe' Session: Services
      The service of PID 3704 for 'httpd.exe' is 'Apache2.4'
      *** ERROR *** This service IS NOT from Wampserver - Should be: 'wampapache64'

      Test for TCPv6
      Your port 80 is used by a processus with PID = 3704
      The processus of PID 3704 is 'httpd.exe' Session: Services
      The service of PID 3704 for 'httpd.exe' is 'Apache2.4'
      *** ERROR *** This service IS NOT from Wampserver - Should be: 'wampapache64'

      ===== Tested by attempting to open a socket on port 80 =====

      Your port 80 is actually used by :

      Server: Apache/2.4.39 (Win64) PHP/7.3.5

      80포트 결과입니다..

    • thumbnail
      ㅁㄴㅇㅇ
      2019.06.03 18:27

      [Wed May 29 20:16:06.272715 2019] [mpm_winnt:notice] [pid 7616:tid 748] AH00455: Apache/2.4.39 (Win64) PHP/7.2.18 configured -- resuming normal operations
      [Wed May 29 20:16:06.273712 2019] [mpm_winnt:notice] [pid 7616:tid 748] AH00456: Apache Lounge VC15 Server built: Mar 28 2019 11:59:33
      [Wed May 29 20:16:06.273712 2019] [core:notice] [pid 7616:tid 748] AH00094: Command line: 'c:\\wamp64\\bin\\apache\\apache2.4.39\\bin\\httpd.exe -d C:/wamp64/bin/apache/apache2.4.39'
      [Wed May 29 20:16:06.300640 2019] [mpm_winnt:notice] [pid 7616:tid 748] AH00418: Parent: Created child process 628
      [Wed May 29 20:16:08.107809 2019] [mpm_winnt:notice] [pid 628:tid 4] AH00354: Child: Starting 64 worker threads.
      [Wed May 29 20:19:31.073688 2019] [mpm_winnt:notice] [pid 7616:tid 748] AH00422: Parent: Received shutdown signal -- Shutting down the server.
      [Wed May 29 20:19:33.077329 2019] [mpm_winnt:notice] [pid 628:tid 4] AH00364: Child: All worker threads have exited.
      [Wed May 29 20:19:33.108246 2019] [mpm_winnt:notice] [pid 7616:tid 748] AH00430: Parent: Child process 628 exited successfully.
      [Wed May 29 20:19:38.663394 2019] [mpm_winnt:notice] [pid 6112:tid 748] AH00455: Apache/2.4.39 (Win64) PHP/7.2.18 configured -- resuming normal operations
      [Wed May 29 20:19:38.663394 2019] [mpm_winnt:notice] [pid 6112:tid 748] AH00456: Apache Lounge VC15 Server built: Mar 28 2019 11:59:33
      [Wed May 29 20:19:38.663394 2019] [core:notice] [pid 6112:tid 748] AH00094: Command line: 'c:\\wamp64\\bin\\apache\\apache2.4.39\\bin\\httpd.exe -d C:/wamp64/bin/apache/apache2.4.39'
      [Wed May 29 20:19:38.686334 2019] [mpm_winnt:notice] [pid 6112:tid 748] AH00418: Parent: Created child process 11580
      [Wed May 29 20:19:41.187645 2019] [mpm_winnt:notice] [pid 11580:tid 716] AH00354: Child: Starting 64 worker threads.
      [Thu May 30 23:47:24.714238 2019] [mpm_winnt:notice] [pid 6112:tid 748] AH00422: Parent: Received shutdown signal -- Shutting down the server.
      [Thu May 30 23:47:26.783032 2019] [mpm_winnt:notice] [pid 11580:tid 716] AH00364: Child: All worker threads have exited.
      [Thu May 30 23:47:26.938986 2019] [mpm_winnt:notice] [pid 6112:tid 748] AH00430: Parent: Child process 11580 exited successfully.
      이게 아파치 로그입니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.06.03 19:51 신고

      마우스 왼쪽 버튼을 누르고 메뉴에서 apache > Serivice administration > install serivce를 선택해보세요.

      그리고 restart service를 선택하고 다시 아파치서버가 동작하나 보세요..

  3. thumbnail
    학생입니다.
    2019.06.03 20:39

    선생님, 다른건 다 되는데 found 0 device 가 뜨는데 어찌해야 할까요 ㅠ

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.06.03 20:53 신고

      온도 센서 사용시 저항을 연결안하면 인식이 안됩니다.

      꼭 연결해줘야 합니다.

  4. thumbnail
    hhe
    2019.06.04 19:04

    안녕하세요! 혹시 데이터값이 0일때는 db에 넘어가지 않도록 코드를 추가하고싶은데 어느부분에 추가를 해야할까요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.06.04 20:02 신고

      아래 코드 다음줄에서 체크하면 될 듯합니다.

      float tempC = sensors.getTempC(deviceAddress);

  5. thumbnail
    sh
    2019.06.14 20:42

    안녕하세요 질문이있습니다.
    제가 원래코드의 Wifi connect가 계속오류가 나서 선생님의 ESP8266과 TCP통신을 하는 예제에서
    와이파이 연결하는 부분을 따와서 사용했습니다.
    현재 LED상태에 따라 값을 넘겨주는 코드를 작성했는데요 코드를 한번봐주실 수 있는지 궁금합니다.
    그리고 PHP파일에 데이터베이스이름은 기존의 mysql을 수정하지않았다면
    db로 하는게맞나요?
    $con = mysqli_connect("localhost", "root", "-----", "db"); 이렇게 되있습니다.

    #include <string.h>
    #include "ESP8266.h"
    #include <SoftwareSerial.h>


    #define SSID "DAWN-2F"

    #define PASSWORD "cafedawn11"

    #define SERVERIP "172.30.1.1"

    SoftwareSerial mySerial(9, 10);
    boolean inConnected = false;
    ESP8266 wifi(mySerial);

    char * floatToString(char * outstr, double val, byte precision, byte widthp){
    char temp[16]; //increase this if you need more digits than 15
    byte i;

    temp[0]='\0';
    outstr[0]='\0';

    if(val < 0.0){
    strcpy(outstr,"-\0"); //print "-" sign
    val *= -1;
    }

    if( precision == 0) {
    strcat(outstr, ltoa(round(val),temp,10)); //prints the int part
    }
    else {
    unsigned long frac, mult = 1;
    byte padding = precision-1;

    while (precision--)
    mult *= 10;

    val += 0.5/(float)mult; // compute rounding factor

    strcat(outstr, ltoa(floor(val),temp,10)); //prints the integer part without rounding
    strcat(outstr, ".\0"); // print the decimal point

    frac = (val - floor(val)) * mult;

    unsigned long frac1 = frac;

    while(frac1 /= 10)
    padding--;

    while(padding--)
    strcat(outstr,"0\0"); // print padding zeros

    strcat(outstr,ltoa(frac,temp,10)); // print fraction part
    }

    // generate width space padding
    if ((widthp != 0)&&(widthp >= strlen(outstr))){
    byte J=0;
    J = widthp - strlen(outstr);

    for (i=0; i< J; i++) {
    temp[i] = ' ';
    }

    temp[i++] = '\0';
    strcat(temp,outstr);
    strcpy(outstr,temp);
    }

    return outstr;
    }



    void setup(void)
    {

    //시리얼 포트 초기화
    Serial.begin(9600);


    /////////////////////////////////////////////////////////////////////////
    Serial.setTimeout(5000);
    mySerial.begin(9600);

    Serial.println("ESP8266 connect");
    Serial.print("FW Version:");
    Serial.println(wifi.getVersion().c_str());

    if (wifi.setOprToStationSoftAP()) {
    Serial.print("to station + softap ok\r\n");
    } else {
    Serial.print("to station + softap err\r\n");
    }

    if (wifi.joinAP(SSID, PASSWORD)) {
    Serial.print("Join AP success\r\n");
    Serial.print("IP:");
    Serial.println( wifi.getLocalIP().c_str());
    } else {
    Serial.print("Join AP failure\r\n");
    }

    if (wifi.disableMUX()) {
    Serial.print("single ok\r\n");
    } else {
    Serial.print("single err\r\n");
    }

    Serial.print("setup end\r\n");
    //////////////////////////////////////////////////////////////////////////
    }


    // 온도를 출력하는 함수
    void printTemperature()
    {
    //섭씨 온도를 가져옴
    //float tempC = sensors.getTempC(deviceAddress);

    //Serial.print("Temp C: ");
    // Serial.print(tempC);
    // Serial.print(" Temp F: ");

    //화씨 온도로 변환
    // Serial.println(DallasTemperature::toFahrenheit(tempC));
    int state = 0;

    if(digitalRead(11) == HIGH){
    digitalWrite(11, LOW);
    state = 0;
    } else {
    digitalWrite(11, HIGH);
    state = 1;
    }


    String cmd = "AT+CIPSTART=\"TCP\",\"";
    cmd += SERVERIP;
    cmd += "\",80";
    Serial.println(cmd);
    mySerial.println(cmd);
    if(mySerial.find("Error"))
    {
    Serial.println( "TCP connect error" );
    return;
    }


    char test[20];
    String temp(floatToString(test,state, 2, 0));

    cmd = "GET /insert_data.php?num="+temp+"\r\n";
    mySerial.print("AT+CIPSEND=");
    mySerial.println(cmd.length());


    Serial.println(cmd);


    if(mySerial.find(">"))
    {
    Serial.print(">");
    }else
    {
    mySerial.println("AT+CIPCLOSE");
    Serial.println("connect timeout");
    delay(1000);
    return;
    }

    mySerial.print(cmd);
    delay(2000);
    //Serial.find("+IPD");
    while (Serial.available())
    {
    char c = Serial.read();
    mySerial.write(c);
    if(c=='\r') mySerial.print('\n');
    }
    Serial.println("====");
    delay(1000);
    }

    void loop(void)
    {
    Serial.print("Requesting temperatures...");
    Serial.println("DONE");

    //센서에서 읽어온 온도를 출력
    printTemperature();
    }


    boolean connectWiFi()
    {
    //mySerial.println("AT+CWMODE=1");

    String cmd="AT+CWJAP=\"";
    cmd+=SSID;
    cmd+="\",\"";
    cmd+=PASSWORD;
    cmd+="\"";
    mySerial.println(cmd);
    Serial.println(cmd);
    delay(3000);

    if(mySerial.find("OK"))
    {
    Serial.println("OK, Connected to WiFi.");
    return true;
    }
    else
    {
    Serial.println("Can not connect to the WiFi.");
    return false;
    }
    }

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.06.14 21:05 신고

      db를 사용하면 됩니다. 포스트의 3번에서 db로 데이터베이스를 생성합니다.

      그리고
      String temp(floatToString(test,state, 2, 0));

      대신에 다음 코드를 사용하면 좋을듯 합니다.

      String temp= String(state);

    • thumbnail
      sh
      2019.06.15 12:38

      선생님이 말씀하신대로 코드를 일부수정하였습니다.

      시리얼 모니터에는 연결이 정상적으로 되고
      GET / insert_data.php?num =1.10 이라고 출력도됩니다.
      하지만 데이터베이스로 값이 들어가지 않습니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.06.15 14:11 신고

      아파치 웹서버의 로그를 확인해보세요.

  6. thumbnail
    학생2323
    2019.08.21 17:46

    아두이노 우도 보드가 아닌 아두이노 메가보드에서 진행중인데...

    연결오류가 계속 뜨네요 ㅠㅠㅠ

    위에서 말씀하신

    #include <SoftwareSerial.h> 를 삭제하고

    ESP8266 wifi (Serial1) 을 적어주고

    Serial1로 사용하기는 하였으나 연결이 계속 커넥트 되지않는다라고 뜨네요 ㅠㅠ

    • thumbnail
      학생2323
      2019.08.21 17:48

      그리고 우노 보드에서 rx와 tx를 연결할 때 핀과 메가 보드에서의 rx와 tx연결 핀이 다르게 된다면 어떻게 다르게 해야하나요? 코드에서도 어떻게 적어야 하나요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.08.21 17:57 신고

      코드는 그대로 두고 아두이노에 연결하는 rx와 tx를 바꾸어 보세요.

      포스트의 6번에서 설명한 것처럼 공유기에 연결되었다면 다음 메시지가 보여야 합니다.

      OK, Connected to WiFi

    • thumbnail
      학생2323
      2019.08.21 18:02

      아두이노에 연결하는 rx tx를 각각 19,18번 핀번호로 설정했는데 메가 2560에서 시리얼4개중 시리얼1을 사용하는데 핀번호만 변경해주면 상관없나요?

    • thumbnail
      학생2323
      2019.08.21 18:05

      코드를 그대로 두고 아두이노에 연결하는 rx와 tx를 바꾸라는 말씀이 아두이노 핀에 rx를 10번 tx를 9번에 꽂으라는 말씀인가요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.08.21 18:06 신고

      메가라면 #define ESP8266_USE_SOFTWARE_SERIAL를 주석해두세요..

      그리고 실제 시리얼 핀에 연결하세요..
      그리고 코드에서 해당 시리얼 핀 이름으로 바꾸세요..

      아두이노에 연결하는 rx와 tx를 바꾸어 가며 테스트해보면 연결이 될 겁니다.

    • thumbnail
      익명
      2019.08.21 18:16

      비밀댓글입니다

    • thumbnail
      학생2323
      2019.08.21 18:17

      위의 코드에서 실행했을 때,

      ESP8266 connect
      AT+CWJAP="SALUV","19980108"
      Can not connect to the WiFi.
      AT+CWJAP="SALUV","19980108"
      Can not connect to the WiFi.
      AT+CWJAP="SALUV","19980108"
      Can not connect to the WiFi.
      AT+CWJAP="SALUV","19980108"

      이 오류가 계속 반복됩니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.08.21 18:30 신고

      rx와 tx선을 바꾸며 테스트해도 안되나요?

      다음 블로그의 포스트를 참고하여 WIFI 연결 테스트를 해보세요

      여기서 올바른 결과를 얻은 핀번호를 지금 코드에 입력하면 될 듯합니다

      https://zzdd1558.tistory.com/199

    • thumbnail
      학생2323
      2019.08.21 19:00

      위의 테스트 코드를 넣고 핀을 전부 바꾸어 꼽고 코드의 핀번호를 수정하여도 되지않습니다. ESP8266을 새거로 바꾸어도 되지않네요..

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.08.21 19:07 신고

      우노가 있다면 일단 우노로 진행해보고 메가로 다시 해보세요.

      코드 문제가 아니라 아두이노와 ESP8266 그리고 공유기간에 연결 문제 인듯합니다.

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.08.21 19:50 신고

      혹 공유기의 문제일 수도 있습니다. 스마트폰 핫스팟으로 변경해서 테스트해보세요.

  7. thumbnail
    학생1111
    2019.09.19 15:22

    안녕하세요 선생님
    제가 아두이노에서 rfid센서로 값을 받고
    라즈베리파이 웹서버 mysql에 저장되어 있는 rfid 값을 입력받아 두 값을 비교해 일치하면 mysql 테이블에 값을 보내 수정하려고 합니다.
    값을 받는것까지는 했는데
    입력해주는건 막혔습니다.

    제가 여기서 궁금한점은

    if(mySerial.find(">")){
    이 부분이 무슨 뜻인지는 알겠는데 여기서 막혀서 else로 넘어갑니다
    어느 부분에서 > 가 출력이 되어서 찾는건지 알려주실 수 있으신가요?

    그리고
    SoftwareSerial Serial1(2, 3); // RX, TX
    이렇게 설정해서 쓰는데
    AT통신이 되는지 안되는지 확인하는 방법이 있을까요?

    기존 0,1번 포트에 연결하면 시리얼 모니터에서 AT통신이 되는데 저렇게 바꾸면 되는지 안되는지 모르겠어요

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.09.19 16:04 신고


      무선 공유기에 접속 성공했나요? 성공했다면 “OK, Connected to WiFi” 메시지가 보입니다.

    • thumbnail
      익명
      2019.09.19 16:40

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.09.19 16:42 신고

      코드를 동작시켜보며 확인해야되서 해보기가 힘듭니다.

    • thumbnail
      익명
      2019.09.19 17:30

      비밀댓글입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.09.19 17:35 신고

      웹브라우저에서 다음 주소를 입력하여 데이터베이스에 데이터가 입력되나 보세요..

      서버아이피주소/insert_data.php?num=3

      입력이 안된다면 방어벽 또는 서버 설정 문제로 외부에서 접속이 안되는 겁니다.

    • thumbnail
      학생1111
      2019.09.19 17:38

      웹브라우저에서는 입력이 됩니다...

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.09.19 17:41 신고

      OK, Connected to WiFi 메시지가 보이나요?

      그리고 서버가 설치된 컴퓨터가 아닌 다른 곳에서 테스트해야 합니다. 스마트폰에서 해보세요.

    • thumbnail
      학생1111
      2019.09.20 09:04

      서버는 라즈베리파이에 있고
      아두이노는 제 노트북으로 실행하고 있습니다
      같은 네트워크입니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.09.20 11:06 신고

      노트북에서 테스트시 문제 없나요? 서버에서만 접속이 가능한 경우가 있어서 그렇습니다

  8. thumbnail
    익명
    2019.10.22 00:34

    비밀댓글입니다

  9. thumbnail
    코딩e
    2019.10.22 00:42

    선생님 안녕하세요. 이 글을 보고 따라하다보니 잘 작동합니다. 감사합니다 ^^ 마지막 단계에서 막힌게 있는데.. 현재 공유기 포트포워딩도 해주고 virtualbox 브릿지 설정도 잘 해줘서 공유기로는 다 db내 데이터에 접근이 가능한데(여러 공유기로 테스트 해보았습니다), 이상하게 휴대폰 핫스팟으로 연결하면 접근이 되지 않습니다. 혹시 어떤 문제일까요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2019.10.22 11:49 신고

      핫스팟에 노트북이랑 아두이노ㅜ연결해도 잘됨니다.

      wpa2를 사용하도록 해야합니다.

  10. thumbnail
    달달한피부
    2019.10.31 22:20

    php 문을
    <?php
    $db_host = "192.168.0.xx";
    $db_user = "root";
    $db_passwd = "xxxxx1995!";
    $db_name = "test";

    // MySQL - DB ����.

    $con = mysqli_connect($db_host,$db_user,$db_passwd,$db_name);

    if (mysqli_connect_errno()){
    echo "MySQL ���� ���� : " , mysqli_connect_error();
    exit;
    } else {
    echo "DB : \"$db_name\"�� ���� ����.<br/>";

    $num=$_GET["num"];
    $sql = "INSERT INTO sensor(time,value) VALUES(now(),$num)";
    $result = mysqli_query($con, $sql);

    mysqli_close($con);

    }


    ?>
    한 후 localhost/insert_data.php 실행 해보니


    경고 : 패킷이 잘못되었습니다. 예상 0에서 1 패킷 크기 = 75을받은 C : \ XAMPP \ htdocs를 \ insert_data.php 라인에 9

    경고 : mysqli_connect을 () : MySQL의 서버에서 사라 졌는지 C : \ XAMPP \ htdocs를 \ insert_data.php 라인에 9

    경고 : mysqli_connect () : 인사말 패킷을 읽는 중 오류가 발생했습니다. 9 행의 C : \ xampp \ htdocs \ insert_data.php 에서 PID = 2224 경고 : mysqli_connect () : (HY000 / 2006) : MySQL 서버가 9 행의 C : \ xampp \ htdocs \ insert_data.php 에서 사라졌습니다 MySQL : MySQL 서버가 사라졌습니다

    나옵니다 .. 뭐가 잘못된것일까요 ㅠㅠ??

  11. thumbnail
    WEBVISITOR
    2019.11.01 02:48

    "OneWire.h"를 위한 복수개의 라이브러리가 발견되었습니다
    사용됨: C:\Users\달달한보자기\Documents\Arduino\libraries\OneWire
    "DallasTemperature.h"를 위한 복수개의 라이브러리가 발견되었습니다
    사용됨: C:\Users\달달한보자기\Documents\Arduino\libraries\dallas-temperature-control
    "ESP8266.h"를 위한 복수개의 라이브러리가 발견되었습니다
    사용됨: C:\Users\달달한보자기\Documents\Arduino\libraries\ITEADLIB_Arduino_WeeESP8266-master
    "SoftwareSerial.h"를 위한 복수개의 라이브러리가 발견되었습니다
    사용됨: C:\Users\달달한보자기\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.2\libraries\SoftwareSerial

    선생님 예제보면서 라이브러리를 추가시켰는데 이런 증상이 나옵니다 ㅠㅠ 어떻게 해결해야되는지 알려주실수 있으신가요?..

  12. thumbnail
    익명
    2019.11.23 20:54

    비밀댓글입니다

  13. thumbnail
    이민교
    2020.02.03 18:00

    db에는 데이터 값이 들어가지 않는데 방법이있나요??

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.02.03 19:09 신고

      포스트의 6번처럼 로그가 보이나 확인해서 어느 부분이 문제인지 파악해야 합니다

  14. thumbnail
    지나가는나그네
    2020.03.04 10:14

    선생님 블로그글 정말 감사합니다.
    블로그 보다가 궁금한 점이 생겨서요.
    아두이노에 조건을 달면 일정 온도 이상의 값만
    데이터 전송 가능할까요?

  15. thumbnail
    kim
    2020.04.24 01:44

    안녕하세요! 글 잘 읽고 있습니다
    궁금한 점이 있어서 댓글 남깁니다!
    제가 온도 센서 말고 DHT11 온습도 센서를 이용해보고 싶은데
    온*습도, 이 2개의 data를 받아오려면 코드의 어느 부분을 수정해서 사용해야 할까요?
    뭔가 어디를 수정해야겠다는 감이 조금 오기는 오는데 어떻게 고쳐야할지 모르겠습니다

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.04.24 04:25 신고

      dht 22를 사용해본 결과입니다. 참고하세요. dht11도 가능할듯 합니다
      https://webnautes.tistory.com/989

    • thumbnail
      kim
      2020.04.24 13:25

      Arduino Uno에서 ESP8266을 이용하여 MYSQL에 온*습도 data 넣는 과정도 또한
      위에 올려주신 아두이노 코드에서 "온도를 출력하는 함수" 부분만
      온*습도를 출력하는 함수로 대체하면 MYSQL에 온도랑 습도 다 저장이 되어지는 건가요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.04.24 19:06 신고

      MySql 컬럼도 2개로 바꾸고 sql문도 2개 저장하도록 바꿔야 합니다

    • thumbnail
      kim
      2020.04.24 22:32

      알려주셔서 감사합니다!!!
      혹시 하다가 또 모르는 부분이 있으면
      물어봐도 될까요?

    • thumbnail
      Favicon of https://webnautes.tistory.com BlogIcon webnautes
      2020.04.24 22:35 신고

      네^^

  16. thumbnail
    학생X
    2020.05.07 00:48

    안녕하세요 선생님 글 잘 읽고 있습니다
    온도 데이터를 DB에 저장하는 과정은 이해했는데
    그렇다면 온도 데이터를 DB에서 꺼내서 다른 아두이노에게 저장되어진 온도 데이터를 줄 순 없나요?
    구글링해봐도 관련 내용를 잘 못 찾겠네요
    위의 코드들을 싹다 수정해야 하는건가요?

  17. thumbnail
    익명
    2020.11.07 06:56

    비밀댓글입니다

  18. thumbnail
    Favicon of https://runseong.tistory.com BlogIcon 룬성

    좋은글 정말 감사합니다! 혹시 저처럼 FW: tcp err 이런식으로 나오시는 분들은 esp8266 펌웨어 업데이트를 하고 오면 잘 작동됩니다!

  19. thumbnail
    Favicon of https://runseong.tistory.com BlogIcon 룬성

    글 항상 잘보고 있습니다! wamp64를 통해 온습도 값을 데이터베이스에 올리는것까지 성공했습니다! 그런데 제가 이거를 응용해서 센서값을 저의 localhost 서버가 아닌 클라우드 서버의 DB로 보내고 싶습니다.

    그러기 위해서 클라우드에 php파일을 배포했고 mysql서비스와 연동해놓았습니다. 그렇다면 이제 저 아두이노 코드에서 어떤 부분을 수정해야 온습도센서의 값이 클라우드 서버의 db에 값을 올릴수 있을까요? 단순히 SERVERIP의 주소를 클라우드 주소로 하면 될까요?

    아니면 아두이노의 전체적인 코드를 수정해야하나요? 클라우드는 paas-Ta라는 정부기관 클라우드 서비스를 사용합니다

    항상 감사합니다

  20. thumbnail
    익명
    2021.09.08 19:04

    비밀댓글입니다

  21. thumbnail
    익명
    2021.09.14 16:24

    비밀댓글입니다