반응형


아두이노에 연결된 온도센서의 값을 읽어서 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. 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 신고

      감사합니다 : )

  3. 학생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;
    }
    }

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.05.20 16:06 신고

      D0과 D1은 첫번째 시리얼 포트로 사용하기 때문에 사용하면 안될듯합니다..

      다른 포트로 변경해보세요.

  4. 영원 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형으로 바꿀려면 어떻게 해야할까요..?

  5. 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 신고

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

  6. 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를 선택하고 다시 아파치서버가 동작하나 보세요..

  7. 학생입니다. 2019.06.03 20:39

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

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

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

      꼭 연결해줘야 합니다.

  8. hhe 2019.06.04 19:04

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

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

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

      float tempC = sensors.getTempC(deviceAddress);

  9. 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 신고

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

  10. 학생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 신고

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

  11. 학생1111 2019.09.19 15:22

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

    제가 여기서 궁금한점은

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

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

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

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


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

    • 2019.09.19 16:40

      비밀댓글입니다

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

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

    • 2019.09.19 17:30

      비밀댓글입니다

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

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

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

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

    • 학생1111 2019.09.19 17:38

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

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

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

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

    • 학생1111 2019.09.20 09:04

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

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

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

  12. 2019.10.22 00:34

    비밀댓글입니다

  13. 코딩e 2019.10.22 00:42

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

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

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

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

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

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

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.01 01:35 신고

      에러 메시지가 한글로 되있어 무슨 에러인지 알수가.없군요

  15. 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

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

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.01 09:57 신고

      아래 링크의 댓글을 참고해보세요

      https://kocoafab.cc/fboard/view/2359

  16. 2019.11.23 20:54

    비밀댓글입니다

  17. 이민교 2020.02.03 18:00

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

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

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

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

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

  19. kim 2020.04.24 01:44

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

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

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

    • kim 2020.04.24 13:25

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

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

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

    • kim 2020.04.24 22:32

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

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

      네^^

  20. 학생X 2020.05.07 00:48

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

  21. 2020.11.07 06:56

    비밀댓글입니다

+ Recent posts