반응형

https://youtube.com/live/1HmpkgreFAA

[STM32#17] STM32쉴드에 붙어있는 각종 센서값을 C# winform에게 전송하고 UI에 출력하는 방법 알아보기!(녹칸다 내맘대로 STM32)

심심한녹칸다의 내맘대로 STM32시리즈이다!

STM32시리즈의 모든 자료는 구글 슬라이드에 작성하고 모두에게 공유되어있음!
https://docs.google.com/presentation/d/1myA5iYbjuKsLWLqtRLKAiRfwUwvqB1d1RGjiMIIgp3I/edit?slide=id.g3ae38c5a1b6_3_0#slide=id.g3ae38c5a1b6_3_0

녹칸다의 STM32쉴드에 붙어있는 센서값을 C#윈폼으로 전송해보도록 하겠습니다~!

1.바로직전 슬라이드를 참고해서, A0,A1,A4에 연결된 아날로그 3종세트의 값을 ADC1을 이용해서 동시에 측정하고, 그 값을 C#윈폼 화면에 richtextbox1에 출력하시오!(보내는 데이터는 CSV 형식으로 전송하시오)

/* USER CODE BEGIN 0 */
#define R1 10000
#define c1 1.009249522e-03
#define c2 2.378405444e-04
#define c3 2.019202697e-07
/* USER CODE END 0 */
//중략
/* USER CODE BEGIN 2 */
 uint16_t adc_value0 = 0;
 uint16_t adc_value1 = 0;
 uint16_t adc_value2 = 0;
 char buff[50];
 float logR2, R2, T, Tc, Tf;
 /* USER CODE END 2 */
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
	  //PA0 ADC1 RANK1
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value0 = HAL_ADC_GetValue(&hadc1);
	  //PA1 ADC1 RANK2
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value1 = HAL_ADC_GetValue(&hadc1);
	  //PA4 ADC1 RANK3
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value2 = HAL_ADC_GetValue(&hadc1);
	  //온도계산
	  R2 = R1 * (4095.0 / adc_value2 - 1.0);
	  logR2 = log(R2);
	  T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
	  Tc = T - 273.15;
	  sprintf(buff,"%d,%d,%.2f\n",adc_value0,adc_value1,Tc);
	  HAL_UART_Transmit(&huart2, buff, strlen(buff), 100);
	  HAL_Delay(100);

   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }
private void button1_Click(object sender, EventArgs e)
        {
            //접속버튼 클릭
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = 115200;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                //수신버퍼 클리어
                serialPort1.ReadExisting();
                MessageBox.Show("접속완료!");
            }
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //STM32가 데이터를 전송했다!
            string data = serialPort1.ReadLine();
            richTextBox1.Text += data + "\n";
            //data안에 들어있는 값은 CSV형식이다!
            string[] analog_value = data.Split(',');
            //짤려진 조각의 갯수는 반드시 3개여야한다!
            if(analog_value.Length == 3)
            {
                textBox2.Text = analog_value[0];
                textBox3.Text = analog_value[1];
                textBox4.Text = analog_value[2];
            }
        }


2.예제1번에서 STM32가 보내는 데이터의 형식을 바이너리로 전송하시오!

/* USER CODE BEGIN 0 */
#define R1 10000
#define c1 1.009249522e-03
#define c2 2.378405444e-04
#define c3 2.019202697e-07
/* USER CODE END 0 */
//중략
/* USER CODE BEGIN 2 */
 uint16_t adc_value0 = 0;
 uint16_t adc_value1 = 0;
 uint16_t adc_value2 = 0;
 char buff[50];
 float logR2, R2, T, Tc, Tf;
 struct{
	  uint16_t sen1; //2
	  uint16_t sen2; //2
	  float sen3; //4
 }dataset;

 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
	  //PA0 ADC1 RANK1
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value0 = HAL_ADC_GetValue(&hadc1);
	  //PA1 ADC1 RANK2
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value1 = HAL_ADC_GetValue(&hadc1);
	  //PA4 ADC1 RANK3
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value2 = HAL_ADC_GetValue(&hadc1);
	  //온도계산
	  R2 = R1 * (4095.0 / adc_value2 - 1.0);
	  logR2 = log(R2);
	  T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
	  Tc = T - 273.15;
	  dataset.sen1 = adc_value0;
	  dataset.sen2 = adc_value1;
	  dataset.sen3 = Tc;
	  //내가 변환하고자하는 변수의 주소를 (uint8_t*)으로 명시적 형변환을 하면
	  //어떤 변수가 uint8_t array로 변환되는 효과를 가져올 수 있다!
	  HAL_UART_Transmit(&huart2, (uint8_t*)(&dataset), sizeof(dataset), 100);
	  HAL_Delay(100);


   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }

 

