SWDesk/Firmware
[Arduino] ESP32 nano에서 WiFi 전송과 GPIO 컨트롤을 동시에 하는 방법
bizmaker
2025. 3. 13. 05:30
* FreeTROS 이용
isDataReady인 경우에 valueString을 WiFi를 통해 전송
WiFi 전송 중에서 GPIO 제어에 시간 지연이 발생하지 않음.
[예제 코드]
#include <WiFi.h>
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
WiFiServer server(80);
#define LED_PIN 2 // GPIO2를 LED 제어 핀으로 사용
// 🔹 공유 변수 (WiFiTask와 GPIOTask에서 사용)
volatile bool isDataReady = false; // 데이터 준비 여부
String valueString = ""; // WiFi로 전송할 데이터
void WiFiTask(void *parameter);
void GPIOTask(void *parameter);
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
// 🔹 WiFi Task 실행 (Core 0)
xTaskCreatePinnedToCore(WiFiTask, "WiFiTask", 4096, NULL, 1, NULL, 0);
// 🔹 GPIO Task 실행 (Core 1)
xTaskCreatePinnedToCore(GPIOTask, "GPIOTask", 1024, NULL, 1, NULL, 1);
}
void loop() {
// 메인 루프는 비워두거나 다른 작업 가능
}
// 🔹 WiFi Task (Core 0에서 실행)
void WiFiTask(void *parameter) {
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi...");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi Connected!");
server.begin();
while (true) {
WiFiClient client = server.available();
// 🔸 isDataReady가 true이면 데이터를 WiFi로 전송
if (isDataReady) {
if (client) {
Serial.println("Sending data: " + valueString);
client.println(valueString);
client.stop(); // 클라이언트 연결 종료
}
isDataReady = false; // 데이터 전송 후 플래그 초기화
}
delay(100); // WiFi Task 실행 주기 설정
}
}
// 🔹 GPIO Task (Core 1에서 실행)
void GPIOTask(void *parameter) {
while (true) {
// 🔸 GPIO를 주기적으로 제어 (예: LED 깜박임)
digitalWrite(LED_PIN, HIGH);
delay(500);
digitalWrite(LED_PIN, LOW);
delay(500);
// 🔸 특정 조건 충족 시 데이터 전송 준비
if (millis() % 5000 < 1000) { // 5초마다 한 번 실행
valueString = "Sensor Value: " + String(random(100, 200)); // 임의 데이터 생성
isDataReady = true; // 데이터 준비 완료
Serial.println("Data Ready: " + valueString);
}
}
}
[테스트 결과]

반응형