User Tools

Site Tools


project:esp_now

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
project:esp_now [2019/05/30 18:21]
mario created
project:esp_now [2019/06/01 22:58] (current)
dp [ToDoo]
Line 1: Line 1:
 +====== ESP-NOW ======
 ESP-NOW je protokol razvijen od Espressif, koji omogućuje višestrukim uređajima međusobno komuniciranje bez korištenja Wi-Fi mreže. Protokol je sličan 2.4GHz bežičnoj povezanosti male snage koja se često koristi u bežičnim tipkovnicama i miševima. Za  ESP-NOW je protokol razvijen od Espressif, koji omogućuje višestrukim uređajima međusobno komuniciranje bez korištenja Wi-Fi mreže. Protokol je sličan 2.4GHz bežičnoj povezanosti male snage koja se često koristi u bežičnim tipkovnicama i miševima. Za 
- komunikaciju je potrebno uparivanje između uređaja prije njihove komunikacije. Nakon što je uparivanje završeno, veza je sigurna i ravnopravna, bez potrebe za korištenje handshake-a.+ komunikaciju je potrebno uparivanje između uređaja prije njihove komunikacije. Nakon što je uparivanje završeno, veza je sigurna i ravnopravna, bez potrebe za korištenje handshake-a.   
 +U ESP-NOW-u protokolu aplikativni podaci se enkapsuliraju u specifičan okvir dobavljača, a zatim se prenose s jednog WiFi uređaja na drugi bez povezivanja. CTR s CBC-MAC protokol (CCMP) se koristi za sigurnosnu zaštitu prenošenih paketa. ESP-NOW se široko koristi za pametna svjetla, daljinsko upravljanje, prijenosu podataka senzora itd. 
 + 
 +===== Reference o protokolu : ===== 
 + [[https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/network/esp_now.html#]] 
 + 
 +===== Monitoring vrata ===== 
 +koristeći dva ESP32 Lolin boarda napravljen je mali monitoring vrata, jedan ESP na pinu 23 monitorira stanje reed relay-a kojeg okida magnet te ga proslijeđuje na slave uređaj. kada magnet nije prisutan (otvoreni kontakti) stanje pina 23 se preslikava na slave uređaju - svijetli crveni LED, te dvaput bipne, ukoliko uređaji nisu povezani ili se vrši ometanje signala slave uređaj daje niski dugi ton te zelena LED za link ne svijetli. Na master uređaju također zelena LED svijetli ukoliko nakon poslanog paketa postoji ACK informacija. 
 + 
 +==== Source Code ==== 
 + 
 +=== Door_monitor === 
 +Master čita pin, i šalje(emitira) pročitanu vrijednost. (u mom slučaju PIN 23) 
 +Slaves mijenja izlaz broadcastanog pina-(ova) kako bi odgovarao vrijednostima dobivenim od Mastera. 
 +jedan ESP32, koji je konfiguriran kao Master na event broadcasta informaciju sa MAC Adresama  
 +što znači da svi u mreži primaju podatke u isto vrijeme. 
 +praktički nema Boot-a, jer pri uključivanju i isključivanju ESP-a, operacija se nastavlja odmah. 
 + 
 +<file c Door_monitor.ino> 
 +  
 +#include <esp_now.h> 
 +#include <WiFi.h> 
 + 
 +//Pinovi koje čitamo i šaljemo vrijednost prema slave-ovima 
 +#define PIN 23 
 + 
 +//definiraj kanal za koneklciju 
 +#define CHANNEL 1 
 + 
 +// ako se kompajlira Slave - zakomentirati liniju "#define MASTER" 
 +// za Master ostaviti odkomentirano 
 +#define MASTER 
 + 
 +esp_now_peer_info_t peer; //struktura Info o slijedećem peer-u.. 
 + 
 +// Funkcija za inicijalizaciju moda  
 +void modeStation(){ 
 +                  WiFi.mode(WIFI_STA);  
 +                  Serial.print("Mac Address in Station: "); //Mac adresu ovog ESP-a kada je u načinu rada stanice 
 +                  Serial.println(WiFi.macAddress()); 
 +                  } 
 + 
 +void InitESPNow() { 
 +                       if (esp_now_init() == ESP_OK) { 
 +                          Serial.println("ESPNow Init Success"); 
 +                      
 +                      } 
 +                       
 +                      else { 
 +                          Serial.println("ESPNow Init Failed"); 
 +                          ESP.restart(); 
 +                      } 
 +                  } 
 + 
 +//Funkcija dodaje novi peer kroz svoju MAC adresu 
 +void addPeer(uint8_t *peerMacAddress){ 
 +                                          peer.channel = CHANNEL; 
 +                                          peer.encrypt = 1;            //0 = bez enkripcije; 1 = enkripcija uključena 
 +                                          memcpy(peer.peer_addr, peerMacAddress, 6); // Kopira adresu niza u strukturu 
 +                                          esp_now_add_peer(&peer); // Dodaj u Slave 
 +                                      } 
 + 
 +//Šalje vrijednost Slave-u koji ima specificiranu mac adresu 
 +void send(const uint8_t *value, uint8_t *peerMacAddress){ 
 +                                                          esp_err_t result = esp_now_send(peerMacAddress, value, sizeof(value)); 
 +                                                          Serial.print("Send Status: "); 
 +                                                          
 +                                                          if (result == ESP_OK) { 
 +                                                                                    Serial.println("Success"); 
 +                                                                                } 
 +                                                                          else { 
 +                                                                                    Serial.println("Error"); 
 +                                                                                } 
 +                                                        } 
 +</file> 
 +=== Master === 
 +<file c esp_now_master.ino> 
 +#define LED 14 
 + 
 + #ifdef MASTER 
 +uint8_t peerMacAddress[6] = {0x30, 0xAE, 0xA4, 0xF8, 0x05, 0x48};  // MAC od slave-a 
 + 
 +void setup() { 
 +                Serial.begin(115200); 
 +                modeStation(); 
 +                InitESPNow(); 
 +                addPeer(peerMacAddress); 
 +                esp_now_register_send_cb(OnDataSent); // funkcija se izvršava on DataSent 
 +                pinMode(PIN, INPUT); 
 +                pinMode(LED, OUTPUT); 
 +                readAndSend();    // čita vrijednost pina i šalje 
 +              } 
 + 
 +void readAndSend(){ 
 +                    uint8_t value = digitalRead(PIN); 
 +                    send(&value, peerMacAddress); // pošalji slave-u 
 +                  } 
 + 
 + 
 +void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { 
 +                                                                        Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Success" : "Fail"); 
 +                                                                        if (status == 0){digitalWrite(LED, HIGH);} 
 +                                                                        else {digitalWrite(LED, LOW);} 
 +                                                                        readAndSend(); 
 +                                                                       } 
 +void loop() { 
 +
 +#endif 
 +</file> 
 + 
 +=== Slave === 
 +<file c esp_now_slave.ino> 
 +#include <Tone32.h>  
 + 
 +// kompajlirat će se samo ako MASTER nije postavljen 
 +#ifndef MASTER 
 + 
 +#define LED 14 
 +#define BUZZER_PIN 16 
 +#define BUZZER_CHANNEL 0  
 +//Mac Address slave-a kojem šaljemo podatke 
 +uint8_t peerMacAddress[6] = {0x24, 0x0A, 0xC4, 0xAE, 0x08, 0x68}; // MAC mastera 
 +int cnt = 0; 
 +int rcv = 0; 
 +int oldRcv = 0; 
 +long prevTime = 0; 
 +long intv = 1000; 
 + 
 +void setup() { 
 +                Serial.begin(115200); 
 +               
 +                modeStation(); 
 +                InitESPNow(); 
 +                addPeer(peerMacAddress); // dodavanje Slave-a 
 +                esp_now_register_recv_cb(onDataRecv); // na event primanja podataka 
 +                esp_now_register_send_cb(onDataSent);  // vraća povratni info 
 +                pinMode(PIN, OUTPUT); 
 +                pinMode(LED, OUTPUT);  
 +                pinMode(BUZZER_PIN, OUTPUT); 
 +              } 
 + 
 + 
 +void onDataRecv(const uint8_t *mac_addr, const uint8_t *value, int len) { 
 +                                                                          Serial.println (*value); 
 +                                                                          if (len > 0){digitalWrite(LED, HIGH); } // kod prvog paljenja ako master nije prisutan ne svijetli link 
 +                                                                          digitalWrite(PIN, *value); 
 +                                                                               if (*value == 1) 
 +                                                                                                 { 
 +                                                                                                  cnt++; 
 +                                                                                                  if (cnt == 1000) 
 +                                                                                                              { 
 +                                                                                                                cnt = 0; 
 +                                                                                                                Alarm_2();                     
 +                                                                                                              } 
 +                                                                                                 } 
 +                                                                           rcv++; 
 +                                                                           } 
 + 
 +//vraća povratnu informaicju samo u dvosmjernoj komunikaciji 
 +void onDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { 
 +                                                                          Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Success" : "Fail"); 
 +                                                                  
 +                                                                        } 
 + 
 +void Alarm_1() 
 +              {Door_monitor 
 +                tone(BUZZER_PIN, NOTE_D4, 250, BUZZER_CHANNEL); 
 +                noTone(BUZZER_PIN, BUZZER_CHANNEL); 
 +                delay(100); 
 +            
 +                } 
 + 
 + 
 +void Alarm_2() 
 +              { 
 +                tone(BUZZER_PIN, NOTE_C8, 100, BUZZER_CHANNEL); 
 +                noTone(BUZZER_PIN, BUZZER_CHANNEL); 
 +                delay(100); 
 +                tone(BUZZER_PIN, NOTE_C8, 100, BUZZER_CHANNEL); 
 +                noTone(BUZZER_PIN, BUZZER_CHANNEL); 
 +                delay(100); 
 +                          
 +                } 
 +void loop() {  
 +              unsigned long currentTime = millis(); 
 +              if(currentTime - prevTime > intv) { 
 +                                                  prevTime =  currentTime; 
 +                                                  if (rcv > oldRcv) 
 +                                                                { 
 +                                                                  oldRcv = rcv; 
 +                                                                 } 
 +                                                                  else if (rcv <= oldRcv) 
 +                                                                                          { 
 +                                                                                            digitalWrite(LED, LOW); 
 +                                                                                            Alarm_1(); 
 +                                                                                            } 
 +                                                      if (rcv > 100000){rcv = 0; 
 +                                                                        oldRcv=0; 
 +                                                                        } 
 +                                                } 
 +            } 
 +#endif 
 + 
 +</file> 
 +==== ToDo ==== 
 +u planu:  
 + * u potpunosti aktivirati enkripciju 
 + * zamjeniti master-slave pozicije i dodati proceduru registracije i uparivanja slave-ova 
 + 
 +====== Slike ====== 
 +{{:project:20190528_091944_resized.jpg?400|}} Slave u kutiji{{:project:20190528_091952_resized.jpg?400|}} dodana LiPo baterija 
 +{{:project:20190528_094124_resized.jpg?400|}} oba složena  
 + 
 + 
project/esp_now.1559233295.txt.gz · Last modified: 2019/05/30 18:21 by mario