뎁스_3233

뎁스_3233

도움이 필요합니다...ㅠㅠ

뎁스_3233뎁스_3233· 4개월

질문아두이노와 stm32사이의 통신 방법에대해 도움을 청합니다ㅠㅠ

#include <Wire.h> //LCD I2C 통신 사용 #include <LiquidCrystal_I2C.h> //LCD I2C 통신 사용 #include "sound_effect.h" // 사운드 이펙트 사용(음원효과) LiquidCrystal_I2C lcd(0x27, 16, 2); //LCD 주소 할당 int blue_pin = 2; //블루 LED int green_pin = 3; //그린 LED int red_pin = 4; //레드 LED int pin = 8; //먼지센서 int buzzer_pin = 13; //부저 unsigned long duration; //지속 시간 unsigned long starttime; //시작 시간 unsigned long sampletime_ms = 5000; //샘플시간 5초 마다 업데이트 unsigned long lowpulseoccupancy = 0; //Low 신호가 지속된 시간을 초기화 float ratio = 0; //비율 float concentration = 0; //입자 농도 0으로 초기화 float pcsPerCF = 0; //한 입자당 CF를 0으로 초기화 float ugm3 = 0; //최종 값으로 세제곱미터 당 마이크로 그램(㎍/㎥) uint8_t clock[8] = { 0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0 }; // 시계 이모티콘 void setup() { Serial.begin(9600); //시리얼 통신 시작 pinMode(8, INPUT); //미세먼지 센서 입력 pinMode(2, OUTPUT); //블루 LED 출력 pinMode(3, OUTPUT); //그린 LED 출력 pinMode(4, OUTPUT); //레드 LED 출력 pinMode(13, OUTPUT); //부저 출력 digitalWrite(blue_pin, HIGH); //애노드 RGB LED 이므로 HIGH이면 꺼진다.(이하 2개 동일) digitalWrite(green_pin, HIGH); digitalWrite(red_pin, HIGH); starttime = millis(); //현재 시간 대입 lcd.begin(); //LCD 시작 lcd.backlight(); //백라이트 ON lcd.clear(); //LCD 초기화 lcd.print("Hello! SIMP!"); //다음 문자를 LDC에 출력 lcd.setCursor(0, 1); //두 번째 줄로 커서 이동 lcd.print("I will find DUST"); lcd.createChar(1, clock); //시계 이모티콘 출력 seSqueak(13); //초기시작 음원효과 delay(5000); // 5초 대기 if (ugm3 == 0) { //만약 결과값이 0보다 작으면 아래를 LCD에 출력한다. lcd.clear(); lcd.print("Analysing Data"); lcd.write(1); lcd.setCursor(0, 1); lcd.print("................"); lowpulseoccupancy = 0; starttime = millis(); } } void loop() { duration = pulseIn(pin, LOW); lowpulseoccupancy = lowpulseoccupancy + duration; if ((millis() - starttime) >= sampletime_ms) { //만약 샘플 시간이 5초라면(위에서 정한 샘플 시간) ratio = lowpulseoccupancy / (sampletime_ms10 .0); // 정수 백분율 concentration = 1.1 pow(ratio, 3) - 3.8 pow(ratio, 2) + 520 ratio + 0.62; // 미세먼지 센서 사양 시트 곡선 사용 pcsPerCF = concentration * 100; // 입자 농도에 100을 곱하면 입자당 CF값 ugm3 = pcsPerCF / 13000; //입자당 CF를 13000으로 나누면 미터세제곱당 마이크로그람의 미세먼지 측정값 if (ugm3 > 0.01) { // 만약에 결과값이 0.01보다 크면 미세먼지 값을 출력하라 lcd.clear(); lcd.print("Dust:"); lcd.print(ugm3); lcd.print("ug/m3"); Serial.print("ugm3: "); Serial.println(ugm3); delay(1000); lowpulseoccupancy = 0; starttime = millis(); } if (ugm3 > 0.01 && ugm3 <= 30) { //만약 미세먼지 값이 0.01 보다 크고 30이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Good! ^v^"); setColor(0, 0, 225); //블루 noTone(13); //소리 끔 } else if (ugm3 > 30 && ugm3 <= 80) { //만약 미세먼지 값이 30보다 크고 80이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("SoSo! ^ ^;"); setColor(0, 255, 225); //블루그린 noTone(13); //소리 끔 } else if (ugm3 > 80 && ugm3 <= 150) { //만약 미세먼지 값이 80보다 크고 150이랑 같거나 작으면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Bad! T.T"); setColor(255, 120, 0); //오렌지 noTone(13); //소리 끔 } else if (ugm3 > 150) { //만약 미세먼지 값이 150 보다 크면 아래를 출력 lcd.setCursor(0, 1); lcd.print("Be Careful @.@"); setColor(255, 0, 0); //레드 tone(13, 500); //500Hz로 소리 재생 } } } void setColor(int red, int green, int blue) { //RGB LED 출력을 위한 아날로그 출력 세팅 analogWrite(red_pin, 255 - red); analogWrite(green_pin, 255 - green); analogWrite(blue_pin, 255 - blue); } 위에 코드는 아두이노의 코드 입니다 아래의 코드는 아두이노에서 stm32로 송신하는 코드입니다 아두이노 TX랑 STM32 RX랑 연결하였습니다 혹시 송신 방법이 이게 맞을까요? Serial.print("ugm3: "); Serial.println(ugm3); delay(1000);
74
1
0
윈비
윈비·2024-12-11
아두이노와 STM32의 TX와 RX 핀을 연결했다면, 아래 사항들을 확인해보세요. 아두이노와 STM32의 GND 핀을 반드시 연결해야 합니다. 아두이노와 STM32 모두 9600bps로 설정되어야 합니다. 아두이노가 5V 논리 레벨을 사용하고 STM32가 3.3V 레벨을 사용한다면, 레벨 변환기를 사용하는 것이 안전합니다.
뎁스_3233뎁스_3233· 4개월

