[STM32#17] STM32쉴드에 붙어있는 각종 센서값을 C# winform에게 전송하고 UI에 출력하는 방법 알아보기!(녹칸다 내맘대로 STM32)
프로그래밍/STM32 2025. 12. 8. 23:11
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 { }
}

