반응형

이번엔 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(새로 고침)을 해주도록 소스코드를 고치면 실시간으로 입력되는 데이터를 연속적으로 볼 수있습니다.. 





반응형

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

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

유튜브 구독하기


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

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


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

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

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

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

  4. 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/

  5. 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가 종료됩니다.

  6. kkk 2019.04.01 22:53

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

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

    부문도 추가하였습니다.

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

+ Recent posts