ESP-NOW ile 2 farklı karttan tek karta veri aktarımı sırasında aralara 0 değeri girmesi sorunu.

efe ali

Üye
Katılım
28 Haz 2024
Mesajlar
4
Puanları
1
Yaş
24
Merhaba bir proje üzerinde çalışma yapıyorum fakat esp now ile 2 cihazdaki sensörden aldığım veriyi alıcı karta gönderimde aralara sıfır değeri giriyor yani atıyorum 1. kart 10 değeri göndersin 2. kart 25 alıcı kart bunu ekrana ilk 1 saniye 10 yazıyor sonra 0 a dönüyor ve bu sürekli tekrar ediyor aynısı 25 değeri gönderende de oluyor fakat tek cihaz aktif iken yani 10 gönderen çalışırken 25 gönderen kapalı iken alıcı bu 10 değerini sorunsuz alıyor araya sıfır girmiyor bunu nasıl çözerim yardımcı olursanız sevinirim.

verici 1
#include "esp_now.h"
#include "WiFi.h"
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "MAX30100_PulseOximeter.h"

// EKRAN TANIMLAMA
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define REPORTING_PERIOD_MS 2500

//NABIZ SENSÖRÜ TANIMLAMA
PulseOximeter pox;
uint32_t tsLastReport = 0;
int deger1,deger2;
//nabız algılandığında
void onBeatDetected()
{
Serial.println("Nabız Algılandı.");
}

uint8_t broadcastAddress[] = {0xF4, 0x12, 0xFA, 0xDF, 0x73, 0x6C}; // ALICI kartın MAC adresi


typedef struct struct_message {
int nabiz;
int spo;
int nabiziki;
int spoiki;
} struct_message;


struct_message myData;


esp_now_peer_info_t peerInfo;


void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
//Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Veri gönderme başarılı" : "Veri gönderme başarısız");
}

void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);


if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW başlatılamadı");
return;
}


esp_now_register_send_cb(OnDataSent);


memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;


if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Eşleşme başarısız");
return;
}
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}

pox.setOnBeatDetectedCallback(onBeatDetected);


}
void loop() {
pox.update();

if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
deger1=int(pox.getHeartRate());
deger2=int(pox.getSpO2());
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Nabiz:");
display.setTextSize(1);
display.setCursor(0,20);
display.print("SPO2:");
display.setTextSize(2);
display.setCursor(70,0);
display.print(int(pox.getHeartRate()));
display.setTextSize(1);
display.setCursor(35,20);
display.print(int(pox.getSpO2()));
display.display();
myData.nabiz=deger1;
myData.spo=deger2;
Serial.print(deger1);
Serial.println(" Nabiz Değeri 1");
Serial.print(deger2);
Serial.println(" Spo2 Değeri 1");
tsLastReport = millis();
}
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
}

verici 2
#include "esp_now.h"
#include "WiFi.h"
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include "MAX30100_PulseOximeter.h"

// EKRAN TANIMLAMA
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define REPORTING_PERIOD_MS 2500

//NABIZ SENSÖRÜ TANIMLAMA
PulseOximeter pox;
uint32_t tsLastReport = 0;
int deger1,deger2;
//nabız algılandığında
void onBeatDetected()
{
Serial.println("Nabız Algılandı.");
}

uint8_t broadcastAddress[] = {0xF4, 0x12, 0xFA, 0xDF, 0x73, 0x6C}; // ALICI kartın MAC adresi


typedef struct struct_message {
int nabiz;
int spo;
int nabiziki;
int spoiki;
} struct_message;


struct_message myData;


esp_now_peer_info_t peerInfo;


void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
//Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Veri gönderme başarılı" : "Veri gönderme başarısız");
}

void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_STA);


if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW başlatılamadı");
return;
}


esp_now_register_send_cb(OnDataSent);


memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;


if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Eşleşme başarısız");
return;
}
if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
if (!pox.begin()) {
Serial.println("FAILED");
for(;;);
} else {
Serial.println("SUCCESS");
}

