반응형
두 개의 ESP32를 이용하여서
각각의 스위치가 눌려질 때,
상대의 ESP32에서 수신 결과가 보이도록 연습 프로그래밍 해 보았다.
1. 라이브러리 설정: ESP-NOW를 사용하기 위해서는 아래의 두 종류의 헤더를 포함할 필요가 있다.
#include <esp_now.h>
#include <WiFi.h>
2. 맥 어드레스의 설정: 각각의 ESP에 아래의 소스코드를 업로드 한 뒤에 맥 어드레스를 확인한다.
#include "WiFi.h"
void setup(){
Serial.begin(115200);
WiFi.mode(WIFI_MODE_STA);
Serial.println(WiFi.macAddress());
}
void loop(){
}
출력되는 맥 어드레스를 아래의 배열에 입력 해 줄 필요가 있다.
예를 들어 [AA:AA:AA:AA:AA:AA] 으로 출력이 되었을 경우에는 아래와 같이 입력한다.
// MAC address >
uint8_t broadcastAddress[] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
3. 기본설정: peer에 관한 정보를 저장하는 변수를 설정한다.
esp_now_peer_info_t peerInfo;
기타 소스코드에 필요한 변수를 여기서 설정 해 준다.
4. 데이터 송신에 관한 함수를 설정한다.
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
}
5. 데이터 수신에 관한 함수를 설정한다.
void OnDataRecv(const uint8_t *mac, const uint8_t *recvData, int len) {
memcpy(&buf[0], recvData, len);
buf[len]='\0'; //문자열 마지막에 눌 설정
Serial.print("buf : ");
Serial.println(buf);
}
6. setup() 함수안에 ESP 관련 설정을 넣어준다.
void setup() {
//
Serial.begin(115200);
WiFi.mode(WIFI_STA);
pinMode(SW,INPUT);
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
}
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
if (esp_now_add_peer(&peerInfo) != ESP_OK){
Serial.println("Failed to add peer");
return;
}
esp_now_register_send_cb(OnDataSent);
esp_now_register_recv_cb(OnDataRecv);
}
7. loop() 함수 안에 버튼이 눌렸을 경우의 동작을 설정한다.
void loop() {
//버튼 값 읽기
int readValue = digitalRead(SW);
Serial.println(readValue);
//버튼이 눌렸을때 데이터를 송신한다. if(readValue == 0){
data = 1;
sprintf(buf,"%d",data);
memcpy(LED,buf,strlen(buf));
//ESP-NOW를 이용한 데이서 송신
esp_err_t result = esp_now_send(broadcastAddress, LED, sizeof(buf));
//송수신 성공 실패에 따른 동작 설정
if (result == ESP_OK) {
Serial.println("success");
}
else {
Serial.println("Error");
}
}
delay(100);
}
이 정도만 설정하면 서로 통신이 가능 해 진다.
위와 같이 버튼이 눌렸을 때의 값 1 이 수신된 것을 알 수 있다.
반응형