private void button1_Click(object sender, EventArgs e)
        {
            //접속버튼 클릭
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = 115200;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                //수신버퍼 클리어
                serialPort1.ReadExisting();
                MessageBox.Show("접속완료!");
            }
        }


        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //STM32가 데이터를 전송했다!
            //C#에서 STM32가 보낸 데이터를 무조건 8개를 받아야한다!
            byte[] recv = new byte[8]; //uint8_t
            int cnt = 0;
            while (true)
            {
                recv[cnt] = (byte)serialPort1.ReadByte();
                cnt++;
                if (cnt == 8) break;
            }
            //rawdata 출력
            richTextBox1.Text += "수신 = ";
            string text = "";
            for(int i = 0; i < 8; i++)
            {
                text += recv[i] + ", ";
            }
            richTextBox1.Text += text + "\n";
            //데이터해석
            UInt16 sen1 = BitConverter.ToUInt16(recv, 0);
            UInt16 sen2 = BitConverter.ToUInt16(recv, 2);
            float sen3 = BitConverter.ToSingle(recv, 4);
            textBox2.Text = sen1.ToString();
            textBox3.Text = sen2.ToString();
            textBox4.Text = sen3.ToString();
        }


3.예제1번에서 STM32가 key-value형식을 가지는 json형식으로 데이터를 전송한다음 C#에서 json파서를 이용해서 데이터 해석을 한다음 출력하시오!

/* USER CODE BEGIN 0 */
#define R1 10000
#define c1 1.009249522e-03
#define c2 2.378405444e-04
#define c3 2.019202697e-07
/* USER CODE END 0 */
//중략
/* USER CODE BEGIN 2 */
 uint16_t adc_value0 = 0;
 uint16_t adc_value1 = 0;
 uint16_t adc_value2 = 0;
 char buff[50];
 float logR2, R2, T, Tc, Tf;


 /* USER CODE END 2 */
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
	  //PA0 ADC1 RANK1
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value0 = HAL_ADC_GetValue(&hadc1);
	  //PA1 ADC1 RANK2
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value1 = HAL_ADC_GetValue(&hadc1);
	  //PA4 ADC1 RANK3
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value2 = HAL_ADC_GetValue(&hadc1);
	  //온도계산
	  R2 = R1 * (4095.0 / adc_value2 - 1.0);
	  logR2 = log(R2);
	  T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
	  Tc = T - 273.15;
	  sprintf(buff,"{\"sen1\":%d,\"sen2\":%d,\"sen3\":%.2f}\n",adc_value0,adc_value1,Tc);
	  HAL_UART_Transmit(&huart2, buff, strlen(buff), 100);
	  HAL_Delay(100);



   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }
using Newtonsoft.Json.Linq; //네임스페이스 추가

private void button1_Click(object sender, EventArgs e)
        {
            //접속버튼 클릭
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = 115200;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                //수신버퍼 클리어
                serialPort1.ReadExisting();
                MessageBox.Show("접속완료!");
            }
        }


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //STM32가 데이터를 전송했다!
            string data = serialPort1.ReadLine();
            richTextBox1.Text += data + "\n";
            //데이터를 해석하려면 json parser가 필요하다!
            try
            {
                JObject myjson = JObject.Parse(data);
                //key값이 sen1인 value값이 뭐냐?
                textBox2.Text = myjson["sen1"].ToString();
                textBox3.Text = myjson["sen2"].ToString();
                textBox4.Text = myjson["sen3"].ToString();
            }
            catch { }
            
        }


4.예제3에서 했던 결과에서 C#윈폼의 chart를 이용해서 꺾은선그래프를 그리시오!

