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.
 
Burayada eklerseniz, konu bütünlüğü açısından daha iyi olur.
 
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
 
Kod:
#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));
}
 
Kod:
#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));
}
 
Kod:
#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.

Kod:
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.

Kod:
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.

Kod:
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.

Kod:
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.

Kod:
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
Kod:
 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
7,235
Mesajlar
122,422
Üyeler
2,924
Son üye
aytu

Son kaynaklar

Son profil mesajları

Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
Freemont2.0 posta Freemont2.0 wrote on posta's profile.
Merhabalar :)
az bilgili çok meraklı
Prooffy semih_s Prooffy wrote on semih_s's profile.
Merhaba, sizden DSO2C10 hakkında bilgi rica ettim. Yanıtlarsanız sevinirim...
Unal taydin Unal wrote on taydin's profile.
Timur Bey, Arduino kontrollü bir akü şarj cihazı yapmaya çalışıyorum. Aklımdaki fikri basit bir çizim olarak konu açmıştım. Özellikle sizin fikirlerinizi çok önemsiyorum.
Back
Top