Arduino Uno와 Ethernet shield를 이용하여 측정한 센서값을 PC에 설치된 DB에 전송하려고 한다.

 

사용 제품

 

1.Arduino Uno

2.Arduino Ethernet shield W5100

3.DHT22 온습도센서

 

선행 설치

1.Arduino IDE

2.Mysql or MariaDB

 

---------------------------------------------------------------------------------------------------

본 글은 데이터의 DB전송이 목적이기 때문에 센서에 관한 코딩은 생략한다.

어떤 종류의 센서를 사용해도 된다.

 

1. 아두이노 코드 작성

 

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
#include <DHT.h>    //라이브러리 불러옴
int pin = 4;          //Signal 이 연결된 아두이노의 핀번호
DHT dht(pin, DHT22);
 
#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
 
byte mac_addr[] = { 0xDE0xAD0xBE0xEF0xFE0xED };  
 
IPAddress server_addr(xxx,xxx,xxx,xxx);  // mysql 서버 주소를 입력
char user[] = "user";              // mysql user 입력
char password[] = "password";        // mysql password 입력
 
// Sample query
char INSERT_SQL[] = "INSERT INTO TestDB.TestTable (Temp,Humid) VALUES (%d,%d)";
char query[128];
 
EthernetClient client;
MySQL_Connection conn((Client *)&client);
 
 
void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac_addr);
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connection failed.");
}
 
 
void loop() {
  // Initiate the query class instance
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  int temp = dht.readTemperature();
  int humid = dht.readHumidity();
 
  Serial.print(temp);
  Serial.print(" ");
  Serial.println(humid);
 
  sprintf(query, INSERT_SQL, temp, humid);
  cur_mem->execute(query);
  delete cur_mem;
  delay(1000);
}
cs

1) 16번줄에서 쿼리의 value를 변수로 바꿔준다.

2) 45번줄에서 sprintf를 사용해 쿼리의 변수값에 temp, humid 변수값을 대입한다.

 

 

2. DB 결과데이터 확인

DB로 전송된 데이터

 

다른 센서를 사용하거나, 내부에서 생성되는 변수값을 전송할 때에도 동일한 방법으로 사용하면 된다.

 

여러개의 센서(변수)를 사용하고 싶으면 16번 줄의 쿼리를 수정하면 된다.

 

ex)센서 5개 사용 시

1
"INSERT INTO TestDB.TestTable (Temp,Humid,Light,Co2,Deg) VALUES (%d,%d,%d,%d,%d)"
cs

물론 데이터가 대입되는 45번줄 역시 변경해주어야 한다.

1
sprintf(query, INSERT_SQL, temp, humid, Light, co2, deg)
cs

 

※아두이노에서 sprintf를 사용할 때 변수값이 float,double일 경우 값이 정상적으로 출력되지 않는다.

이럴 때는 dtostrf()함수를 사용하여 실수를 문자열로 변환 후 대입하면 된다.

 

ex) temp를 float 형식으로 사용 시

1
2
3
4
5
float temp = dht.readTemperature();
 
dtostrf(temp, 12, temp_s);
 
sprintf(query, INSERT_SQL, temp_s);
cs

----------------------------------------------------------------------------------

이더넷을 사용하여 DB로 데이터를 전송하는 방법은 매우 간단하고 쉽다.

 

하지만 이더넷이 연결되어야 하는 점이 제약이 많다.

 

다음번에는 와이파이 모듈을 사용하여 데이터 전송하는 방법을 사용해보려고 한다.

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