/* USER CODE BEGIN 0 */
#define R1 10000
#define c1 1.009249522e-03
#define c2 2.378405444e-04
#define c3 2.019202697e-07
/* USER CODE END 0 */
//중략
/* USER CODE BEGIN 2 */
 uint16_t adc_value0 = 0;
 uint16_t adc_value1 = 0;
 uint16_t adc_value2 = 0;
 char buff[50];
 float logR2, R2, T, Tc, Tf;


 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
	  //PA0 ADC1 RANK1
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value0 = HAL_ADC_GetValue(&hadc1);
	  //PA1 ADC1 RANK2
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value1 = HAL_ADC_GetValue(&hadc1);
	  //PA4 ADC1 RANK3
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value2 = HAL_ADC_GetValue(&hadc1);
	  //온도계산
	  R2 = R1 * (4095.0 / adc_value2 - 1.0);
	  logR2 = log(R2);
	  T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
	  Tc = T - 273.15;
	  sprintf(buff,"{\"sen1\":%d,\"sen2\":%d,\"sen3\":%.2f}\n",adc_value0,adc_value1,Tc);
	  HAL_UART_Transmit(&huart2, buff, strlen(buff), 100);
	  HAL_Delay(100);



   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }
using Newtonsoft.Json.Linq; //네임스페이스 추가

private void button1_Click(object sender, EventArgs e)
        {
            //접속버튼 클릭
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = 115200;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                //수신버퍼 클리어
                serialPort1.ReadExisting();
                MessageBox.Show("접속완료!");
            }
        }


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //STM32가 데이터를 전송했다!
            string data = serialPort1.ReadLine();
            //데이터를 해석하려면 json parser가 필요하다!
            try
            {
                JObject myjson = JObject.Parse(data);
                //key값이 sen1인 value값이 뭐냐?
                textBox2.Text = myjson["sen1"].ToString();
                textBox3.Text = myjson["sen2"].ToString();
                textBox4.Text = myjson["sen3"].ToString();

                UInt16 sen1 = UInt16.Parse(myjson["sen1"].ToString());
                UInt16 sen2 = UInt16.Parse(myjson["sen2"].ToString());
                float sen3 = Single.Parse(myjson["sen3"].ToString());

                chart1.Series[0].Points.AddY(sen1);
                chart1.Series[1].Points.AddY(sen2);
                chart1.Series[2].Points.AddY(sen3);
            }
            catch { }
            
        }


5.예제4에서 그래프는 계속 데이터가 누적되는 방식이라서 결국 화면상에 보여지는 그래프가 너무 촘촘해진다! x축을 기준으로 50개의 데이터만 유지하고 큐와 동일하게 제일 처음 들어온 데이터는 51개가 되는 순간 빠지도록 하시오!

/* USER CODE BEGIN 0 */
#define R1 10000
#define c1 1.009249522e-03
#define c2 2.378405444e-04
#define c3 2.019202697e-07
/* USER CODE END 0 */
//중략
/* USER CODE BEGIN 2 */
 uint16_t adc_value0 = 0;
 uint16_t adc_value1 = 0;
 uint16_t adc_value2 = 0;
 char buff[50];
 float logR2, R2, T, Tc, Tf;


 /* USER CODE END 2 */

 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
	  //PA0 ADC1 RANK1
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value0 = HAL_ADC_GetValue(&hadc1);
	  //PA1 ADC1 RANK2
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value1 = HAL_ADC_GetValue(&hadc1);
	  //PA4 ADC1 RANK3
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value2 = HAL_ADC_GetValue(&hadc1);
	  //온도계산
	  R2 = R1 * (4095.0 / adc_value2 - 1.0);
	  logR2 = log(R2);
	  T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
	  Tc = T - 273.15;
	  sprintf(buff,"{\"sen1\":%d,\"sen2\":%d,\"sen3\":%.2f}\n",adc_value0,adc_value1,Tc);
	  HAL_UART_Transmit(&huart2, buff, strlen(buff), 100);
	  HAL_Delay(100);



   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }
using Newtonsoft.Json.Linq; //네임스페이스 추가

