아두이노/구현해보기

12. 30 아두이노 시험

xowoony 2022. 12. 30. 09:38

학습일 : 2022. 12. 30


1. 임베디드 디바이스 드라이버 소스 분석 / 정리

#define PB0 0   // PB0 ->아두이노 8번핀 입니다.
#define PB1 1   // PB1 ->아두이노 9번핀 입니다.

int CDS = A1;   // 조도 센서
int LED = 2;    // LED를 2번에 연결합니다.

int trig_pin = 11;  // 거리 측정
int echo_pin = 12;  // 거리측정을 11, 12번에 연결합니다.

float temperature;  // 온도센서 
int reading;
int lm35pin = A0;   //  온도센서를 A0에 연결합니다.


void setup() {
  Serial.begin(9600);
  DDRB = 0b00000011;  // PB0, PB1 출력모드 설정을 합니다.
  pinMode(CDS, INPUT);
  pinMode(LED,OUTPUT);
  pinMode(trig_pin, OUTPUT);
  pinMode(echo_pin, INPUT);

  analogReference(INTERNAL);
  Serial.begin(9600); // 보트레이트 9600으로 설정합니다.
  delay(1000);      // 딜레이를 1초로 설정하여 표시합니다.
}


void loop() {
  int val = analogRead(CDS);
  long duration, distance;

  // 온도센서 출력 구현 코드 부분입니다.
  reading = analogRead(lm35pin); //analogRead함수를 이용해 읽어 온 값을 reading에 집어 넣는다.
  float voltage = reading*5.0;  // reading 에 들어 있는 값을 실수형으로 변환한다.
  voltage /= 1024.0;    //  voltage에 1024를 나누어 다시 voltage에 값을 집어 넣는다.
  temperature = reading / 9.31;   // reading 값을 0.31로 나누어 temperature 에 값을 넣는다
  Serial.println("T"+String(temperature)+"E\n");
    delay(1000);      // 1초 딜레이 되어 표시한다.



 // LED ON, OFF를 구현하는 코드입니다.
  if(Serial.available()){   // 수신이 감지 되었을 때 
      char a = Serial.read();
       switch(a){
      case '1':
        PORTB |= 1<<PB0;   // 아두이노 8번핀에 연결된 LED가 HIGH 됩니다.
        break; 
      case '2':
         PORTB &= ~(1<<PB0);  // 2입력시 아두이노 8번핀에 연결된 LED가 LOW 됩니다.
        break;  
      case '3':
        PORTB |= 1<<PB1;   // 아두이노 9번핀에 연결된 LED가 HIGH 됩니다.
        break; 
      case '4':
        PORTB &= ~(1<<PB1);  //아두이노 9번핀에 연결된 LED가 LOW 됩니다.
        break; 
       case '5':            // 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");             // D +거리값+ E 가 출력됩니다.

        }
        break;

        default:
          break;
      } 
      
  } 
 delay(1000);

 Serial.println("C"+String(val)+"E"); // C+ 조도센서 값 + E가 출력됩니다
  
  if(val > 700)
  {
    digitalWrite(LED, 1);
  }
  else
  {
    digitalWrite(LED, 0);
  }
  
}


2. C# UI에 대한 DB 설정 구현, Data 출력 소스코드 분석/정리

Data 출력 소스코드 분석 / 정리

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(); // 사용할 통신포트 관련 변수들 불러오기
         }
        int temp_x = 0;
        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));  // 수신설정 함수 연결
        }

        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+10;
                        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 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 조회 화면 클리어 
        }

    }
}

 


3. 결과 / 전체적인 작품 구현 사진