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

Katılım
1 Temmuz 2024
Mesajlar
16
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.


Kullandığım kart
DENEYAP MİNİ V2 2ADET VERİCİ KARTLAR
DENEYAP 1A V2 1 ADET ALICI KART
 
Gönreilen bilgiler ve alınan bilgiler...
Gönderici çok adet ise alıcı istemeden bilgi göndermemesi gerekir göndericinin.
Master ve slave..
Server - Clind olayına bi çalışmanı öneririm.
Server (Slave) hizmetçidir. Hizmet istendiğinde ancak o hizmeti vermelidir.
Yoksa trafik kaosu ortaya çıkar.
Yok eğer sdadece dinleme modunda çalışacaksa Master (Clind) ID tanımlamalısın gönderilen datalara ki kimin gönderdiğini anlayasın.
Bozuk yada çakışmalı bilgi gelirse ki bu çok olabilir...
Doğru bilgi gelmedikçe yenisinin gelmesini bekleyeceksin. Bilgi doğrulamada checksum kullanabilirsin.
 
Gönreilen bilgiler ve alınan bilgiler...
Gönderici çok adet ise alıcı istemeden bilgi göndermemesi gerekir göndericinin.
Master ve slave..
Server - Clind olayına bi çalışmanı öneririm.
Server (Slave) hizmetçidir. Hizmet istendiğinde ancak o hizmeti vermelidir.
Yoksa trafik kaosu ortaya çıkar.
Yok eğer sdadece dinleme modunda çalışacaksa Master (Clind) ID tanımlamalısın gönderilen datalara ki kimin gönderdiğini anlayasın.
Bozuk yada çakışmalı bilgi gelirse ki bu çok olabilir...
Doğru bilgi gelmedikçe yenisinin gelmesini bekleyeceksin. Bilgi doğrulamada checksum kullanabilirsin.
kodları atsam yardımcı olurmusunuz
 
Projenin ilgili kısımlarının kodlarını paylaşırsanız daha isabetli cevaplar verilebilir.
 
Kodlarınız eklerken forumdaki şekildeki kod ekleme aracını kullanırsanız kodlarınızın okunurluğu daha iyi olacaktır.

firefox_o5IhHbP5vg.png
 
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));
}
 
verici2:
#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.nabiziki=deger1;
    myData.spoiki=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
}
 
Aktif olarak ESP kullanmıyorum ama gözüme çarpan husus göndericilerde SEND işlemini delay kullanmadan sürekli yapıyorsunuz. Gönderme işlemini aşağıdaki gibi düzenlerseniz probleminiz büyük ihtimal çözülmüş olacak.

Gönderici Taslak:
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)); // Parantez içerisine alındı
    }

}
 
Birde mesaj yapınıza verinin hangi cihazdan geldiğini ayrıştıracak bir yapı ekleyin. Alıcı tarafda gelen verileri ayrıştırmak için işinize yarar.
Tabi örnekdeki istasyon_id değerini her verici için farklı olacak şekilde atama yapmayı unutmayın.

C:
typedef struct struct_message {
  int istasyon_id; //  <<--- Örnek
  int nabiz;
  int spo;
  int nabiziki;
  int spoiki;
} struct_message;
 
Aktif olarak ESP kullanmıyorum ama gözüme çarpan husus göndericilerde SEND işlemini delay kullanmadan sürekli yapıyorsunuz. Gönderme işlemini aşağıdaki gibi düzenlerseniz probleminiz büyük ihtimal çözülmüş olacak.

Gönderici Taslak:
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)); // Parantez içerisine alındı
    }

}
tamamdır deneyip size döneceğim çok teşekkür ederim sizinle nasıl iletişime gecebilirim yardım almak için tabi isterseniz.
 
Birde mesaj yapınıza verinin hangi cihazdan geldiğini ayrıştıracak bir yapı ekleyin. Alıcı tarafda gelen verileri ayrıştırmak için işinize yarar.
Tabi örnekdeki istasyon_id değerini her verici için farklı olacak şekilde atama yapmayı unutmayın.

C:
typedef struct struct_message {
  int istasyon_id; //  <<--- Örnek
  int nabiz;
  int spo;
  int nabiziki;
  int spoiki;
} struct_message;
yani alıcıda istasyon id 1 ise şunu yaz 2 ise şunu yazmı if ile yapıp
 
Aktif olarak ESP kullanmıyorum ama gözüme çarpan husus göndericilerde SEND işlemini delay kullanmadan sürekli yapıyorsunuz. Gönderme işlemini aşağıdaki gibi düzenlerseniz probleminiz büyük ihtimal çözülmüş olacak.

Gönderici Taslak:
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)); // Parantez içerisine alındı
    }

}
denedim fakat hayla sıfır giriyor şimdi istasyon sistemi yapacağım ama nasıl yapmalıyım
 
tamamdır deneyip size döneceğim çok teşekkür ederim sizinle nasıl iletişime gecebilirim yardım almak için tabi isterseniz.

Forum üzerinden sorularınızı sorabilirsiniz. Bu sayede daha fazla kişi sorunuzu görür ve cevap alma ihtimaliniz artar, aynı problemle karşılaşanlar da bu konuyu görür onlarda çözüme ulaşmış olur :)
 
Forum üzerinden sorularınızı sorabilirsiniz. Bu sayede daha fazla kişi sorunuzu görür ve cevap alma ihtimaliniz artar, aynı problemle karşılaşanlar da bu konuyu görür onlarda çözüme ulaşmış olur :)
evet haklısınız diğer insanlarda bu sayede çözüm bulur fakat hayla sıfır giriyor istasyon için örnek atabilirmisiniz
 
Forum üzerinden sorularınızı sorabilirsiniz. Bu sayede daha fazla kişi sorunuzu görür ve cevap alma ihtimaliniz artar, aynı problemle karşılaşanlar da bu konuyu görür onlarda çözüme ulaşmış olur :)
şöyle bir sistem yaptım sizce nasıl şimdi sıfır girmiyor ama veriler geç geliyor biraz
alici:
 if(myData.istasyon_id==1){
    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.display();
    delay(2000);
  }else if(myData.istasyon_id==2){
    display.clearDisplay();
    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();
    delay(2000);
 

Forum istatistikleri

Konular
6,214
Mesajlar
105,866
Üyeler
2,584
Son üye
Mekatro_nik

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top