private void button1_Click(object sender, EventArgs e)
        {
            //접속버튼 클릭
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = 115200;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                //수신버퍼 클리어
                serialPort1.ReadExisting();
                MessageBox.Show("접속완료!");
            }
        }


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //STM32가 데이터를 전송했다!
            string data = serialPort1.ReadLine();
            //데이터를 해석하려면 json parser가 필요하다!
            try
            {
                JObject myjson = JObject.Parse(data);
                //key값이 sen1인 value값이 뭐냐?
                textBox2.Text = myjson["sen1"].ToString();
                textBox3.Text = myjson["sen2"].ToString();
                textBox4.Text = myjson["sen3"].ToString();

                UInt16 sen1 = UInt16.Parse(myjson["sen1"].ToString());
                UInt16 sen2 = UInt16.Parse(myjson["sen2"].ToString());
                float sen3 = Single.Parse(myjson["sen3"].ToString());

                //지금 데이터 갯수가 50개보다 많다면 1개 뺀다
                if(chart1.Series[0].Points.Count > 50)
                {
                    chart1.Series[0].Points.RemoveAt(0);
                    chart1.Series[0].Points.AddY(sen1);
                    chart1.Series[1].Points.AddY(sen2);
                    chart1.Series[2].Points.AddY(sen3);
                }
                else
                {
                    chart1.Series[0].Points.AddY(sen1);
                    chart1.Series[1].Points.AddY(sen2);
                    chart1.Series[2].Points.AddY(sen3);
                }
            }
            catch { }
        }


6.I2C통신으로 측정된 온습도센서인 AHT-10의 값을 C#윈폼 화면에 출력하시오!(기본 데이터 형식은 JSON형식으로 하도록 함)

/* USER CODE BEGIN 2 */
 uint8_t AHT10_TmpHum_Cmd[3] = {0xAC, 0x33, 0x00};
 uint8_t AHT10_RX_Data[6];
 uint32_t AHT10_ADC_Raw;
 float AHT10_Temperature;
 float AHT10_Humidity;
 char str[100];
 /* USER CODE END 2 */

/* USER CODE BEGIN WHILE */
 while (1)
 {
	  //요청
	  HAL_I2C_Master_Transmit(&hi2c1, (0x38 << 1), AHT10_TmpHum_Cmd, 3, 10);
	  //수신대기
	  uint8_t recv[1];
	  while(1){
		  HAL_I2C_Master_Receive(&hi2c1, (0x38 << 1), recv, 6, 10);
		  if(~recv[0] & 0x80){
			  break;
		  }
	  }
	  //데이터 수신
	  HAL_I2C_Master_Receive(&hi2c1, (0x38 << 1), AHT10_RX_Data, 6, 10);
	  //수신데이터 출력
	  AHT10_ADC_Raw = (((uint32_t)AHT10_RX_Data[3] & 15) << 16) | ((uint32_t)AHT10_RX_Data[4] << 8) | AHT10_RX_Data[5];
	  AHT10_Temperature = (float)(AHT10_ADC_Raw * 200.00 / 1048576.00) - 50.00;
	  /* Convert to Relative Humidity in % */
	  AHT10_ADC_Raw = ((uint32_t)AHT10_RX_Data[1] << 12) | ((uint32_t)AHT10_RX_Data[2] << 4) | (AHT10_RX_Data[3] >> 4);
	  AHT10_Humidity = (float)(AHT10_ADC_Raw*100.00/1048576.00);
	  sprintf(str,"{\"temp\":%.2f,\"humi\":%.2f}\n",AHT10_Temperature,AHT10_Humidity);
	  HAL_UART_Transmit(&huart2,str,strlen(str),100);
	  HAL_Delay(1000);
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }
using Newtonsoft.Json.Linq; //네임스페이스 추가

private void button1_Click(object sender, EventArgs e)
        {
            //접속버튼 클릭
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = 115200;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                //수신버퍼 클리어
                serialPort1.ReadExisting();
                MessageBox.Show("접속완료!");
            }
        }


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //STM32가 데이터를 전송했다!
            string data = serialPort1.ReadLine();
            richTextBox1.Text += data + "\n";
            //데이터 해석
            try
            {
                JObject myjson = JObject.Parse(data);
                textBox2.Text = myjson["temp"].ToString();
                textBox3.Text = myjson["humi"].ToString();
            }
            catch { }
        }


