ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Arduino Uno에서 ESP8266을 이용하여 MYSQL에 온도값(DB18B20) 넣기
    Arduino Uno/WiFi ESP8266 2018. 10. 17. 17:52


    아두이노에 연결된 온도센서의 값을 읽어서 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을 확인해보면 데이터가 입력되는 것을 볼 수 있습니다.



    포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
    댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

    여러분의 응원으로 좋은 컨텐츠가 만들어집니다. 지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

    유튜브 구독하기


    댓글 232

    • 이전 댓글 더보기
    • 질문있습니다. 2019.04.09 21:56


      ESP8266 connect
      AT+CWJAP="아이디","비밀번호"
      OK, Connected to WiFi.
      측정중Ro: 10.09 kohm

      온도:1037'C
      LPG:0.00ppm 일산화탄소:0.00ppm SMOKE:0.00ppm

      코드를 실행했는데 여기서 멈추고 데이터를 저장하지 않습니다.
      처음에 밑에 가스 3종류는 안하고 온도만 했을때는 데이터를 보냈다는 말은 떳는데 db에는 저장이 안됐습니다. 무슨 문제인지 모르겠습니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.09 22:18 신고


        loop 함수에 있는 코드를 모두 주석처리하고 한줄씩 주석을 없애면서 문제가 되는 코드를 찾아보세요. 아마도 센서값을 읽느라 대기하는게 아닌가 싶습니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.09 22:37 신고


        네트워크 문제의 경우에는 아두이노에 연결된 USB를 뺐다가 다시 연결하면 해결됩니다.

      • 질문있습니다. 2019.04.09 22:44


        ESP8266 connect
        AT+CWJAP="U+Net33E7","1000007792"
        OK, Connected to WiFi.
        Ro: 11.25 kohm
        AT+CIPSTART="TCP","192.168.219.160",80

        루푸문을 전부 주석처리한후에는 이렇게 뜨고 여전히 db로 데이터는 들어가지 않고있습니다. 코드 자체에는 문제가없는데 왜 안되는걸까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.09 22:54 신고


        PC의 웹브라우저에서 다음처럼 해서 데이터가 입력되는지 테스트 해보세요...
        ?로 구분하여 추가한 컬럼개수 만큼 입력하면 됩니다.

        localhost/insert_data.php?num1=20?num2=20?num3=20

      • 질문있습니다. 2019.04.09 22:54


        테이블 명을 te,lpg,co,smoke로 했으면 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);
        ?>
        위 코드를 수정해야 하나요? 수정해야하면 어떻게 하면 되나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.09 23:07 신고


        다음 처럼 수정하고 웹브라우저에서 위에서 언급한데로 테스트해서 데이터베이스에 입력이 되는지 확인하세요.


        $te = $_GET["te"];
        $lpg = $_GET["lpg"];
        $co = $_GET["co"];
        $smoke = $_GET["smoke"];


        $sql = "insert into db.data(num, lpg, co, smoke) values($num, $lpg, $co, $smoke)";


      • 질문있습니다. 2019.04.09 23:29


        php파일 수정하고나서 다시 실행했더니
        ESP8266 connect
        AT+CWJAP="U+Net33E7","1000007792"
        OK, Connected to WiFi.
        Ro: 11.82 kohm
        온도:1037'C
        LPG:0.00ppm CO:0.00ppm SMOKE:0.00ppm
        AT+CIPSTART="TCP","192.168.219.160",80
        GET /insert_data.php?te=1037.&lpg=40g=0.00&co=0.00&smoke=0이렇게 나오고 여전히 db에는 저장이 안됩니다.
        또 http://localhost/insert_data.php?te=20?lpg=20?co=20?smoke=20여기에 들어가보니
        Notice: Undefined index: lpg in C:\wamp64\www\insert_data.php on line 10이런말들이 lpg co smoke에 각각 떠있습니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.10 07:42 신고


        다음 코드에서 빈칸을 제거해보세요
        $te = $_GET["te"];
        $lpg = $_GET["lpg"];
        $co = $_GET["co"];
        $smoke = $_GET["smoke"];

        아래처럼
        $te=$_GET["te"];
        $lpg=$_GET["lpg"];
        $co=$_GET["co"];
        $smoke=$_GET["smoke"];

    • 2019.05.02 20:00


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.02 21:28 신고


        웹브라우저에서 php 파일이 문제 없이 동작하는지 먼저 테스트해보세요

      • 조언구합니다.. 2019.05.06 02:07


        웹에서 data.php로 값을 넣어봤지만 db에는 안들어갑니다.. 혹시 소스에 php관련부분에 문제가 있을까요? php코드도 추가로 올리겠습니다.

      • 2019.05.06 02:12


        비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.06 18:47 신고


        다음줄을 삭제하고 진행해보세요

        $name=$_GET['lati'],$_GET['longti'];

      • 조언구합니다.. 2019.05.07 13:46


        그부분을 삭제하고
        localhost/insert_data.php?lati=20.222?longti=30.333 동작시켜봤는데 db에는 들어가는게 확인이 안됩니다.. 무엇이 문제일까요? 참고로 위경도 lati, longti모두 decimal입니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.07 14:16 신고


        아래처럼 변수가 2개 이상일때 ? 가 아니라 &를 사용해야 합니다.

        localhost/insert_data.php?lati=20.222&longti=30.333

      • 조언구합니다.. 2019.05.07 14:58



        감사합니다. php를 처음 접해봐서 기본적인 오류에도 며칠이 걸리네요.. 덕분에 db에 잘 얹어집니다! 혹시 선생님께서 보실 때 아두이노 코드의 흐름에는 큰 문제가 없나요? 흐름때문에 db에 위경도값이 안올라가는거면 다시 조정해보려합니다. 바쁘실텐데 질문 답해주셔서 너무 감사드리고있습니다!

        +이 부분이 서버에 보내는부분이라 고쳐져야할 것 같은데 조언 부탁드립니다..

        String Sgps(gps.location.lat(),gps.location.lng());
        cmd = "GET /insert_data.php?lati="+Sgps+"\r\n";
        esp8266.print("AT+CIPSEND=");
        esp8266.println(cmd.length());

        Serial.println(cmd);

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.07 16:39 신고


        php에선 두 개를 디비에 전송하는데 아두이노에선 한개만 전송하네요

      • 조언구합니다.. 2019.05.07 17:30


        네. 그 부분 수정하였습니다. 감사합니다. 혹시 제가 mysql에서 decimal형을 써서 아두이노 코드에서 float나 double형을 써야할 것 같은데 형이 잘못되었다고 오류가 납니다. float, double등으로 변수를 선언하고싶은데 어떻게 해야할까요?

        double lat = gps.location.lat();
        double lng = gps.location.lng();

        String Sgps(gps.location.lat(),gps.location.lng());

        cmd = "GET /insert_data.php?lati='"+lat+"'&longti='"+lng+"'\n\r"; //여기서 오류가 invalid operands of types 'const char [28]' and 'double' to binary 'operator+' 라고 납니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.07 17:49 신고


        PHP코드에 데이터 전송시 문자열로 변환해서 보내야 합니다.

        cmd 변수에 문자열 조합을 대입하는 거라 그렇습니다.


        cmd = "GET /insert_data.php?lati='"+lat+"'&longti='"+lng+"'\n\r";

      • 조언구합니다.. 2019.05.07 19:04


        char lat[10], lng[10];
        dtostrf(gps.location.lat(),9,4,lat);
        dtostrf(gps.location.lng(),9,4,lng);

        cmd = "GET /insert_data.php?lati='"+lat+"'&longti='"+lng+"'\n\r";

        혹은 _______________________________

        double lat = gps.location.lat();
        double lng = gps.location.lng();
        String Sgps;
        Sgps += String(gps.location.lat(), 6);
        Sgps += String(gps.location.lng(), 6);

        cmd = "GET /insert_data.php?lati='"+lat+"'&longti='"+lng+"'\n\r";

        이런식으로 두가지 방법을 다 시도해보았으나 같은 오류
        (invalid operands of types 'const char [28]' and 'double' to binary 'operator+')가 납니다. 너무 많이 여쭤본것같아 최대한 질문을 자제해보려 했는데 막혀서 나아가질 않네요.. 부탁드리겠습니다 ㅜㅜ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.07 19:10 신고


        포스트처럼 floatToString를 사용해보세요

      • 조언구합니다.. 2019.05.07 20:19


        temp를 lat,lng두개로 수정하면 되나요??
        비록 아직 해결은 안됐지만 질문하고 수정하며 덕분에 많이 배워가고있습니다. 정말 감사합니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.07 20:44 신고


        알려드린 함수를 사용하여 각각 문자열로 만들면 됩니다.

      • 조언구합니다.. 2019.05.09 17:25


        감사합니다 ^^ 하나만 더 여쭙겠습니다.
        floattostring함수에서의 'temp'와 선생님께서 사용하신 String cmd에 들어있는 'temp'가 다른변수일까요? temp가 온도라는 뜻인지 그냥 단순히 변수명인지 궁금합니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.09 17:40 신고


        다른변수입니다. 임시로 붙인 이름입니다.

    • 학생3 2019.05.10 20:21


      안녕하세요 ! 블로그 보면서 많이 도움 받은 학생입니다! 아두이노 우노 보드와 로라 쉴드를 사용하고 있는데요..
      DB 접근에 오류가 생겨 조언 구하고자 댓글남깁니다ㅠㅠ php url에서 직접 값을 입력하면 DB에 값이 저장되고
      아두이노 시리얼모니터에서도
      AT+CIPSTART="TCP","서버IP",80
      GET /php/newfile.php?rate=3
      다음과 같이 잘 뜨는데 DB에 들어가보면 값이 안들어와 있어요ㅠㅠ
      httpd.conf파일에서 Require all granted 설정후 아파치 restart도 했는데 해결이 안되네요....
      코드 올릴게요, 조언부탁드려요..!
      -----------------------------------------------------------------------------------------------------------------------
      //0508 PING
      //PING 코드 - wifi 연결ne
      #include <SoftwareSerial.h>
      #include "SNIPE.h"
      #include <SPI.h>
      #include <Client.h>
      #include "ESP8266.h"

      #define ATSerial Serial

      #define SSID ""
      #define PASSWORD ""
      #define HOST_NAME ""

      SoftwareSerial mySerial(2,3); // RX:D2, TX:D3 wifi
      ESP8266 wifi(mySerial);

      bool isConnected=false;
      //16byte hex key
      String lora_app_key = "11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 00";


      SNIPE SNIPE(ATSerial);
      float distance;
      String Buffer,rate; //실수-문자열 변환

      void setup() {
      ATSerial.begin(115200);
      //Serial.begin(115200);
      mySerial.begin(9600);
      Serial.print("setup begin\r\n");

      boolean connected=false;
      for(int i=0;i<10;i++)
      {
      if(connectWiFi())
      {
      connected = true;
      break;
      }
      }
      mySerial.println("AT+CIPMUX=0");

      // put your setup code here, to run once:
      while(ATSerial.read()>= 0) {}
      while(!ATSerial);


      /* SNIPE LoRa Initialization */
      if (!SNIPE.lora_init()) {
      Serial.println("SNIPE LoRa Initialization Fail!");
      while (1);
      }

      /* SNIPE LoRa Set Appkey */
      if (!SNIPE.lora_setAppKey(lora_app_key)) {
      Serial.println("SNIPE LoRa app key value has not been changed");
      }

      /* SNIPE LoRa Set Frequency */
      if (!SNIPE.lora_setFreq(LORA_CH_1)) {
      Serial.println("SNIPE LoRa Frequency value has not been changed");
      }

      /* SNIPE LoRa Set Spreading Factor */
      if (!SNIPE.lora_setSf(LORA_SF_7)) {
      Serial.println("SNIPE LoRa Sf value has not been changed");
      }


      if (!SNIPE.lora_setRxtout(5000)) {
      Serial.println("SNIPE LoRa Rx Timout value has not been changed");
      }

      Serial.println("SNIPE LoRa Ping Test");

      }

      void loop() {


      Buffer=SNIPE.lora_recv();
      Serial.println("Pingtest");
      Serial.print("distance : ");
      Serial.println(Buffer);


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

      cmd = "GET /php/newfile.php?rate="+Buffer+"\r\n";
      mySerial.print("AT+CIPSEND=");
      mySerial.println(cmd.length());
      Serial.println(cmd);

      mySerial.print(cmd);
      delay(2000);
      while (Serial.available())
      {
      char c = Serial.read();
      mySerial.write(c);
      if(c=='\r') mySerial.print('\n');
      }
      delay(2000);

      }


      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;
      }
      }

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.10 20:58 신고


        다음 6번 내용처럼 출력되나요?

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


      • 학생3 2019.05.10 21:25


        네 공유기 접속 성공 뜹니다ㅠㅠ 데이터베이스에 저장이 안됩니다...

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.10 21:47 신고


        혹시 윈도우에 wamp를 설치해서 서버를 구축했다면 다음 경로에 있는 로그파일들을 모두 열어서 어떤 에러때문에 안되는지 확인해보세요.

        C:\wamp64\logs

      • 학생3 2019.05.10 22:12


        아래와 같은 로그파일이 있습니다. 혹시 어떤게 문제일까요?
        =========================
        access.log파일
        ::1 - - [10/May/2019:22:00:18 +0900] "GET /php/newfile.php HTTP/1.1" 200 24
        ::1 - - [10/May/2019:22:00:19 +0900] "GET /favicon.ico HTTP/1.1" 200 1150
        ::1 - - [10/May/2019:22:00:21 +0900] "GET /php/newfile.php HTTP/1.1" 200 24
        ::1 - - [10/May/2019:22:00:22 +0900] "GET /favicon.ico HTTP/1.1" 200 1150
        [10/May/2019:22:00:23 +0900] "GET /phpmyadmin/sql.php?db=test&table=waterlever&pos=0 HTTP/1.1" 200 10831
        [10/May/2019:22:00:27 +0900] "GET /phpmyadmin/phpmyadmin.css.php?nocache=6211819177ltr&server=1 HTTP/1.1" 200 20760
        [10/May/2019:22:00:27 +0900] "POST /phpmyadmin/ajax.php HTTP/1.1" 200 1511
        [10/May/2019:22:00:30 +0900] "POST /phpmyadmin/navigation.php?ajax_request=1 HTTP/1.1" 200 2476
        [10/May/2019:22:00:30 +0900] "POST /phpmyadmin/ajax.php HTTP/1.1" 200 1608
        [10/May/2019:22:00:34 +0900] "GET /phpmyadmin/favicon.ico HTTP/1.1" 200 22486
        [10/May/2019:22:00:34 +0900] "POST /phpmyadmin/ajax.php HTTP/1.1" 200 1502
        [10/May/2019:22:00:34 +0900] "GET /phpmyadmin/index.php?ajax_request=1&recent_table=1&no_debug=true&_nocache=1557493234459445605&token=Wr%23D0%26Z%24gl~xx3E3 HTTP/1.1" 200 1559
        =========================
        error.log 파일
        [Fri May 10 22:00:02.776509 2019] [ssl:warn] [pid 2796:tid 596] AH01909: localhost:443:0 server certificate does NOT include an ID which matches the server name
        [Fri May 10 22:00:03.024845 2019] [ssl:warn] [pid 2796:tid 596] AH01909: localhost:443:0 server certificate does NOT include an ID which matches the server name
        [Fri May 10 22:00:03.096655 2019] [mpm_winnt:notice] [pid 2796:tid 596] AH00354: Child: Starting 64 worker threads.
        [Fri May 10 22:00:19.392167 2019] [php7:notice] [pid 2796:tid 1252] [client ::1:49332] PHP Notice: Undefined index: rate in C:\\Bitnami\\wampstack-7.1.29-0\\apache2\\htdocs\\php\\newfile.php on line 13
        [Fri May 10 22:00:22.574657 2019] [php7:notice] [pid 2796:tid 1252] [client ::1:49332] PHP Notice: Undefined index: rate in C:\\Bitnami\\wampstack-7.1.29-0\\apache2\\htdocs\\php\\newfile.php on line 13

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.10 22:42 신고


        200이라고 보이는것을 보니 에러가 난것 처럼 보이지는 않네요..

        아래 코드처럼 Buffer대신에 임의의 값을 넣어서 DB에 들어가나 테스트해보세요..

        cmd = "GET /php/newfile.php?rate=3\r\n";

      • 학생3 2019.05.12 14:23


        지금 다시 구동시켜봤는데 아두이노 코드에서 직접
        cmd = "GET /php/newfile.php?rate=3\r\n";
        이렇게 해놓고 실행시켜봐도 DB에 값이 안들어가네요ㅠㅠ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.12 14:42 신고


        에러메시지를 다시보니 13번째 줄에서 정의되지 않은 변수를 참조하는가봅니다. 확인해보세요

      • 학생3 2019.05.12 14:46


        Software Serial을 두개를 사용해서 에러가 나나 싶어 위의 코드를 다시 수정해서 올렸습니다.... 여전히 DB엔 값이 안들어가네요ㅠㅠㅠ제발 도움 부탁드려요...

      • 학생3 2019.05.12 14:46


        헉 벌써 댓글 달아주셨군요! 바로확인해 보겠습니다!!

      • 학생3 2019.05.12 17:31


        connect timeout이 지속적으로 뜨면서 디비에 저장이 안됩니다 혹시 이문제를 해결할 수 있을까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.12 17:38 신고


        아래 글을 다시해보세요

        https://webnautes.tistory.com/755

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.16 22:12 신고


        원인을 찾은 듯합니다.
        다음 두가지를 모두 검토해보세요.


        1. 다음 포스트와 핀 연결이 달라서 문제일 수 있습니다.

        Arduino Uno에 ESP8266 WiFi 모듈을 연결하여 사용하는 방법
        http://webnautes.tistory.com/755

        실제 핀 연결을 한번 더 확인하고 수정하세요.

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



        2. 윈도우 10 업데이트 후.. 기존 방법으로 외부 연결이 안됩니다.
        방어벽을 해제해야 동작합니다.


    • 학생43 2019.05.12 15:12


      안녕하세요.
      제가 구축한 웹서버에서 php를 통해 echo "1"을 출력하고 어디선가 이 php를 실행해서 1이 뜨게되면
      아두이노에서 제 서버에서 1을 읽어서 led를 키던 크던 하려고 하는데 아두이노에서
      제 서버로 연결을 어떻게 해야할까요? 위 코드에 따로 서버에 연결을 시도하는 부분을 못 찾겠네요..

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.12 15:18 신고


        cmd="GET 이후부터 있는 코드입니다.

      • 학생43 2019.05.12 16:36


        감사합니다.
        혹시 와이파이 모듈이 아닌 와이파이 쉴드를 사용한다면 크게 달라질 부분이 있을까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.12 16:38 신고


        esp8266 계열일 경우에만 수정없이 사용할 수 있습니다. 아니라면 해당 와이파이 모듈을 위한 라이브러리를 사용해야 합니다.

      • 학생43 2019.05.12 18:29


        제가 지금 하려는게 App에서 특정 버튼을 누르면 웹서버를 통해 DB를 체크하고 Ok면
        아두이노의 LED를 키는게 목표인데..
        지금 App을 통해 특정 버튼을 누르면 DB체크 후 1을 출력해 App에서 1을 인식하면 App에서 성공! 이라고 띄우는 것 까지 했습니다.
        이젠 이 1을 아두이노에서 인식해서 LED를 On해야 하는데 어떤 식으로 통신이 되어야 할까요..?
        아직 아두이노가 어떻게 동작하고 통신하는지 이해가 잘 가지 않습니다..
        아두이노는 연결대기를 하고있는 상태에서 제 서버에서 아두이노로 값을 보내면 그 때 연결이 되면서 값을 읽어와서 그 값이 1이면 led on을 하도록 하는 코드를 작성하면 되는 건가요?
        이렇게 되면 제 서버가 클라이언트가 되고 아두이노가 서버가 되는 것인지.. 제가 이해한 것이 맞는지 궁금합니다.

      • 학생43 2019.05.12 18:32


        위 내용이 맞다면 제 서버의 php에서 아두이노의 웹서버 ip주소로 접속을 하도록 해야 하는 것인가요..?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.12 19:24 신고


        데이터베이스 없이 앱에서 바로 아두이노로 만든 TCP서버에 접속해서 LED를 제어해도 될듯합니다.

        데이터베이스를 둔다면
        앱에서 데이터베이스의 테이블의 특정 컬럼에 on을 입력하고
        아두이노에서는 특정 컬럼값이 on으로 바뀌었는지 체크하기 위해 정기적으로 데이터베이스에 접속해서 확인해야 합니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.12 19:31 신고


        데이터베이스가 있는 경우 다른 방법은 서버에 프로그램을 하나 계속 실행시켜서 데이터베이스에 on이 입력되면 아두이노에게 신호를 보내 LED를 켜게 하는 겁니다

      • 학생43 2019.05.12 21:26


        감사합니다.. 계속 질문해서 죄송합니다ㅜ
        그런데 꼭 DB에 on을 추가해서 체크해야 하나요?
        DB에 굳이 추가하지 않고 어차피 App에서 버튼 누르면 웹서버에서 DB체크 하는 쿼리문 실행 후 led on을 원하면 웹서버에서 간단하게 1을 출력하게 되는데 이 1을 아두이노에게 전달해 아두이노에서 받아서 led를 키도록 하게는 불가능한가요..?

        그리고 서버에서 프로그램을 하나 계속 실행시키라는 말씀은 주기적으로 서버에서 서버 상태 확인해서 상태 변화시 아두이노에게 신호를 보내는 php문을 실행하는 프로그램을 만들라는 말씀이신건가요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.12 21:37 신고


        데이터베이스 값 변화로 LED를 켜는 두가지 방법이 있을듯합니다.


        1. 웹서버가 있는 PC에서 데이터베이스의 값이 변경된 경우를 체크하여 아두이노에게 LED를 켜라고 하는 것입니다.

        이 경우 데이터베이스의 값을 감시하다가 변경된 경우 아두이노에게 LED를 켜라고 알려주는 프로그램이 PC에 있어야 할듯합니다.
        어떤 언어로 만들던 이런 역활을 하기만 하면됩니다.


        2. 아두이노에서 데이터베이스의 값이 변경되는지를 감시하다가 바뀐것을 알게되면 LED를 켜는 것입니다.

      • 학생43 2019.05.12 22:02


        감사합니다..! 주기를 엄청 짧게 해도 되죠..? (1~2초 단위 정도로..)

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.12 22:48 신고


        데이터베이스에서 감시할 데이터 개수와 제어할 아두이노 개수가 많지 않다면 1초로 해도 됩니다.

      • 학생43 2019.05.12 22:50


        감사합니다. 좋은 밤 되세요 ㅎㅎ 나중에 궁금한 점 생기면 또 여쭤보겠습니다!!

      • 학생43 2019.05.13 23:40


        와이파이모듈 esp8266을 사려고 하는데
        보니까 검정색이랑 파란색(esp-01) 있던데
        아무거나 사도 되나요..? 어떤거 사용하시는지 궁금합니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.14 10:20 신고


        아무런 표기가 안되어 있어

        찾아보니

        esp-01인듯 싶습니다.

      • 학생43 2019.05.18 20:24


        안녕하세요.
        ESP8266 와이파이 모듈도 구매하였고
        말씀하신대로 DB에 칼럼 하나 추가하고
        그 칼럼을 실시간으로 체크하여 바뀔때마다 터미널에 일단은 그냥 문자열을 출력하도록 하는 프로그램(c++)을 만들었습니다.
        이제 이 문자열 출력대신 아두이노로 뭔가 LED켜라는 신호를 보내야 하는데 아두이노에서 어떻게 받아야할지 모르겠습니다..
        아두이노에서 신호를 받으려면 아두이노에서 서버를 만들어서 받아야 하는건지 클라이언트를 만들어서 전달 받아야 하는지..
        일단 아두이노와 esp8266 정상적으로 연결되고 공유기(wifi) 접속된 상태까지는 확인한 상태입니다..
        서버에서 값 1을 전송하면 아두이노에서 받아서 1을 시리얼 모니터에 띄우던가만 성공해도 쉽게 할 수 있을거 같은데 이게 너무어렵네요 예제를 찾아봐도 제가 적용을 잘 못한건지 안되고 ㅜㅜ


      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.18 23:21 신고


        다음 포스트의 아두이노 코드를 참고하면 될듯합니다.

        https://webnautes.tistory.com/755

    • 2019.05.16 19:14


      비밀댓글입니다

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.16 22:15 신고


        원인을 찾은 듯합니다.
        다음 두가지를 모두 검토해보세요.


        1. 다음 포스트와 핀 연결이 달라서 문제일 수 있습니다.

        Arduino Uno에 ESP8266 WiFi 모듈을 연결하여 사용하는 방법
        http://webnautes.tistory.com/755

        실제 핀 연결을 한번 더 확인하고 수정하세요.

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


        2. 윈도우 10 업데이트 후.. 기존 방법으로 외부 연결이 안됩니다.
        방어벽을 해제해야 동작합니다.


        질문하신 것은..

        1. 위에서 언급한 두가지를 모두 살펴보면 해결될 듯합니다.

        2. 밎습니다. 폴더 안에 넣으면 됩니다.

        3. 웹에서 사용하는 방식으로 접근하기 때문입니다.

        4. 소수점 없는 문자열로 보내면 정수로 저장될겁니다.


      • 코드22 2019.05.21 15:51


        감사합니다. 두가지 모두 검토해서 rx,tx핀도 본문과 같이 바꿨고, windos상에서 방화벽도 해제했습니다. 죄송하게도... 아직 값이 안들어가는데 제가 에러로그를 살펴보니 아래 오류 부분이 문젠것같습니다.
        _____________________________________
        [Tue May 21 15:41:30.860322 2019] [mpm_prefork:notice] [pid 3470] AH00163: Apache/2.4.29 (Ubuntu) configured -- resuming normal operations
        [Tue May 21 15:41:30.860413 2019] [core:notice] [pid 3470] AH00094: Command line: '/usr/sbin/apache2'

        이 부분을 apache2 -t 해봤을 때 구문오류로 apache2.conf파일의 'DefaultRuntimeDir'이 유효한 디렉토리여야하고 serverroot와 연관성있어야한다는데 어떤식으로 바꿔야할지 모르겠습니다.
        현재는 'DefaultRuntimeDir ${APACHE_RUN_DIR}' 라고 되어있습니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.21 17:17 신고


        아파치웹서버를 스마트폰으로 접근시 문제 없나 확인해보세요. 같은 공유기를 사용한상태에서요

      • 코드22 2019.05.21 17:36


        같은 공유기에 연결했는데 스마트폰으로는 값 입력이 안됩니다. 서버에 접속을 못하나봅니다..ㅠㅠ 문제가 무엇일까요.....?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.21 17:45 신고


        다음 포스트의 17번 보고 80번 포트를 열고 테스트해보세요..

        https://webnautes.tistory.com/1206

      • 코드22 2019.05.21 20:35


        포스팅대로 80번 포트 열고 스마트폰에서 진행해보았지만 접근이 안됩니다.. mysql과 apache2모두 외부접속 허용으로 해두었는데 음 .. 제가 지금 사용하는 공유기가 '게스트 또는 공용 네트워크'로 나타나는데 이것이 문제가 될까요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.21 20:51 신고


        그것도 원인이 됩니다.

        개인 네트워크로 변경해보세요..

        참고로 80번 포트 여는 방법 소개했던 포스트에도 개인 네트워크로 바꾸는 방법이 나와있습니다.

      • 코드22 2019.05.23 02:39


        드디어 됐네요!!!!!ㅠㅠㅠㅠㅠ 너무 감사드립니다. 알고보니 php코드를 손봤는데 그게 문제가 되어 접근을 못한거였어요. 친절하게 답변해주셔서 너무 감사드려요. 앞으로 하시는 일 다 잘되시길 바랍니다!

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.23 08:10 신고


        감사합니다 : )

    • 학생B 2019.05.20 15:53


      안녕하세요. 항상 잘보고 있습니다 . 현재 포트는 RX:D0, TX:D1 로 해 놓은 상태이고 그 외의 변경점은 없습니다.
      지금 와이파이를 이용하여 db에 접속시키려고 하는데 와이파이가 연결되지 않고 Can not connect to the WiFi 만 나오고 있습니다.
      어떤 부분에서 고쳐야 할 지 알 수 있을까요?

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

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


      #define SSID "olleh_WiFi_AF96"

      #define PASSWORD "0000008238"

      #define SERVERIP "59.0.194.34"




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

      SoftwareSerial mySerial(0, 1); /* 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?moisture_level="+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;
      }
      }

    • 영원 2019.05.29 20:36


      올려주신 것을 기반으로 오류나는 것들은 빼고 우선 와이파이에 연결하는 것 까지는 성공했습니다.
      윈도우용 wampserver을 설치했으며,
      백신프로그램에서 방화벽도 관리하길래 설정 들어가서 아파치 http 서버 프로그램도 허용해놓고,
      개인 네트워크로 설정해둔 상태입니다.
      웹 브라우저에서 테스트 해보면 DB로 잘 넘어가는데 문제는 시리얼 모니터상에서는 계속 php 파일에 접근을 못하고 있습니다. 혹시나 해서 dust=40 이런 식으로 아두이노 코딩 시에 바로 값을 넣어서 보내게끔 해봤는데도 동일하구요.
      지금 보내려는 값은 int형 dusty입니다. get 형식이 문자열 형식으로 받는거는 알겠는데 이것을 어떻게 적용해야 할 지를 모르겠네요.

      #include <Wire.h>
      #include <SoftwareSerial.h>
      #include <doxygen.h>
      #include "ESP8266.h"
      #include <string.h>
      SoftwareSerial mySerial(6,5);
      #define SSID "ASUS"

      #define PASSWORD "kp960531"

      #define SERVERIP "192.168.0.31"

      float previous_dustDensity = 0;
      float alpha = 0.8; // 깨끗한 상태의 측정 전압(기준)
      float fanSpeed = 0; //
      float fanPWM = 3; // Pin D3 팬의 PWM 센서에 연결
      int fanSensor = 8; // Pin D8 팬의 RPM 센서에 연결

      int Speed = 0; //0부터 255까지 속도 지정.

      unsigned long SensorPulsTijd;
      int measurePin = 0; //먼지 센서의 센서를 아두이노 A0핀에 연결
      int ledPower = 2; // 먼지 센서의 LED를 아두이노 D2 핀에 연결
      int pm50_pin = 10; // 노랑 LED - PM 50 이하 OK
      int pm70_pin = 11; // 빨강 LED - PM 70 이상 경고

      int samplingTime = 280;
      int deltaTime = 40;
      int sleepTime = 9680;

      float voMeasured = 0;
      float calcVoltage = 0;
      float dustDensity = 0;
      float average_dustDensity = 0;
      float previousDensity = 0.0;
      int num = 50; //샘플수
      float sum = 0.0;
      float D[] = {
      0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0, 0.0, 0.0,0.0,
      0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0, 0.0, 0.0,0.0,
      0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0, 0.0, 0.0,0.0,
      0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0, 0.0, 0.0,0.0,
      0.0, 0.0, 0.0, 0.0, 0.0,0.0, 0.0, 0.0, 0.0,0.0
      };

      void setup(){
      Serial.begin(9600);
      pinMode(ledPower,OUTPUT);// 미세먼지 센서 내부 LED
      pinMode(pm50_pin, OUTPUT);digitalWrite(pm50_pin,LOW); //PM50 LED
      pinMode(pm70_pin, OUTPUT);digitalWrite(pm70_pin,LOW); //PM70 이상 LED
      pinMode(fanSensor, INPUT);
      pinMode(fanSpeed, INPUT);
      digitalWrite(fanSensor, HIGH);

      Serial.setTimeout(5000);
      mySerial.begin(9600);
      Serial.println("ESP8266 connect");
      }


      void loop() {

      D[num-1] = particleSensing();
      for ( int i = 0; i<num; i++ ) {
      D[i] = D[i+1];
      sum = sum + D[i];
      }
      average_dustDensity = sum/num;


      int dnsty = alpha*previousDensity + (1.0-alpha)*average_dustDensity;

      if( dnsty <= 50 ) {digitalWrite(pm70_pin, LOW);digitalWrite(pm50_pin, HIGH);delay(50);analogWrite(3, Speed=100);}
      if( dnsty >= 70 ) {digitalWrite(pm50_pin, LOW);digitalWrite(pm70_pin, HIGH);delay(50);analogWrite(3, Speed=185);}
      if( dnsty >= 90 ) {digitalWrite(pm50_pin, HIGH);digitalWrite(pm70_pin, LOW);delay(50);analogWrite(3, Speed=255);}



      sum = 0.0;
      previousDensity = average_dustDensity;

      Serial.print("dust_level: ");
      Serial.println((int)dnsty);

      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];
      cmd = "GET /test.php?dust=50\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);

      }


      float particleSensing() {

      digitalWrite(ledPower,LOW); // power on the LED
      delayMicroseconds(samplingTime);
      voMeasured = analogRead(measurePin);
      delayMicroseconds(deltaTime);
      digitalWrite(ledPower,HIGH); // turn the LED off
      delayMicroseconds(sleepTime);

      calcVoltage = voMeasured * (5.0 / 1024.0);
      if( calcVoltage > 0.6 ) {
      dustDensity =1000.0*( 0.172 * calcVoltage - 0.1);
      delay(190);
      }
      return dustDensity;
      }

      boolean connectWiFi()
      {

      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;
      }
      }

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.29 20:52 신고


        웹서버가 설치된 PC가 아닌 다른 PC나 모바일에 있는 웹브라우저에서 문제없나 테스트해보세요..

        문제가 생긴다면 방어벽에서 80번 포트를 열어주면 될듯합니다.

      • 영원 2019.05.29 22:27


        설정 변경해서 일단 모바일에서는 접속 되는 것을 확인했습니다.

        근데 아두이노에서는 여전히 데이터가 안넘어가고 있네요..

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.29 22:40 신고


        아두이노 IDE의 시리얼 모니터의 로그가 어떻게 출력되나요?

        아파치의 로그도 확인해 볼 필요가 있습니다.

      • 영원 2019.05.29 22:57


        말씀해주신 부분을 확인해봤는데..
        로그 상에서 보니 공유기에는 0.15로 잡혀있는데 아파치 로그내에는 없구요. 계속 모니터 상에는 connent timeout만 뜨고있는 상황입니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.29 23:45 신고


        C:\wamp64\logs에 있는 로그에 기록이 남아있지 않다면 아파치 웹서버에 접속이 안되는듯합니다. 다음 코드로 테스트해보세요..

        #include <string.h>

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


        #define SSID "SSID"
        #define PASSWORD "비밀번호"
        #define SERVERIP "아이피주소"


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



        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");
        ///////////////////////////////////////////////////////////////////////////

        }


        // 온도를 출력하는 함수
        void printTemperature()
        {

        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];

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

        Serial.println(cmd);

        while (Serial.available())
        {
        char c = Serial.read();
        mySerial.write(c);
        if(c=='\r') mySerial.print('\n');
        }

        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...");


        //센서에서 읽어온 온도를 출력
        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;
        }
        }

      • 영원 2019.05.30 08:02


        늦은 밤 답변 감사합니다..
        모듈에 이상있나 싶어서 AT 커맨드로 테스트 해봤더니 바보같이 TX RX를 바꿔서 연결했었네요.
        단순히 dust=30 하니까 잘 들어가는데
        이제 그걸 dust=dusty로 바꾸니까 이제는 TCP connect error 오류가 출력되고 값이 안넘어갑니다.

        보내려는 값 dusty는 정수형 int로 선언되어 있습니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.30 08:06 신고


        dusty가 문자열 이어야 하는데 맞나요?

      • 영원 2019.05.30 08:09


        int dnsty = alpha*previousDensity + (1.0-alpha)*average_dustDensity;

        if( dnsty <= 50 ) {digitalWrite(pm70_pin, LOW);digitalWrite(pm50_pin, HIGH);delay(50);analogWrite(3, Speed=100);}
        if( dnsty >= 70 ) {digitalWrite(pm50_pin, LOW);digitalWrite(pm70_pin, HIGH);delay(50);analogWrite(3, Speed=185);}
        if( dnsty >= 90 ) {digitalWrite(pm50_pin, HIGH);digitalWrite(pm70_pin, LOW);delay(50);analogWrite(3, Speed=255);}



        sum = 0.0;
        previousDensity = average_dustDensity;

        Serial.print("dust_level: ");
        Serial.println((int)dnsty);

        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;
        }



        cmd = "GET /test.php?dust='dusty'\r\n";
        mySerial.print("AT+CIPSEND=");
        mySerial.println(cmd.length());

        아뇨..int형으로 되어있습니다.
        이걸 string형으로 바꿀려면 어떻게 해야할까요..?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.30 08:12 신고


      다음 링크를 참고하세요

      https://stackoverflow.com/questions/7910339/how-to-convert-int-to-string-on-arduino

      • 영원 2019.05.30 08:27


        해결했습니다.
        String sdnsty = String(dnsty)로 하니까 형변환도 되고 시리얼 모니터 상과 DB 상에서도 잘 들어갑니다.

        기초적인 걸로 귀찮게 해드린 것 같아 죄송스럽네요.
        답변 달아주셔서 감사합니다.

        좋은 하루 되시길 바랍니다.

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.30 08:36 신고


        감사합니다 : ) 첨엔 똑같지요.

    • 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연결이 실패했다고만 뜨네요 ㅠ 도대체 무슨 문제일까요 ?

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


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

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

      • sdsd 2019.06.03 18:07


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

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

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

        한 가지 걸리는게 있다면 ,

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

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

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


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

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

        C:\wamp64\logs

      • sdfsd 2019.06.03 18:13


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

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


        apache_error.log를 확인해보고

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

      • ㅇㄴㅁㅇ 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포트 결과입니다..

      • ㅁㄴㅇㅇ 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.
        이게 아파치 로그입니다.

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


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

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

    • 학생입니다. 2019.06.03 20:39


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

    • hhe 2019.06.04 19:04


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

    • 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;
      }
      }

      • 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);

      • sh 2019.06.15 12:38


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

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

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


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

    • 학생2323 2019.08.21 17:46


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

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

      위에서 말씀하신

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

      ESP8266 wifi (Serial1) 을 적어주고

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

      • 학생2323 2019.08.21 17:48


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

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


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

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

        OK, Connected to WiFi

      • 학생2323 2019.08.21 18:02


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

      • 학생2323 2019.08.21 18:05


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

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


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

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

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

      • 2019.08.21 18:16


        비밀댓글입니다

      • 학생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"

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

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


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

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

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

        https://zzdd1558.tistory.com/199

      • 학생2323 2019.08.21 19:00


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

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


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

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

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


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

    • 학생1111 2019.09.19 15:22


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

      제가 여기서 궁금한점은

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

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

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

    • 2019.10.22 00:34


      비밀댓글입니다

    • 코딩e 2019.10.22 00:42


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

    • 달달한피부 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 서버가 사라졌습니다

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

    • 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

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

    • 2019.11.23 20:54


      비밀댓글입니다

    • 이민교 2020.02.03 18:00


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

Designed by Tistory.