Arduino Uno에서 ESP8266을 이용하여 MYSQL에 온도값(DB18B20) 넣기

2019. 4. 16. 23:30·IT기술 관련/기타 기술
반응형

출처: https://webnautes.tistory.com/783



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

   
     
//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을 확인해보면 데이터가 입력되는 것을 볼 수 있습니다.



반응형

'IT기술 관련 > 기타 기술' 카테고리의 다른 글

Android PHP MySQL 예제 - 데이터베이스에서 데이터를 JSON 형식으로 가져오기  (0) 2019.04.17
아두이노와 ESP8266을 활용하여 센싱한 데이터의 데이터베이스 저장과 리트리빙  (0) 2019.04.17
하이퍼레저 패브릭 네트워크 구조[Hyperledger Fabric Network Structure]  (0) 2019.03.28
비트코인은 망했다 (번역)  (0) 2017.07.10
Blockchain에 대하여, 과거에서 미래까지  (0) 2017.07.10
'IT기술 관련/기타 기술' 카테고리의 다른 글
  • Android PHP MySQL 예제 - 데이터베이스에서 데이터를 JSON 형식으로 가져오기
  • 아두이노와 ESP8266을 활용하여 센싱한 데이터의 데이터베이스 저장과 리트리빙
  • 하이퍼레저 패브릭 네트워크 구조[Hyperledger Fabric Network Structure]
  • 비트코인은 망했다 (번역)
호레
호레
창업 / IT / 육아 / 일상 / 여행
    반응형
  • 호레
    Unique Life
    호레
  • 전체
    오늘
    어제
    • 분류 전체보기 N
      • 법률
        • 기본
        • 개인정보보호법
        • 정보통신망법
        • 전자금융거래법
        • 전자금융감독규정
        • 신용정보법
        • 온라인투자연계금융업법
      • 창업
        • 외식업 관련
        • 임대업 관련
        • 유통업 관련
        • 세무 관련
        • 마케팅 관련
        • 기타 지식
        • 트렌드
        • Youtube
      • IT기술 관련
        • 모바일
        • 윈도우
        • 리눅스
        • MAC OS
        • 네트워크
        • 빅데이터 관련
        • A.I 인공지능
        • 파이썬_루비 등 언어
        • 쿠버네티스
        • 기타 기술
      • 퍼블릭 클라우드 관련
        • Azure
        • GCP
        • AWS
      • 정보보안 관련
        • QRadar
        • Splunk
        • System
        • Web
      • 기타 N
        • 세상 모든 정보 N
        • 서적
      • 게임 관련
        • 유니티
      • 부동산
      • 맛집 찾기
        • 강남역
        • 양재역
        • 판교역
        • ★★★★★
        • ★★★★
        • ★★★
        • ★★
        • ★
      • 결혼_육아 생활
        • 리얼후기
        • 일상
        • 육아
        • 사랑
        • Food
      • 영어
        • 스피킹
        • 문법
        • 팝송
        • 영화
      • K-컨텐츠
        • 드라마
        • 영화
        • 예능
      • 독서
      • 프로젝트 관련 조사
        • 시스템 구축
        • 로그 관련
        • 웹
        • APT
        • 모의 해킹
        • DB
        • 허니팟
        • 수리카타
        • 알고리즘
        • FDS
      • 기업별 구내 식당 평가
        • 한국관광공사
        • KT telecop
        • KT M&S
        • KT powertel
        • KT cs 연수원
        • 진에어
      • 대학 생활
        • 위드윈연구소
        • 진로 고민
        • 채용정보
        • 자동차
        • 주식
        • 악성코드
        • 게임 보안
      • 쉐어하우스
  • 블로그 메뉴

    • 홈
    • 게임 관련
    • IT 기술 관련
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    이재곧죽습니다
    판교
    AWS
    복리후생
    대통령
    판교맛집
    마케팅
    돈까스
    맛집
    점심
    상호관세
    쥬쥬랜드
    보안가이드
    수제버거맛집
    런치
    유니티
    무역전쟁
    판교역
    수제버거
    수제버거존맛
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
호레
Arduino Uno에서 ESP8266을 이용하여 MYSQL에 온도값(DB18B20) 넣기
상단으로

티스토리툴바