Hardware/ESP

ESP-NOW 를 이용한 1:1 통신

초인로크 2024. 3. 7. 19:17
반응형

두 개의 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 이 수신된 것을 알 수 있다.

 

반응형