ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • arduino uno에서 ds18b20온도 센서값과 RTC(날짜,시간)값을 MYSQL에 데이터 넣기
    Arduino Uno/주변장치 연결(Peripheral) 2016. 6. 10. 01:34

    이번엔 arduino uno를 가지고 좀 복잡한 미니 프로젝트를 했습니다. 


    ds18b20 온도 센서로부터 값을 읽어오고 동시에 RTC에 저장된 날짜와 시간 데이터도 읽어옵니다. 

    그리고 나서 두 값을 ESP8266 모듈을 이용하여 MYSQL 서버에 접속하여  값들을 저장합니다. 


    그리고 마지막으로 웹상에서 그래프를 그려볼것입니다..




    mysql에 데이터베이스 및 테이블을 새로 생성합니다. 


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    mysql -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 1576
    Server version: 5.5.49-0ubuntu0.14.04.1 (Ubuntu)
     
    Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
     
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
     
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
     
    mysql> create database testdb;
    Query OK, 1 row affected (0.00 sec)
     
    mysql> use testdb;
    Database changed
    mysql> create table data(
        -> date date,
        -> time time,
        -> temperature double
        -> );
    Query OK, 0 rows affected (0.02 sec)
     
    mysql> exit
    Bye
     
    cs




    /var/www/html 위치에 run.php 파일을 작성합니다. 아래 패스워드입력 부분은 바꾸어 주셔야합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     <?php
     $result = mysql_connect("127.0.0.1""root""패스워드");
     $temperature = $_GET["temp"];
     $date = $_GET["date"];
     $time = $_GET["time"];
     $sqlt = "insert into testdb.data values ($date,$time,$temperature)";
     echo "$sqlt";
     $ret = mysql_query($sqlt);
     
    ?>
     
    cs


    이제 웹브라우저의 주소 창에 아래 주소를 입력해보면 데이터가 테이블에 입력되는 것을 확인 할 수 있습니다.

    http://localhost/run.php?temp=26.2&date="2016-06-10"&time="00:52:00"





    이번엔 아두이노 코드로 같은 일을 해보았습니다...


    센서 및 RTC, ESP8266과 아두이노 연결은 아래 글들을 참고하세요.. 설치 필요한 라이브러리도 나와있습니다.

    틀린점은 본 포스팅에서는 DS18B20의 데이터핀이 5번에 연결된다는 점입니다. 

    또하나 틀린점은 ESP8266을 위한 소프트시리얼로 6번 7번핀이 사용된다는 점입니다.



    아래 코드에서는 공유기 접속 정보와 Mysql서버 주소를 변경하셔야 합니다. 


    [Arduino/Arduino Uno] - Arduino에서 1-wire 온도센서(db18b20)로 온도 측정


    [Arduino/Arduino Uno] - arduino UNO에서 DS1302 RTC 모듈 사용하기


    [Arduino/Arduino Uno] - arduino에서 esp8266 무선 모듈 테스트






    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    364
    365
    366
    367
    #include <Time.h>
    #include <DS1302RTC.h>
    #include <OneWire.h>  
    #include <DallasTemperature.h>  
    #include <string.h>  
     
     
    //DS18B20 온도 센서의 데이터선인 가운데 핀을 아두이노 5번에 연결합니다.   
    #define ONE_WIRE_BUS 5  
        
    //1-wire 디바이스와 통신하기 위한 준비  
    OneWire oneWire(ONE_WIRE_BUS);  
        
    // oneWire선언한 것을 sensors 선언시 참조함.  
    DallasTemperature sensors(&oneWire);  
        
    //다바이스 주소를 저장할 배열 선언  
    DeviceAddress insideThermometer;
     
     
    // Set pins for DS1302 RTC:  CE(reset),IO(dat),CLK
    DS1302RTC RTC(234);
     
     
    #include <SoftwareSerial.h>  
         
    #define SSID "apple"  //공유기 SSID
    #define PASS "12345678"   //공유기 비번
    #define DST_IP "192.168.0.3"   //MYSQL 서버 주소 
    SoftwareSerial dbgSerial(67); // RX, TX 6번,7번핀 
     
     
     
     
    void setup()
    {
     
      // Setup Serial connection
      Serial.begin(9600);
     
      //ESP8266
      /////////////////////////////////////////////////////////////////////////  
      Serial.setTimeout(5000);  
      dbgSerial.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);  
        
       dbgSerial.println("AT+CIPMUX=0");  
      ///////////////////////////////////////////////////////////////////////////
     
      //ds18b20
      /////////////////////////////////////////////////////////////////////////////////////////////////////////
      //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();  
      ////////////////////////////////////////////////////////////////////////////////////////////////////////////
      
     
      //DS1302 RTC
      ///////////////////////////////////////////////////////////////////////////////////////////////////
      Serial.println("DS1302RTC Read Test");
      Serial.println("-------------------");
      
      // Activate RTC module
    //  digitalWrite(DS1302_GND_PIN, LOW);
    //  pinMode(DS1302_GND_PIN, OUTPUT);
     
    //  digitalWrite(DS1302_VCC_PIN, HIGH);
    //  pinMode(DS1302_VCC_PIN, OUTPUT);
      
      Serial.println("RTC module activated");
      Serial.println();
      delay(500);
      
      if (RTC.haltRTC()) {
        Serial.println("The DS1302 is stopped.  Please run the SetTime");
        Serial.println("example to initialize the time and begin running.");
        Serial.println();
      }
      if (!RTC.writeEN()) {
        Serial.println("The DS1302 is write protected. This normal.");
        Serial.println();
      }
     
     time_t t;
     tmElements_t tm;
     
            
      delay(5000);
     
      
      //시간을 맞춰야할때 주석을 풀어서 설정합니다..
      /*
      tm.Year =  CalendarYrToTm(2016);
      tm.Month = 6;
      tm.Day = 9;
      tm.Hour = 21;
      tm.Minute = 36;
      tm.Second = 00;
      t = makeTime(tm); 
      if(RTC.set(t) == 0) { // Success
        setTime(t);
        Serial.print("RTC set to: ");
        printDateTime(t);
        Serial.println("");
      }
      else
        Serial.println("RTC set failed!");
        */
     //////////////////////////////////////////////////////////////////////////////////////////////
    }
     
    void loop()
    {
      tmElements_t tm;
      char mdate[255],mtime[255];
      
      //현재 날짜 / 시간을 가져옴
      if (! RTC.read(tm)) {
        sprintf( mdate, "%04d-%02d-%02d",
                 tmYearToCalendar(tm.Year), tm.Month,  tm.Day);
     
       sprintf(mtime, "%02d:%02d:%02d",
                 tm.Hour, tm.Minute, tm.Second );
      } else {
        Serial.println("DS1302 read error!  Please check the circuitry.");
        Serial.println();
        delay(9000);
      }
     
      Serial.print("Requesting temperatures...");  
      sensors.requestTemperaturesByIndex(0); //첫번째 센서의 온도값 읽어옴  
      Serial.println("DONE");  
         
      //센서에서 읽어온 온도를 출력  
      float  tempC = sensors.getTempC(insideThermometer);  
          
      Serial.print("Temp C: ");  
      Serial.println(tempC); 
     
     
      //이하는 데이터베이스에 넣는 부분
     
          String cmd = "AT+CIPSTART=\"TCP\",\"";  
         cmd += DST_IP;  
         cmd += "\",80";  
         Serial.println(cmd);  
         dbgSerial.println(cmd);  
         if(dbgSerial.find("Error"))  
        {  
          Serial.println( "TCP connect error" );  
          return;  
        }  
         
      
        char test[20];  
        String temp(floatToString(test,tempC, 20));  
          
         cmd = "GET /run.php?temp='"+temp+"'&date='"+mdate+"'&time='"+mtime+"'\n\r";  
         dbgSerial.print("AT+CIPSEND=");  
         dbgSerial.println(cmd.length());  
              
           
         Serial.println(cmd);  
           
           
         if(dbgSerial.find(">"))  
         {  
           Serial.print(">");  
           }else  
           {  
             dbgSerial.println("AT+CIPCLOSE");  
             Serial.println("connect timeout");  
             delay(1000);  
             return;  
           }  
           Serial.print(cmd);
           dbgSerial.print(cmd);  
           delay(2000);  
           //Serial.find("+IPD");  
           while (Serial.available())  
           {  
             char c = Serial.read();  
             dbgSerial.write(c);  
             if(c=='\r') dbgSerial.print('\n');  
           }  
           Serial.println("===="); 
     
      
      // Wait one second before repeating :)
      delay (2000);
    }
     
        
    //디바이스 주소를 출력하는 함수  
    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 print2digits(int number) {
      if (number >= 0 && number < 10)
        Serial.write('0');
      Serial.print(number);
    }
     
     
    //print date and time to Serial
    void printDateTime(time_t t)
    {
        printDate(t);
        Serial.print(' ');
        printTime(t);
    }
     
    //print time to Serial
    void printTime(time_t t)
    {
        printI00(hour(t), ':');
        printI00(minute(t), ':');
        printI00(second(t), ' ');
    }
     
    //print date to Serial
    void printDate(time_t t)
    {
        printI00(day(t), 0);
        Serial.print(monthShortStr(month(t)));
        Serial.print(year(t));
    }
     
    //Print an integer in "00" format (with leading zero),
    //followed by a delimiter character to Serial.
    //Input value assumed to be between 0 and 99.
    void printI00(int val, char delim)
    {
        if (val < 10) Serial.print('0');
        Serial.print(val);
        if (delim > 0) Serial.print(delim);
        return;
    }
     
     
    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;  
    }  
      
    boolean connectWiFi()  
    {  
       //dbgSerial.println("AT+CWMODE=1");  
         
       String cmd="AT+CWJAP=\"";  
       cmd+=SSID;  
       cmd+="\",\"";  
       cmd+=PASS;  
       cmd+="\"";  
       dbgSerial.println(cmd);  
       Serial.println(cmd);  
       delay(3000);  
        
       if(dbgSerial.find("OK"))  
       {  
         Serial.println("OK, Connected to WiFi.");  
         return true;  
       }  
       else  
       {  
         Serial.println("Can not connect to the WiFi.");  
         return false;  
       }  
     } 
    cs



    수동으로 넣었을때처럼 데이터가 잘들어갑니다.. 



    이제 마지막으로 데이터베이스에 쌓인 데이터를 이용하여 간단한 그래프를 그려볼것입니다.


    그래프를 그리기 위해 추가로 설치해야 하는 패키지들입니다.


    sudo apt-get install php5-gd  php5-cli




    /etc/php5/apache2/conf.d/20-gd.ini 파일을 열어서


    앞에  세미콜론이 있으면 아래처럼 ; 제거합니다.


    ; configuration for php GD module

    priority=20

    extension=gd.so



    아파치 서버를 재시작합니다.


    sudo /etc/init.d/apache2 restart




    http://www.pchart.net/download 에서 라이브러리를 다운로드 받아서 웹서버의 루트 디렉토리로 옮깁니다.


    wget http://www.pchart.net/release/pChart2.1.4.tar.gz


    tar xvzf pChart2.1.4.tar.gz


    sudo mv pChart2.1.4 /var/www/html/pChart



    이제  그래프를 그려줄 php를 작성합니다.

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


    db접속 패스워드만 바꾸시면 동작합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
    include("pChart/class/pDraw.class.php");
    include("pChart/class/pImage.class.php");
    include("pChart/class/pData.class.php");
     
     
    $db = mysql_connect("127.0.0.1""root""패스워드입력");
    if ( $db == "" ) { echo " DB Connection error...\r\n"exit(); }
     
    mysql_select_db("testdb",$db);
     
     
     
    $Requete = "SELECT * FROM `data` order by time desc limit 30";
    $result  = mysql_query($Requete,$db);
    while ($row = mysql_fetch_array($result))
    {
       $Temperature[] = $row["temperature"];
       $DataTime[] = $row["time"];
    }
     
    $DataSet = new pData();
    $DataSet->addPoints( $Temperature"Temperature");
    $DataSet->addPoints($DataTime,"Timestamp");
     
    $DataSet->setAbscissa("Timestamp");
     
    $DataSet->setXAxisName("Time");
    $DataSet->setAxisName(0,"Temperature");
    $DataSet->setAxisUnit(0,"°C");
     
     
     
     
    $myPicture = new pImage(1024,600,$DataSet);
    $myPicture->setGraphArea(100,60,1000,500);
     
    $myPicture->setFontProperties(array("FontName"=>"pChart/fonts/verdana.ttf","FontSize"=>11));
     
     
     $scaleSettings = array("LabelRotation"=>30,
            "XMargin"=>10,"YMargin"=>10,
            "Floating"=>TRUE,"GridR"=>200,"GridG"=>200,"GridB"=>200,
            "DrawSubTicks"=>TRUE,"CycleBackground"=>TRUE );
     $myPicture->drawScale($scaleSettings);
    $myPicture->drawSplineChart();
    $myPicture->drawLegend(2000,500,array("Style"=>LEGEND_NOBORDER,"Mode"=>LEGEND_HORIZONTAL));
    $myPicture->Stroke();
    ?>
     
    cs



    실행해본 결과입니다... 날짜는 따로 출력해주면 될듯합니다.

    1초마다 Refresh(새로 고침)을 해주도록 소스코드를 고치면 실시간으로 입력되는 데이터를 연속적으로 볼 수있습니다.. 





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

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

    유튜브 구독하기


    댓글 30

    • double형 값을 넘겨줘야하는데.. 2017.04.06 19:12


      아두이노에서 float형 변수를 위에나온 floatToString를 이용해서 문자열형태로 바꾼다음에 cmd에 넣어서 웹서버로 연결까지는 됬습니다.
      제 서버 DB에 값이 들어오기는 하는데 아두이노 시리얼모니터상에는 float형태로 나오는데 DB에 저장되는 값은 0밖에 저장이 안되고있습니다.
      테이블 변수 속성은 double로 했고 혹시나해서 varchar나 text로 해보니까 그때는 아예 공백으로 나오더라고요
      그리고 궁금한게 floatToString 에서 뒤에 변수 2개가 어떤역할인지 알려주시면 감사하겟습니닷

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.04.07 01:45 신고


        dtostrf라는 함수를 사용하면 더 간단하게 해결된다네요...

        #include<stdlib.h>
        char* dtostrf ( double __val,
        signed char __width,
        unsigned char __prec,
        char * __s
        )

        _val에 있는 double값을 _s에 문자열로 저장합니다.

        _width는 음수기호(-)와 .을 포함해서 생성되는 전체 문자열의 크기이고...

        _prec는 소수 몇째 자리까지 보여줄지를 결정합니다.

        _s는 _width보다 큰 크기의 배열로 선언되어야 합니다.

        참고
        https://goo.gl/tSXwMM


        아직 태스트는 못해봤네요..

    • 123 2017.08.31 23:02


      아두이노 소스를 컴파일 해보니
      tmElements_t tm was not declared in this scope 라고 나오는데..
      뭐가 잘못된 걸까요..?ㅠ

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.09.04 16:23 신고


        tmElements_t 구조체는 다음 라이브러리에 선언되어 있습니다..

        https://github.com/PaulStoffregen/Time


        다운로드 받아서 압축을 풀면 그 안에 또 폴더가 보이는데 그 폴더를 아두이노 라이브러리 폴더를 두는 곳에 복사해보세요..

      • 123 2017.09.06 22:41


        감사합니다..! 뭐가 빠져있었네요 수정하고 컴파일해보니 에러는 안떴지만
        warning이 뜹니다..
        warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
        이렇게 뜨네요 ㅠ 에러가 아니라서 그냥 넘어가고 씨리얼 모니터를 확인해보니까

        ESP8266 connect
        AT+CWJAP="핫스팟","비번"
        Can not connect to the WiFi.
        이렇게 뜹니다.. dbserial을 못받은듯한데... 핸드폰 핫스팟으로 해서 그런건가요..?
        어떻게 해야할지 알려주시면 정말감사하겠습니다!!

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.09.07 16:36 신고


        ESP8266 모듈이 핫스팟에서도 동일하게 동작했던걸로 기억합니다..

        혹시 이 보다 간단한 예제인 다음 포스팅에서는 문제가 없었나요?

        http://webnautes.tistory.com/755

      • 123 2017.09.10 20:42


        네 감사합니다. 한번해보고 이상이없어서 됐나보다 하고 계속 진행했었는데 다시해보니 안됐었네요 ㅋㅋ 이게 됐다안됐다하네요 ㅠㅠ 지금은 된 상태입니다.


        그런데 또 뭔가가 잘못됏나봐요.. 디비에 안들어갑니다.. 테이블은 다 만들었습니다.

        업로드 한 후 씨리얼 모니터에


        ESP8266 connect
        AT+CWJAP="AndroidHotspot5480","1234567890"
        OK, Connected to WiFi.
        Found 1 devices.
        Parasite power is: OFF
        Device 0 Address: 28FFC63CB5160381
        Device 0 Resolution: 10
        DS1302RTC Read Test
        -------------------
        RTC module activated

        Requesting temperatures...DONE
        Temp C: 27.75
        AT+CIPSTART="TCP","211.253.9.88:10081",80
        GET /run.php?temp='27.75'&date='2000-01-01'&time='00:46:58'


        connect timeout
        Requesting temperatures...DONE
        Temp C: 85.00
        AT+CIPSTART="TCP","211.253.9.88:10081",80
        GET /run.php?temp='85.00'&date='2000-01-01'&time='00:47:02'
        ...
        이렇게 뜹니다..

        저렇게 계속 connect time out이라고 뜨는데 db를못찾은건가요??
        제가 주소를 잘못입력했다고 볼수있나요???

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2017.09.11 13:52 신고


        우선 웹브라우저에서 포스팅에 나온것처럼 입력시 데이터가 데이터베이스에 입력되나 보세요.

    • ska1004 2018.11.07 14:27


      안녕하세요 제가 이거 따라서 mysql에 데이터를 넣으려는데요
      코드는 조금 제 임의로 바꿨어요

      AT+CIPSTART="TCP","192.168.75.205",80
      GET /run.php?gdk=0.00&dust=0.04

      connect timeout

      connect timeout이 계속뜨는데
      저위에 웹사이트에서 했을땐 제대로 추가가 됐는데 아두이노에서 DB로 저장이 안되네요

      • ska1004 2018.11.07 14:36


        그리구 제가 우분투 16.04로 서버를 만들어 켜놓고 윈도우에서 작업하고있는데 localhost 그냥쓰고 mysql서버 주소에만 우분투 ip주소 쓰면 되는건가요??

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.11.07 15:35 신고


        localhost대신에 php 파일이 있는 컴퓨터 IP를 적어야합니다

      • ska1004 2018.11.07 16:02


        감사합니다 위의 코드와 같게 하고 수정해서 돌려봤는데 여전히 connect timeout이 계속 뜨네요 혹시 위에 적힌거만 하면되는지 아니면 권한부여라던지 방화벽설정도 해야하는지 알수있을까요??

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


        방어벽 문제는 아닌듯합니다..

        여기에 있는 PHP코드가 오래된 버전거라서 그런게 아닌가 싶었는데..

        다음 위치에 있는 로그를 확인해보세요..
        /var/log/apache2/error.log

    • antenna 2018.12.10 18:36


      안녕하세요 이 예제를 활용해 gps모듈을 사용해 gps 위도 경도 값을 MySQL데이터베이스에 넣고 싶은데 gps도 SoftwareSerial을 사용해 SoftwareSerial을 2개 사용하는 경우는 어떻게 해야하는지 궁금합니다!

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


        다음 글을 참고하세요.

        ARDUINO UNO WITH MULTIPLE SOFTWARE SERIAL DEVICES

        http://www.fiz-ix.com/2012/12/arduino-uno-with-multiple-software-serial-devices/

    • kkk 2019.04.01 21:20


      제가 진짜 초보라 그런데 "/var/www/html 위치에 run.php 파일을 작성합니다" 이걸 못하겠어요..
      저 위치 찾아봐도 없는데 어디있는건가요 ㅠㅠ 허접한 질문 죄송합니다..
      이 프로젝트를 하기위해 준비해야할 환경좀 알려주세요. 이 블로그 글중에 '윈도우 기반 웹 개발 환경 만들기' 보고 Wampserver까지는 설치했는데 더 필요한게 있나요?

      • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.01 22:43 신고


        다음 명령으로 nano 편집기를 사용하여 run.php파일을 생성한 후

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


        블로그에 있는 소스코드를 복사하여 붙여넣기합니다.
        블로그에서 드래그해서 복사한 후..
        터미널에서 마우스 오른쪽 버튼을 누르면 붙여넣기 될겁니다.
        (사용하는 터미널에따라서는 메뉴가 보인 후 붙여넣기 또는 paste를 선택해야합니다.)

        그리고 나서 Ctrl + x를 누르면 저장할지 물어보는데 y를 누르면 저장되면서 nano가 종료됩니다.

    • kkk 2019.04.01 22:53


      답변 감사합니다. 제가 일단 WampServer만 설치한 상태인데 더 설치해야 하는게 있을까요?
      아니면 개발환경 준비하는데 참고할만한 글이 있나요?

    • tester 2019.05.15 13:59


      OK, Connected to WiFi.
      Found 1 devices.
      Parasite power is: OFF
      Device 0 Address: 285C8C400700003D
      Device 0 Resolution: 10
      DS1302RTC Read Test
      -------------------
      RTC module activated

      The DS1302 is write protected. This normal.

      이후로 시리얼모니터에서 멈추어버립니다. 177번째 줄 온도는 출력될때도 있고 안나올때도 있습니다. 현재 RTC 모듈은 위의 그림과는 다르게 vcc, gnd는 6, 5 핀에 꼽아놓은 상태이며

      digitalWrite(DS1302_GND_PIN, LOW);
      pinMode(DS1302_GND_PIN, OUTPUT);

      digitalWrite(DS1302_VCC_PIN, HIGH);
      pinMode(DS1302_VCC_PIN, OUTPUT);

      부문도 추가하였습니다.

    • 1234 2019.05.18 21:38


      /var/www/html 에 php파일 편집하는건 CentOs 리눅스에서 하는게 맞는건가요 ?

      저는 리눅스에서 www/html 경로가 없길래 /var에서 www와 html 디렉터리를 만든 뒤,

      그 안에다가 nano 편집기로 확장자를 .php로 하고 저장했습니다.

      그리고 나서 주소창에 localhost대로 입력을 했는데 사이트가 오류가 뜨더군요.. 뭐가 문제일까요 ?

      혹시몰라서 php7하고 아파치도 설치했습니다. (이쪽 방면으로 전혀 모릅니다 ㅠ )

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


        다음 파일을 열어서
        /etc/apache2/apache2.conf

        다음 부분에 /var/www/ 대신 적혀있는 경로를 확인해보세요...
        이 경로에 파일을 만들어야 웹에서 보일 겁니다..

        <Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
        </Directory>

      • 1234 2019.05.21 01:51


        감사합니다. 많은 도움이 됐습니다.

        지금 저는 온도 센서가 아닌, esp-01 와이파이 모듈과 무게 감지 센서를 이용하여 이글 보고 똑같이 따라하고 있는데요..

        무게 감지 센서를 여기다가 적용하려면 어떤 부분을 수정해주어야 할까요 ? ㅠ

        그리고 제가 아두이노에 대해서 잘 몰라서 그러는데, esp-01과 무게 감지 센서를 동시에 가동?하는게 불가능하더군요.

        그럼 저 위에서처럼 .h로 불러와야하는 건가요? 그렇게 된다면 esp-01만 아두이노에 꼽아야하는지 무게 감지 센서만 아두이노에 꼽아야하는지 궁금합니다.

        두개를 동시에 꼽고서 업로드 하려니까 당연히 오류뜨더라구요 ㅠㅠ

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


        cmd = "GET /run.php?temp='"+temp+"'&date='"+mdate+"'&time='"+mtime+"'\n\r";

        에서

        temp에 무게 를 넣으면 됩니다.

        센서와 esp8266이 같이 사용 못할 이유는 없을 듯합니다..

        어떤 오류가 보이나요?

      • 1234 2019.05.21 14:59


        계속 해서 연결해보니 무게 센서 + 와이파이 모듈 같이 해도 오류가 안나는데 성공했습니다 ㅠㅠㅠ 핀하나가 문제였나 봅니다.
        말씀하신대로
        cmd = "GET /run.php?temp='"+temp+"'&date='"+mdate+"'&time='"+mtime+"'\n\r"; 에서 temp에 무게를 넣으면 된다고 하셨는데,

        그럼 저위에 코드에서 온도 라이브러리
        <DS1302RTC.h>와 <OneWire.h>,
        <DallasTemperature.h>이 세개를 제외하고 무게 센서 라이브러리인 <XH711..h>를 추가 한 뒤,
        온도 센서 코드만 빼주고 실행하면 될까요 ?

        그리고 추가적으로 라이브러리 바로 밑에 #DEFINE ONE_WIRE_BUS 5 이건 무게 센서에서 어떤 것을 보고 수정해야 할까요?

        현재 무게 센서 RX TX 는 0과 1에 꼽혀져 있습니다.

        그리고 SoftwareSerial dbgSerial(6,7)은 고정되게 똑같이 (6,7)로 적용 시키면 되는건가요 ?

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


        무게센서가 시리얼로 정보를 제공하나봅니다.. 맞나요?

      • 1234 2019.05.21 17:25


        알제이테크라는곳에서
        1.아두이노 우노
        2.무게센서 (hx711)
        3.와이파이 모듈 (esp-01)을 구매하였고,

        각각의 센서와 모듈을 아두이노 우노에
        연결한 뒤, 기본적으로 제공되는 소스 코드를 아두이노 프로그램에서 스케치 한 경우입니다... 전혀 다른 경우인가요 ?

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


        무게센서 인터페이스가 어떻게 되는지 확인해보세요

      • 1234 2019.05.21 17:27


        #include "HX711.h"
        HX711 scale(A1, A0); // DOUT, SCK


        void setup()
        {
        Serial.begin(9600);
        scale.set_scale(2280.f); //// this value is obtained by calibrating the scale with known weights
        scale.tare();
        }

        void loop()
        {
        Serial.print("one reading:\t");
        Serial.print(scale.get_units(), 1);
        scale.power_down(); // put the ADC in sleep mode
        delay(5000);
        scale.power_up();
        }

        이게 기본 제공 코드 입니다.

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


        다음 코드에서 출력하는 값이 센싱값인듯한데...

        변수에 저장해서 출력ㅎ도 같은 값이 출력되는지 테스트해보세요..

        뒤에 1은 왜 붙은 건지 알수 없군요..

        Serial.print(scale.get_units(), 1);

Designed by Tistory.