7.예제6에서 측정된 온도와 습도값을 listview를 이용해서 table형식으로 출력하되 측정이 된 시간을 함께 출력하시오!

/* USER CODE BEGIN 2 */
 uint8_t AHT10_TmpHum_Cmd[3] = {0xAC, 0x33, 0x00};
 uint8_t AHT10_RX_Data[6];
 uint32_t AHT10_ADC_Raw;
 float AHT10_Temperature;
 float AHT10_Humidity;
 char str[100];
 /* USER CODE END 2 */

/* USER CODE BEGIN WHILE */
 while (1)
 {
	  //요청
	  HAL_I2C_Master_Transmit(&hi2c1, (0x38 << 1), AHT10_TmpHum_Cmd, 3, 10);
	  //수신대기
	  uint8_t recv[1];
	  while(1){
		  HAL_I2C_Master_Receive(&hi2c1, (0x38 << 1), recv, 6, 10);
		  if(~recv[0] & 0x80){
			  break;
		  }
	  }
	  //데이터 수신
	  HAL_I2C_Master_Receive(&hi2c1, (0x38 << 1), AHT10_RX_Data, 6, 10);
	  //수신데이터 출력
	  AHT10_ADC_Raw = (((uint32_t)AHT10_RX_Data[3] & 15) << 16) | ((uint32_t)AHT10_RX_Data[4] << 8) | AHT10_RX_Data[5];
	  AHT10_Temperature = (float)(AHT10_ADC_Raw * 200.00 / 1048576.00) - 50.00;
	  /* Convert to Relative Humidity in % */
	  AHT10_ADC_Raw = ((uint32_t)AHT10_RX_Data[1] << 12) | ((uint32_t)AHT10_RX_Data[2] << 4) | (AHT10_RX_Data[3] >> 4);
	  AHT10_Humidity = (float)(AHT10_ADC_Raw*100.00/1048576.00);
	  sprintf(str,"{\"temp\":%.2f,\"humi\":%.2f}\n",AHT10_Temperature,AHT10_Humidity);
	  HAL_UART_Transmit(&huart2,str,strlen(str),100);
	  HAL_Delay(1000);
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }
using Newtonsoft.Json.Linq; //네임스페이스 추가

//전역변수자리
 int cnt = 1;

private void button1_Click(object sender, EventArgs e)
        {
            //접속버튼 클릭
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = 115200;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                //수신버퍼 클리어
                serialPort1.ReadExisting();
                MessageBox.Show("접속완료!");
            }
        }


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //STM32가 데이터를 전송했다!
            string data = serialPort1.ReadLine();
            //데이터 해석
            try
            {
                JObject myjson = JObject.Parse(data);
                textBox2.Text = myjson["temp"].ToString();
                textBox3.Text = myjson["humi"].ToString();

                //데이터 삽입
                ListViewItem lvi = new ListViewItem();
                lvi.Text = cnt.ToString();
                lvi.SubItems.Add(myjson["temp"].ToString());
                lvi.SubItems.Add(myjson["humi"].ToString());
                lvi.SubItems.Add(DateTime.Now.ToString());
                listView1.Items.Add(lvi);
                cnt++;
            }
            catch { }
        }


8.예제3에서 아날로그값 3종과 예제6에서 온습도값 2종을 모두 C#에 전송해서 listview에 현재 시간을 포함해서 출력하시오!(1초간격)

/* USER CODE BEGIN 0 */
#define R1 10000
#define c1 1.009249522e-03
#define c2 2.378405444e-04
#define c3 2.019202697e-07
/* USER CODE END 0 */

/* USER CODE BEGIN 2 */
 uint16_t adc_value0 = 0;
 uint16_t adc_value1 = 0;
 uint16_t adc_value2 = 0;
 float logR2, R2, T, Tc, Tf;
 uint8_t AHT10_TmpHum_Cmd[3] = {0xAC, 0x33, 0x00};
 uint8_t AHT10_RX_Data[6];
 uint32_t AHT10_ADC_Raw;
 float AHT10_Temperature;
 float AHT10_Humidity;
 char str[100];
 /* USER CODE END 2 */


