JUST GO

[공통] 온도 모니터링 본문

임베디드/학습내용

[공통] 온도 모니터링

root_go 2022. 12. 23. 11:28

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;
using System.Data.SqlClient; // MS-SQL DB 사용 네임스페이스 활성화 

namespace RS232_CDS_11_11
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            COM_port.DataSource = SerialPort.GetPortNames(); // 사용할 통신포트 관련 변수들 불러오기
         }
        private void Form1_Load(object sender, EventArgs e)
        {
            

        }

        private void connect_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen) // 시리얼포트가 열려 있지 않으면
            {
                serialPort1.PortName = COM_port.Text;  // 콤보박스의 선택된 COM포트명을 시리얼포트명으로 지정
                serialPort1.BaudRate = 9600; // 통신속도 9600[bps]설정
                serialPort1.DataBits = 8;  // 통신에서 사용하는 기본 data크기는 char형의 1byte(8비트)설정
                serialPort1.StopBits = StopBits.One;
                serialPort1.Parity = Parity.None;  // Parity->오류체크 기능 사용안함(비동기방식 기본설정 값)
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);  // 수신설정 활성화
                serialPort1.Open(); // 시리얼포트 열기
                connection_status.Text = "포트가 열렸습니다.";  // 접속 상태 표시
                connection_status.ForeColor = Color.Green;    // 접속 상태 표시 글자색 지정

            }
            else  //  시리얼포트가 열려 있으면
            {
                connection_status.Text = "포트가 이미 열려 있습니다.";
            }
                
        }

        private void disconnect_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen) // 시리얼포트가 열려 있으면
            {
                serialPort1.Close(); // 시리얼포트 닫기
                connection_status.Text = "포트가 닫혔습니다.";  // 접속 상태 표시
                connection_status.ForeColor = Color.Red;    // 접속 상태 표시 글자색 지정

            }
            else  //  시리얼포트가 닫혀 있으면
            {
                connection_status.Text = "포트가 이미 닫혀 있습니다.";
            }
        }

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            this.Invoke(new EventHandler(MySeialReceived));  // 수신설정 함수 연결
        }
        int temp_x = 0;
        private void MySeialReceived(object sender, EventArgs e)
        {
            char Rec = (char)serialPort1.ReadByte(); // 시리얼 버퍼에 수신된 데이터를 ReceivedData 읽어 오기
            string data = ""; // 수신된 data string str 객체에 문자열로 저장하기 위한 변수 선언 및 초기화 
            string[] dataArr = new string[] { };
            
            switch (Rec)
            {
                case 'T':
                    {
                        while (true)
                        {
                            char Buff = (char)serialPort1.ReadByte();
                            if (Buff == 'E')
                            {
                                break;
                            }
                            data += Buff;
                        }
                        data = data.Replace("\n", "").Replace("\r", "");
                        dataArr = data.Split(',');
                        textBox1.Text = dataArr[0];
                        textBox1.ForeColor = Color.Green;

                        string strconn = "Data Source=127.0.0.1;Initial Catalog =Temp_DB_2;User ID=sa; Password=1234"; // DB접속정보
                        string insertSQL = string.Format("INSERT INTO Temp_table(date,Temp_data)VALUES('{0}','{1}')", DateTime.Now, dataArr[0]);
                        using (SqlConnection connection = new SqlConnection(strconn))
                        {
                            connection.Open();
                            using (SqlCommand command = new SqlCommand(insertSQL, connection))
                            {
                                command.ExecuteNonQuery();  // 데이터 추가 요청 함수 실행
                            }
                            connection.Close();
                        }

                        int max_x = 10; // 보여줄 X축 값 개수(viewport)
                        double values = double.Parse(dataArr[0]);
                        chart1.Series[0].Points.AddXY(temp_x,values);
                        //데이터 셋의 갯수가 윈도우 사이즈를 초과하면
                        if(chart1.Series[0].Points.Count > max_x)  // 보여줄 갯 수보다 크면 첫 번째 데이터를 삭제
                        {                       
                            chart1.Series[0].Points.RemoveAt(0);   // 첫번째 데이터를 삭제한다.
                        }
                        chart1.ChartAreas[0].AxisX.Maximum = temp_x;
                        chart1.ChartAreas[0].AxisX.Minimum = chart1.Series[0].Points[0].XValue;

                        double max = 0;
                        for(int i=0; i < chart1.Series[0].Points.Count; i++)
                        {
                            if(max < chart1.Series[0].Points[i].YValues[0])
                            {
                                max = chart1.Series[0].Points[i].YValues[0];
                            }
                        }

                        chart1.ChartAreas[0].AxisY.Maximum = max+5;
                        temp_x++;
                            
                    }
                    break;

                case 'C':
                    {
                        while (true)
                        {
                            char Buff = (char)serialPort1.ReadByte();
                            if (Buff == 'E')
                            {
                                break;
                            }
                            data += Buff;
                        }
                        data = data.Replace("\n", "").Replace("\r", "");
                        dataArr = data.Split(',');
                        label3.Text = dataArr[0];
                        label4.Text = (Int32.Parse(data) > 800 ? "가로등 ON" : "가로등 OFF");
                        label4.ForeColor = Int32.Parse(data) > 800 ? System.Drawing.Color.Green : Color.Red;
                    }
                    break;

                
                case 'D':
                    {
                        while (true)
                        {
                            char Buff = (char)serialPort1.ReadByte();
                            if (Buff == 'E')
                            {
                                break;
                            }
                            data += Buff;
                        }
                        data = data.Replace("\n", "").Replace("\r", "");
                        label6.Text = data + "cm";
                        listBox1.Items.Add(DateTime.Now.ToString() + "  " + "거리측정 출력");
                    }
                    break;

                default:
                    break;

            }
        }

        private void L1_Click(object sender, EventArgs e)
        {

        }

        private void Button_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                MessageBox.Show("포트가 열려있지 않습니다.");
                return;
            }
            DateTime now = DateTime.Now;
            Button btn = (Button)sender;
            serialPort1.Write(btn.Name.Substring(1));
            listBox1.Items.Add(now.ToString() + "  " + btn.Text);
        }

        private void button1_Temp_Click(object sender, EventArgs e)
        {
            string selectSQL = "SELECT DATE,Temp_data FROM Temp_table";  // sql명령어 문자열로 만들어 변수에 저장
            string strconn = "Data Source=127.0.0.1;Initial Catalog =Temp_DB_2;User ID=sa; Password=1234"; // DB접속정보 
            using(SqlConnection connection = new SqlConnection(strconn)) // DB연결객체 생성
            {
                connection.Open();  // DB연결 요청
                using(SqlCommand command = new SqlCommand(selectSQL, connection)) //DB명령어 객체 생성
                {
                    SqlDataReader reader = command.ExecuteReader(); //ExecuteReader()함수를 이용해서 reader객체 생성
                    while (reader.Read()) //Read()함수를 이용한 칼럼 정보 읽어 오기
                    {
                        listBox2.Items.Add(reader["DATE"]+ " " + reader["Temp_data"]);
                    }
                }
                connection.Close(); //DB 연결 해제
            }
        }

        private void button2_CLS_Click(object sender, EventArgs e)
        {
            listBox2.Items.Clear();  // listBox 조회 화면 클리어 
        }

        private void button4_CDS_Click(object sender, EventArgs e)
        {
            string selectSQL = "SELECT DATE,CDS_data,status FROM CDS_table";  // sql명령어 문자열로 만들어 변수에 저장
            string strconn = "Data Source=127.0.0.1;Initial Catalog =CDS_DB;User ID=sa; Password=1234"; // DB접속정보
            using (SqlConnection connection = new SqlConnection(strconn)) // DB연결객체 생성
            {
                connection.Open();  // DB연결 요청
                using (SqlCommand command = new SqlCommand(selectSQL, connection))//DB명령어 객체 생성
                {
                    SqlDataReader reader = command.ExecuteReader(); //ExecuteReader()함수를 이용해서 reader객체 생성
                    while (reader.Read())  //Read()함수를 이용한 칼럼 정보 읽어 오기
                    {
                        listBox3.Items.Add(reader[0] + " " + reader[1] + " " + reader[2]);
                    }
                }
                connection.Close(); //DB연결 해제
            }

        }

        private void button3_CDS_CLS_Click(object sender, EventArgs e)
        {
            listBox3.Items.Clear();  // listBox3 조회 화면 클리어 
        }
    }
}
#define PB0 0   // PB0 ->아두이노 8번핀 
#define PB1 1   // PB1 ->아두이노 9번핀
float temperature;  
int lm35Pin = A0;
int CDS = A1;
int LED = 2;
int trig_pin = 11;
int echo_pin = 12;
void setup() {
//  analogReference(INTERNAL);  // 기준전압 2.56[V] 참조 
  DDRB = 0b00000011;  // PB0, PB1 출력모드 설정 
  pinMode(CDS, INPUT);
  pinMode(LED,OUTPUT);
  pinMode(trig_pin, OUTPUT);
  pinMode(echo_pin, INPUT);
  Serial.begin(9600); 
}
void loop() {
  int val = analogRead(A1); // 조도센서 
  long duration, distance;  // 초음파 센서
  int reading = analogRead(A0);  // 온도센서
//  Serial.println("val="+String(val)+" "+"reading="+String(reading));
  float voltage = (reading*5.0)/1024;  // 전압값 출력 
  float temperature = (float)(reading*5*100)/1024;  // 전압값을 온도로 변경 
 
  if(Serial.available()){  // 수신 감지 되었을 때 
      char a = Serial.read();
       switch(a){
      case '1':
      PORTB &= ~(1<<PB0);  //아두이노 8번핀 HIGH
        break; 
      case '2':
      PORTB |= 1<<PB0; //아두이노 8번핀 LOW
        break;  
      case '3':
      PORTB &= ~(1<<PB1);  //아두이노 9번핀 HIGH
        break; 
      case '4':
      PORTB |= 1<<PB1; //아두이노 9번핀 LOW
        break; 
       case '5':
        {
          digitalWrite(trig_pin,HIGH);
          delayMicroseconds(10);
          digitalWrite(trig_pin,LOW);
          duration = pulseIn(echo_pin,HIGH);
          distance = ((float)(340 * duration) / 10000) / 2; //계산식
          Serial.println("D"+String(distance)+"E");
        }
        break;

        default:
        break;
      }       
  } 
 delay(1000);
 Serial.println("T"+String(temperature)+"E");
 Serial.println("C"+String(val)+"E");
  if(val > 800)
  {
    digitalWrite(LED, 1);
  }
  else
  {
    digitalWrite(LED, 0);
  }
}

'임베디드 > 학습내용' 카테고리의 다른 글

[공통] 임베디드-학습내용 정리  (0) 2023.01.06
[공통] C# & MSSQL 데이터 조회  (0) 2022.12.02
[공통] SSMS  (0) 2022.12.02
[공통] 임베디드  (0) 2022.11.18
[공통] 초음파 센서로 거리 측정해보기  (0) 2022.11.18