pox.setOnBeatDetectedCallback(onBeatDetected);


}
void loop() {
pox.update();

if (millis() - tsLastReport > REPORTING_PERIOD_MS) {
deger1=int(pox.getHeartRate());
deger2=int(pox.getSpO2());
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.print("Nabiz:");
display.setTextSize(1);
display.setCursor(0,20);
display.print("SPO2:");
display.setTextSize(2);
display.setCursor(70,0);
display.print(int(pox.getHeartRate()));
display.setTextSize(1);
display.setCursor(35,20);
display.print(int(pox.getSpO2()));
display.display();
myData.nabiz=deger1;
myData.spo=deger2;
Serial.print(deger1);
Serial.println(" Nabiz Değeri 1");
Serial.print(deger2);
Serial.println(" Spo2 Değeri 1");
tsLastReport = millis();
}
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *) &myData, sizeof(myData));
}
alici
#include "WiFi.h"
#include "esp_now.h"
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

const uint8_t kalp[] PROGMEM = {
// 'kalp', 35x35px
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
0x01, 0xc0, 0x00, 0x03, 0xfc, 0x07, 0xf0, 0x00, 0x07, 0xff, 0x0f, 0xfc, 0x00, 0x0f, 0xff, 0x3f,
0xfe, 0x00, 0x0f, 0xff, 0xff, 0xfe, 0x00, 0x1f, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff,
0x00, 0x1f, 0xfb, 0xfb, 0xff, 0x00, 0x1f, 0xf3, 0xf9, 0xff, 0x00, 0x1f, 0xf3, 0xf9, 0xff, 0x00,
0x0f, 0xf1, 0xb1, 0xfe, 0x00, 0x0f, 0xf5, 0x94, 0xfe, 0x00, 0x07, 0xe5, 0x96, 0xfc, 0x00, 0x00,
0x0d, 0x86, 0x00, 0x00, 0x01, 0xfc, 0x2f, 0xf0, 0x00, 0x00, 0xfe, 0x7f, 0xe0, 0x00, 0x00, 0x7e,
0x7f, 0xc0, 0x00, 0x00, 0x3e, 0x7f, 0x80, 0x00, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x0f, 0xfe,
0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xf8, 0x00, 0x00, 0x00, 0x01, 0xf0, 0x00,
0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

typedef struct struct_message {
int nabiz;
int spo;
int nabiziki;
int spoiki;
} struct_message;

struct_message myData;

void OnDataRecv(const uint8_t * mac, const uint8_t *incomingData, int len) {
memcpy(&myData, incomingData, sizeof(myData));
//neopixelWrite(RGBLED, 100, 0, 0); // Burada neopixel kontrolü yapılıyor
display.clearDisplay();
//display.drawBitmap(50, 15, kalp, 35, 35, 1);
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(10, 10);
display.print(myData.nabiz);
display.setTextSize(2);
display.setCursor(10, 40);
display.print(myData.spo);
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(45, 10);
display.print(myData.nabiziki);
display.setTextSize(2);
display.setCursor(45, 40);
display.print(myData.spoiki);
display.display();
Serial.println("Nabiz2 ");
Serial.print(myData.nabiz);
Serial.print("spo2 ");
Serial.print(myData.spo);
Serial.print(" ");
Serial.print("Nabiz2 ");
Serial.print(myData.nabiziki);
Serial.print("spo2 ");
Serial.print(myData.spoiki);
}

void setup() {
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
WiFi.mode(WIFI_STA);

// OLED ekranı başlatma
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 ekranı başlatılamadı"));
for(;;);
}


if (esp_now_init() != ESP_OK) {
Serial.println("ESP-NOW başlatılamadı");
return;
}
esp_now_register_recv_cb(OnDataRecv);

}

void loop() {
// main loop kodu buraya gelebilir
}
Kullandığım kart
DENEYAP MİNİ V2 2ADET VERİCİ KARTLAR
DENEYAP 1A V2 1 ADET ALICI KART
 
Son düzenleme:
Kodunuz uzun, ancak şunlar önerilebilir.
Bu durum ESP-NOW veri gönderim protokolünden veya koddaki bir hatadan kaynaklanabilir.
İki cihazın verilerini doğru bir şekilde alıcı karta göndermek ve sıfır değerlerini engellemek için aşağıdaki adımları deneyebilirsiniz:

1. Her iki verici cihazın da veri gönderim sıklığını azaltarak aynı anda veri gönderimini engelleyin.
Verici cihazlar arasında bir zaman farkı oluşturabilirsiniz.

2. Her iki verici cihazın da gönderdiği veri yapısına cihaz ID'si veya bir cihaz tanımlayıcısı ekleyin.
Alıcı cihaz bu tanımlayıcıya göre verileri ayırt edebilir.