질문아두이노에서 미세먼지 값을 stm32f10x로 받을 수 있는방법이 있나요...?

밑에는 STM32코드입니다! IAR Embedded Workbench IDE 프로그램 사용합니다 getch함수로 받을수 있다는데 어떻게 해야할지 모르겠습니다... #include "stm32f10x_lib.h" #include "System_func.h" #include"lib_sensor.h" #include"lcd.h" #include"user_delay.h" u8 a=0; void print_data(char* str, u16 data); void putch(unsigned char c){ USART_SendData(USART1, c); while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); } void puts(u8 *s){ while (*s != '\0'){ putch(*s); s ++; } } unsigned char getch(){ unsigned char key = 0; while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET); key = USART_ReceiveData(USART1); return key; } int main(void){ Init_STM32F103(); EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef USART_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; u16 tempC,tempF; Timer_Delay_init(); lcdInit(); custom(); initialize_sht11_hanback(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_USART1| RCC_APB2Periph_AFIO, ENABLE); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; GPIO_Init(GPIOB, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_InitStructure.USART_Clock = USART_Clock_Disable; USART_InitStructure.USART_CPOL = USART_CPOL_Low; USART_InitStructure.USART_CPHA = USART_CPHA_2Edge; USART_InitStructure.USART_LastBit = USART_LastBit_Disable; USART_Init(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = 0xFF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQChannel; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0); GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line1; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); while (1){ if(a==0){ lcdGotoXY(1,0); lcdPrint("PRESS 1 BUTTON!"); lcdDataWrite(0x00); lcdGotoXY(1,1); lcdPrint("PRESS 2 BUTTON!"); lcdDataWrite(0x01); } else if(a==1){ tempC = get_sht11_hanback_data(TEMP); tempF = tempC*5/9+320; delay_ms(100); lcdGotoXY(1,0); print_data("TempC : ",tempC); lcdDataWrite(0x00); lcdGotoXY(1,1); print_data("TempF : ",tempF); lcdDataWrite(0x01); } else if(a==2){ lcdClear(); } else; } } void print_data(char* str, u16 data){ lcdPrint(str); lcdDataWrite(data/100 + '0'); lcdDataWrite((data/10)%10 + '0'); lcdDataWrite('.'); lcdDataWrite((data)%10 + '0'); } 사진에 보이시는 것 처럼 stm32에 ugm3를 아두이노에서 보낸 미세먼지 값입니다ㅠㅠ 어떻게 이 ugm3값을 받을 수 있을까요...
79
3
0
윈비
윈비·2024-12-10
데이터가 문자열 형태로 전송되므로, STM32에서 문자열 처리를 추가해야 합니다. char buffer[16]; // 데이터를 저장할 버퍼 int index = 0; void USART_Receive_String() { while (1) { unsigned char received = getch(); // 1바이트 수신 ...