/* USER CODE BEGIN WHILE */
 while (1)
 {
	  //PA0 ADC1 RANK1
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value0 = HAL_ADC_GetValue(&hadc1);
	  //PA1 ADC1 RANK2
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value1 = HAL_ADC_GetValue(&hadc1);
	  //PA4 ADC1 RANK3
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 100);
	  adc_value2 = HAL_ADC_GetValue(&hadc1);
	  //온도계산
	  R2 = R1 * (4095.0 / adc_value2 - 1.0);
	  logR2 = log(R2);
	  T = (1.0 / (c1 + c2*logR2 + c3*logR2*logR2*logR2));
	  Tc = T - 273.15;

	  //요청
	  HAL_I2C_Master_Transmit(&hi2c1, (0x38 << 1), AHT10_TmpHum_Cmd, 3, 10);
	  //수신대기
	  uint8_t recv[1];
	  while(1){
		  HAL_I2C_Master_Receive(&hi2c1, (0x38 << 1), recv, 6, 10);
		  if(~recv[0] & 0x80){
			  break;
		  }
	  }
	  //데이터 수신
	  HAL_I2C_Master_Receive(&hi2c1, (0x38 << 1), AHT10_RX_Data, 6, 10);
	  //수신데이터 출력
	  AHT10_ADC_Raw = (((uint32_t)AHT10_RX_Data[3] & 15) << 16) | ((uint32_t)AHT10_RX_Data[4] << 8) | AHT10_RX_Data[5];
	  AHT10_Temperature = (float)(AHT10_ADC_Raw * 200.00 / 1048576.00) - 50.00;
	  /* Convert to Relative Humidity in % */
	  AHT10_ADC_Raw = ((uint32_t)AHT10_RX_Data[1] << 12) | ((uint32_t)AHT10_RX_Data[2] << 4) | (AHT10_RX_Data[3] >> 4);
	  AHT10_Humidity = (float)(AHT10_ADC_Raw*100.00/1048576.00);
	  sprintf(str,"{\"sen1\":%d,\"sen2\":%d,\"sen3\":%.2f,\"temp\":%.2f,\"humi\":%.2f}\n",adc_value0,adc_value1,Tc,AHT10_Temperature,AHT10_Humidity);
	  HAL_UART_Transmit(&huart2,str,strlen(str),100);
	  HAL_Delay(1000);
   /* USER CODE END WHILE */
   /* USER CODE BEGIN 3 */
 }
using Newtonsoft.Json.Linq; //네임스페이스 추가

//전역변수자리
 int cnt = 1;

private void button1_Click(object sender, EventArgs e)
        {
            //접속버튼 클릭
            serialPort1.PortName = textBox1.Text;
            serialPort1.BaudRate = 115200;
            serialPort1.Open();
            if (serialPort1.IsOpen)
            {
                //수신버퍼 클리어
                serialPort1.ReadExisting();
                MessageBox.Show("접속완료!");
            }
        }


private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            //STM32가 데이터를 전송했다!
            string data = serialPort1.ReadLine();
            //데이터 해석
            try
            {
                JObject myjson = JObject.Parse(data);
                textBox2.Text = myjson["temp"].ToString();
                textBox3.Text = myjson["humi"].ToString();
                textBox4.Text = myjson["sen1"].ToString();
                textBox5.Text = myjson["sen2"].ToString();
                textBox6.Text = myjson["sen3"].ToString();

                //데이터 삽입
                ListViewItem lvi = new ListViewItem();
                lvi.Text = cnt.ToString();
                lvi.SubItems.Add(myjson["temp"].ToString());
                lvi.SubItems.Add(myjson["humi"].ToString());
                lvi.SubItems.Add(myjson["sen1"].ToString());
                lvi.SubItems.Add(myjson["sen2"].ToString());
                lvi.SubItems.Add(myjson["sen3"].ToString());
                lvi.SubItems.Add(DateTime.Now.ToString());
                listView1.Items.Add(lvi);
                cnt++;
            }
            catch { }
        }
반응형
Posted by 덕력킹
,