3. Alıcı cihazda gelen veriyi doğrulayan ve zaman aşımı kontrolü yapan bir kod ekleyin.
Örneğin, belirli bir süre boyunca veri gelmezse veya beklenmeyen bir veri alınırsa bu durumu loglayın.

Ayrıca:
Hata Ayıklama ve Loglama yapılabilir.
Tüm cihazlarda seri monitörü kullanarak gönderilen ve alınan verileri kontrol edin.
Bu, hataları ve sıfır değerlerin nedenini bulmanıza yardımcı olacaktır.

Bağlantı Durumu kontrolü yapılabilir:
Cihazların bağlantı durumu ve veri gönderim başarı durumlarını kontrol edin.
Başarısız veri gönderimlerini tekrar denemek faydalı olabilir.
 
Son düzenleme:
Kodunuz uzun, ancak şunları önerilebilir.
Bu durum ESP-NOW veri gönderim protokolünden veya koddaki bir hatadan kaynaklanabilir.
İki cihazın verilerini doğru bir şekilde alıcı karta göndermek ve sıfır değerlerini engellemek için aşağıdaki adımları deneyebilirsiniz:

1. Her iki verici cihazın da veri gönderim sıklığını azaltarak aynı anda veri gönderimini engelleyin.
Verici cihazlar arasında bir zaman farkı oluşturabilirsiniz.

2. Her iki verici cihazın da gönderdiği veri yapısına cihaz ID'si veya bir cihaz tanımlayıcısı ekleyin.
Alıcı cihaz bu tanımlayıcıya göre verileri ayırt edebilir.

3. Alıcı cihazda gelen veriyi doğrulayan ve zaman aşımı kontrolü yapan bir kod ekleyin.
Örneğin, belirli bir süre boyunca veri gelmezse veya beklenmeyen bir veri alınırsa bu durumu loglayın.

Ayrıca:
Hata Ayıklama ve Loglama yapılabilir.
Tüm cihazlarda seri monitörü kullanarak gönderilen ve alınan verileri kontrol edin.
Bu, hataları ve sıfır değerlerin nedenini bulmanıza yardımcı olacaktır.

Bağlantı Durumu kontrolü yapılabilir:
Cihazların bağlantı durumu ve veri gönderim başarı durumlarını kontrol edin.
Başarısız veri gönderimlerini tekrar denemek faydalı olabilir.
şu şekilde yaptım istasyon id adında değişken tanımladım esp now a ve cihazlara id ler verdim 1 ve 2 diye alıcı cihazada 1 ise istasyon 2 saniye 1inci cihazın verisini göster eğer 2 ise 2 saniye 2ci cihazın verisini göster şeklinde yaptım ama iki veriyide aynı anda ekranda göstermeye kaltığımda gine sıfırlar giriyor vericiler verileri sorunsuz gönderiyor ama alıcının seri portunu atayım buraya bi inceleyin ve bana bir cözüm yolu konusunda yardımcı olursanız çok mutlu olurum:)

Kod:
18:54:15.705 -> SPO 2 : 95
18:54:17.776 -> Nabiz 1: 0
18:54:17.776 -> SPO : 0
18:54:17.776 -> Nabiz 2: 45
18:54:17.776 -> SPO 2 : 95
18:54:19.755 -> Nabiz 1: 0
18:54:19.755 -> SPO : 0
18:54:19.755 -> Nabiz 2: 0
18:54:19.755 -> SPO 2 : 0
18
 
Görünüşe göre veriler düzgün gönderiliyor ancak alıcı cihazda bir senkronizasyon veya veri işleme sorunu yaşanıyor.
İki cihazın verilerini aynı anda gösterirken sıfır değeri almamak için alıcı cihazın kodunu ve veri işleme mantığını gözden geçirmekte fayda var..

Alıcı cihazın veri alım ve ekran güncelleme kodlarını düzenleyerek iki cihazdan gelen verilerin doğru şekilde ekranda gösterilmesini sağlayabilirsiniz.

Gözden Geçirilmesi gereken kod:
Alıcı cihazın OnDataRecv fonksiyonunda gelen verileri işleyip ekranda aynı anda gösterecek şekilde düzenleme ile başlanabilir.
 
Son düzenleme:

Forum istatistikleri

Konular
130,110
Mesajlar
933,233
Kullanıcılar
453,167
Son üye
Kibooo

Yeni konular

Geri
Üst