This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| project:esp_now [2019/05/30 18:45] – mario | project:esp_now [2019/06/01 22:58] (current) – [ToDoo] dp | ||
|---|---|---|---|
| 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 |
| - | | + | |
| U ESP-NOW-u protokolu aplikativni podaci se enkapsuliraju u specifičan okvir dobavljača, | U ESP-NOW-u protokolu aplikativni podaci se enkapsuliraju u specifičan okvir dobavljača, | ||
| + | |||
| ===== Reference o protokolu : ===== | ===== Reference o protokolu : ===== | ||
| | | ||
| - | ---- | + | |
| + | ===== 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 | ||
| + | |||
| + | ==== 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 < | ||
| + | #include < | ||
| + | |||
| + | //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 "# | ||
| + | // 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(" | ||
| + | Serial.println(WiFi.macAddress()); | ||
| + | } | ||
| + | |||
| + | void InitESPNow() { | ||
| + | if (esp_now_init() == ESP_OK) { | ||
| + | Serial.println(" | ||
| + | |||
| + | } | ||
| + | |||
| + | else { | ||
| + | Serial.println(" | ||
| + | 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, | ||
| + | esp_now_add_peer(& | ||
| + | } | ||
| + | |||
| + | //Š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, | ||
| + | Serial.print(" | ||
| + | |||
| + | if (result == ESP_OK) { | ||
| + | Serial.println(" | ||
| + | } | ||
| + | else { | ||
| + | Serial.println(" | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | === Master === | ||
| + | <file c esp_now_master.ino> | ||
| + | #define LED 14 | ||
| + | |||
| + | # | ||
| + | uint8_t peerMacAddress[6] = {0x30, 0xAE, 0xA4, 0xF8, 0x05, 0x48}; | ||
| + | |||
| + | void setup() { | ||
| + | Serial.begin(115200); | ||
| + | modeStation(); | ||
| + | InitESPNow(); | ||
| + | addPeer(peerMacAddress); | ||
| + | esp_now_register_send_cb(OnDataSent); | ||
| + | pinMode(PIN, | ||
| + | pinMode(LED, | ||
| + | readAndSend(); | ||
| + | } | ||
| + | |||
| + | void readAndSend(){ | ||
| + | uint8_t value = digitalRead(PIN); | ||
| + | send(& | ||
| + | } | ||
| + | |||
| + | |||
| + | void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) { | ||
| + | Serial.println(status == ESP_NOW_SEND_SUCCESS ? " | ||
| + | if (status == 0){digitalWrite(LED, | ||
| + | else {digitalWrite(LED, | ||
| + | readAndSend(); | ||
| + | } | ||
| + | void loop() { | ||
| + | } | ||
| + | #endif | ||
| + | </ | ||
| + | |||
| + | === Slave === | ||
| + | <file c esp_now_slave.ino> | ||
| + | #include < | ||
| + | |||
| + | // 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); | ||
| + | esp_now_register_recv_cb(onDataRecv); | ||
| + | esp_now_register_send_cb(onDataSent); | ||
| + | pinMode(PIN, | ||
| + | pinMode(LED, | ||
| + | pinMode(BUZZER_PIN, | ||
| + | } | ||
| + | |||
| + | |||
| + | void onDataRecv(const uint8_t *mac_addr, const uint8_t *value, int len) { | ||
| + | Serial.println (*value); | ||
| + | if (len > 0){digitalWrite(LED, | ||
| + | digitalWrite(PIN, | ||
| + | if (*value == 1) | ||
| + | { | ||
| + | cnt++; | ||
| + | if (cnt == 1000) | ||
| + | { | ||
| + | cnt = 0; | ||
| + | Alarm_2(); | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | } | ||
| + | |||
| + | //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 ? " | ||
| + | |||
| + | } | ||
| + | |||
| + | void Alarm_1() | ||
| + | {Door_monitor | ||
| + | tone(BUZZER_PIN, | ||
| + | noTone(BUZZER_PIN, | ||
| + | delay(100); | ||
| + | |||
| + | } | ||
| + | |||
| + | |||
| + | void Alarm_2() | ||
| + | { | ||
| + | tone(BUZZER_PIN, | ||
| + | noTone(BUZZER_PIN, | ||
| + | delay(100); | ||
| + | tone(BUZZER_PIN, | ||
| + | noTone(BUZZER_PIN, | ||
| + | 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, | ||
| + | Alarm_1(); | ||
| + | } | ||
| + | if (rcv > 100000){rcv = 0; | ||
| + | oldRcv=0; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | #endif | ||
| + | |||
| + | </ | ||
| + | ==== ToDo ==== | ||
| + | u planu: | ||
| + | * u potpunosti aktivirati enkripciju | ||
| + | * zamjeniti master-slave pozicije i dodati proceduru registracije i uparivanja slave-ova | ||
| + | |||
| + | ====== Slike ====== | ||
| + | {{: | ||
| + | {{: | ||
| + | |||