본문으로 바로가기
반응형

라즈베리파이에서 005_Test_DHT111_2.py   를 새로 하나 만들어주자

# -*- coding:utf-8 -*-
import time
import Adafruit_DHT as Sensor
import mysql.connector
import sys

Maria = mysql.connector.connect(host="localhost", user="root", passwd="####", database="mydb")
Cursor = Maria.cursor()
OutPin = 4

try:
        while True:
                Query = "INSERT INTO tblSensorDHT11 VALUES(%s,%s,%s)"
                Humi, Temp = Sensor.read_retry(Sensor.DHT11, OutPin)
                Values = ((time.strftime('%Y%2m%d%H%M%S')),int(Humi), int(Temp))
                Cursor.execute(Query,Values)
                Maria.commit()
                print(Values)
except KeyboardInterrupt:
        Maria.close()
        sys.exit(0)

실행화면

C#에서 SubString으로 시간 값을 쉽게 추출하기위해 출력되는 것을 바꿔주었다.

 

 

 

 

MariaDB와 연동하므로 using문을 추가해야한다.

using문을 추가해서 사용하기위해 참조추가를 해주자.

using문이 추가되었다

 

 

using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
using System.Windows.Forms;
using System.Data;

namespace DHT11ConnectionChart
{
    public partial class Form1 : Form
    {
        private static int DataSize = 300;
        private static string TName      = "tblSensorDHT11";  // 테이블 이름을 string화(하드코딩 방지)
        private static string QueryLogin = "SERVER = 192.168.0.161; DATABASE = mydb; UID=root; PASSWORD=1234;";

        private static string QueryTable = "SELECT * FROM " + TName + " ORDER BY TIME DESC LIMIT 150";
        private static string QueryTable1 = QueryTable + 1;
        private static string QueryTable12 = QueryTable + DataSize.ToString();

        private bool TimerStatus;
        private void ReflashOn()
        {
            TimerStatus = true;
            timer1.Start();
            button2.Text = "그래프 정지";
        }

        private void ReflashOff()
        {
            TimerStatus = false;
            timer1.Stop();
            button2.Text = "그래프 시작";
        }

        private void ReflashToggle()
        {
            if(false == TimerStatus)  // 타이머가 꺼졌을때
            {
                ReflashOn();
            }
            else
            {
                ReflashOff();
            }
        }

        private void DataUpdate()
        {
            DataSet aDataSet = new DataSet();  // Fill의 인자를위해 DataSet 객체 생성
            using (MySqlConnection aMySqlConnection = new MySqlConnection(QueryLogin))
            {
                MySqlDataAdapter aMySqlDataAdapter = new MySqlDataAdapter(QueryTable1, aMySqlConnection);  // 첫번째 인자는 쿼리테이블, 두번째인자는 using으로 생성한 객체
                aMySqlDataAdapter.Fill(aDataSet, TName);

            }
            DataRow Temp = aDataSet.Tables[TName].Rows[0];  // 한개를 가져와서 Temp에 대입
            chart1.Series[0].Points.Add(Int32.Parse(Temp["TEMP"].ToString()));  // 온습도 추출해서 해당 차트 시리즈에 대입(차트출력)
            chart1.Series[1].Points.Add(Int32.Parse(Temp["HUMI"].ToString()));
           
            if (chart1.Series[0].Points.Count > DataSize)
            {
                chart1.Series[0].Points.RemoveAt(0); // 하나는 사라지고 하나는 새로 추가되니까 움직이는것처럼 보인다
                chart1.Series[1].Points.RemoveAt(0);
            }
            
        }
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataSet aDataSet = new DataSet();  // Fill의 인자를위해 DataSet 객체 생성
            using(MySqlConnection aMySqlConnection = new MySqlConnection(QueryLogin))
            {
                MySqlDataAdapter aMySqlDataAdapter = new MySqlDataAdapter(QueryTable, aMySqlConnection);  // 첫번째 인자는 쿼리테이블, 두번째인자는 using으로 생성한 객체
                aMySqlDataAdapter.Fill(aDataSet, TName);

            }
            List<int> TempData = new List<int>(); // 온습도, 시간 데이터 받아오기위해 List 선언
            List<int> HumiData = new List<int>();
            List<string> TimeList = new List<string>();
            foreach (DataRow Temp in aDataSet.Tables[TName].Rows)  
            {
                TempData.Add(Int32.Parse(Temp["TEMP"].ToString())); // 테이블은 문자열이기때문에 Int32.Parse로 숫자로 변환, 테이블의 "TEMP"를 문자열로 변환한 것을 들고옴
                HumiData.Add(Int32.Parse(Temp["HUMI"].ToString()));
                TimeList.Add(Temp["TIME"].ToString().Substring(8, 4).Insert(2, ":")); // '20200917134242' 의 시간데이터에서 필요한 시간 부분만 추출
            }
            TimeList.Reverse();
            chart1.Series[0].Points.DataBindXY(TimeList, TempData);
            chart1.Series[1].Points.DataBindXY(TimeList, HumiData);
            chart1.Series[0].LegendText = "온도℃";
            chart1.Series[1].LegendText = "습도%";
            ReflashOn();
        }

        // 버튼클릭하면 데이터가 추가되는 이벤트
        private void button1_Click(object sender, EventArgs e)
        {
            DataUpdate();
        }

        // 타이머로 자동으로 업데이트 되는 이벤트
        private void timer1_Tick(object sender, EventArgs e)
        {
            DataUpdate();
        }

        // 차트 업데이트 시작, 정지 이벤트
        private void button2_Click(object sender, EventArgs e)
        {
            ReflashToggle();
        }
    }
}

실행화면

 

 

 

 

 

 

실행했을때 이렇게 계속 엑세스를 거부하는창이 떴었는데, 알고보니 마리아DB의 root계정이 없어가지고 마리아DB 접속이 되지 않았었다.

root 계정을 만들고 실행하니 잘 접속되었다.

 

 

 

 

 

 

반응형