I have a project that involves two ESP8266ESP8266 and a NEO-6M GPSNEO-6M GPS module. I want to send the GPS data to the other microcontroller using ESP-NOW, however it fails to send the data although it displays the coordinates. I just want to figure out how can I send the data through ESP-NOW. I have tried putting the two microcontrollers near each other, however, the status still displays as fail. The sender code is
#include <TinyGPS++.h>
#include <ESP8266WiFi.h>
#include <espnow.h>
#include <SoftwareSerial.h>
SoftwareSerial ss(5, 4);
TinyGPSPlus gps;
int baud = 9600;
uint8_t receiverMAC[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
typedef struct struct_message {
float latitude;
float longitude;
float altitude;
} struct_message;
struct_message myData;
void setup() {
Serial.begin(baud);
ss.begin(baud);
WiFi.mode(WIFI_STA);
delay(100);
if (esp_now_init() != 0) {
Serial.println("ESP-NOW initialization failed!");
while (true);
}
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
if (esp_now_add_peer(receiverMAC, ESP_NOW_ROLE_SLAVE, 1, NULL, 0) != 0) {
Serial.println("Failed to add peer");
return;
}
}
void loop() {
while (ss.available() > 0) {
if (gps.encode(ss.read())) {
if (gps.location.isValid()) {
myData.latitude = gps.location.lat();
myData.longitude = gps.location.lng();
myData.altitude = gps.altitude.meters();
displayInfo();
sendData();
}
}
}
esp_now_register_send_cb(OnDataSent);
}
void OnDataSent(uint8_t * mac_addr, uint8_t sendStatus) {
Serial.print("ESP-NOW Send Status: ");
if (sendStatus == 0) {
Serial.println("Delivery success");
}
else {
Serial.println("Delivery fail");
}
}
void displayInfo() {
Serial.print("Latitude: ");
Serial.println(myData.latitude, 6);
Serial.print("Longitude: ");
Serial.println(myData.longitude, 6);
Serial.print("Altitude: ");
Serial.println(myData.altitude, 2);
}
void sendData() {
delay(100);
uint8_t result = esp_now_send(receiverMAC, (uint8_t *) &myData, sizeof(myData));
if (result != 0) {
Serial.println("Error sending data");
}
}
#include <TinyGPS++.h>
#include <ESP8266WiFi.h>
#include <espnow.h>
#include <SoftwareSerial.h>
SoftwareSerial ss(5, 4);
TinyGPSPlus gps;
int baud = 9600;
uint8_t receiverMAC[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
typedef struct struct_message {
float latitude;
float longitude;
float altitude;
} struct_message;
struct_message myData;
void setup() {
Serial.begin(baud);
ss.begin(baud);
WiFi.mode(WIFI_STA);
delay(100);
if (esp_now_init() != 0) {
Serial.println("ESP-NOW initialization failed!");
while (true);
}
esp_now_set_self_role(ESP_NOW_ROLE_CONTROLLER);
if (esp_now_add_peer(receiverMAC, ESP_NOW_ROLE_SLAVE, 1, NULL, 0) != 0) {
Serial.println("Failed to add peer");
return;
}
}
void loop() {
while (ss.available() > 0) {
if (gps.encode(ss.read())) {
if (gps.location.isValid()) {
myData.latitude = gps.location.lat();
myData.longitude = gps.location.lng();
myData.altitude = gps.altitude.meters();
displayInfo();
sendData();
}
}
}
esp_now_register_send_cb(OnDataSent);
}
void OnDataSent(uint8_t * mac_addr, uint8_t sendStatus) {
Serial.print("ESP-NOW Send Status: ");
if (sendStatus == 0) {
Serial.println("Delivery success");
}
else {
Serial.println("Delivery fail");
}
}
void displayInfo() {
Serial.print("Latitude: ");
Serial.println(myData.latitude, 6);
Serial.print("Longitude: ");
Serial.println(myData.longitude, 6);
Serial.print("Altitude: ");
Serial.println(myData.altitude, 2);
}
void sendData() {
delay(100);
uint8_t result = esp_now_send(receiverMAC, (uint8_t *) &myData, sizeof(myData));
if (result != 0) {
Serial.println("Error sending data");
}
}
whileWhile the receiver code for the other microcontroller is shown below
#include <ESP8266WiFi.h>
#include <espnow.h>
typedef struct struct_message {
float latitude;
float longitude;
float altitude;
} struct_message;
struct_message myData;
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
Serial.println("Data received!");
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Latitude: ");
Serial.println(myData.latitude, 6);
Serial.print("Longitude: ");
Serial.println(myData.longitude, 6);
Serial.print("Altitude: ");
Serial.println(myData.altitude, 2);
}
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
}
#include <ESP8266WiFi.h>
#include <espnow.h>
typedef struct struct_message {
float latitude;
float longitude;
float altitude;
} struct_message;
struct_message myData;
void OnDataRecv(uint8_t * mac, uint8_t *incomingData, uint8_t len) {
Serial.println("Data received!");
memcpy(&myData, incomingData, sizeof(myData));
Serial.print("Latitude: ");
Serial.println(myData.latitude, 6);
Serial.print("Longitude: ");
Serial.println(myData.longitude, 6);
Serial.print("Altitude: ");
Serial.println(myData.altitude, 2);
}
void setup() {
Serial.begin(9600);
WiFi.mode(WIFI_STA);
if (esp_now_init() != 0) {
Serial.println("Error initializing ESP-NOW");
return;
}
esp_now_set_self_role(ESP_NOW_ROLE_SLAVE);
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
}