#define BLYNK_PRINT Serial
/* Fill in information from Blynk Device Info here */
#define BLYNK_TEMPLATE_ID "TMPL60lRn6Af-"
#define BLYNK_TEMPLATE_NAME "ĐỒ ÁN 1"
#define BLYNK_AUTH_TOKEN "78FU476pBdZNuFCr_0lO82HwdyzyEegV"
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <esp_now.h>
#include <WiFi.h>
#include "EEPROM.h"
int addr = 0;
#define EEPROM_SIZE 1
BlynkTimer timer;
const char* ssid = "XUYEN";
const char* pass = "0909867501";
const int led_Blynk = 5;
const int led_EspNow_Nhan = 2;
const int led_EspNow_Phat = 4;
int interval = 5000;
unsigned long previousMillis;
BLYNK_WRITE(V0) {
float c = param.asInt();
int PWM = map(c, 0, 100, 0, 255);
analogWrite(led_Blynk, PWM);
Serial.println(param.asInt());
EEPROM.write(addr, param.asInt());
EEPROM.commit();
Serial.println("Hello from Blynk");
//Serial.print("PWM : ");
// Serial.println(PWM);
// Lưu trữ biến vào EEPROM
}
BLYNK_CONNECTED() {
//Blynk.syncAll();
Blynk.syncVirtual(V0);
}
// REPLACE WITH YOUR RECEIVER MAC Address
uint8_t broadcastAddress[] = { 0xB8, 0xF0, 0x09, 0xCD, 0x30, 0xD0 };
float Blynk_Duty_Cycle = 0;
float Slave_Duty_Cycle = 0;
float Slave_Voltage = 0;
float Slave_PWM_Value = 0;
typedef struct struct_message {
float Slave_Duty_Cycle;
float Slave_Voltage;
float Slave_PWM_Value;
} struct_message;
struct_message Du_lieu_nhan;
typedef struct struct_remessage {
float Blynk_Duty_Cycle;
} struct_remessage;
struct_remessage Du_lieu_gui;
esp_now_peer_info_t peerInfo;
// callback when data is sent
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
Serial.print("\r\nLast Packet Send Status:\t");
Serial.println(status == ESP_NOW_SEND_SUCCESS ? "Delivery Success" : "Delivery Fail");
if (status == 0) {
digitalWrite(led_EspNow_Phat, HIGH);
delay(50);
digitalWrite(led_EspNow_Phat, LOW);
} else {
digitalWrite(led_EspNow_Phat, LOW);
}
}
void OnDataRecv(const uint8_t *mac, const uint8_t *incomingData, int len) {
memcpy(&Du_lieu_nhan, incomingData, sizeof(Du_lieu_nhan));
Serial.print("Bytes received: ");
Serial.println(len);
Slave_Duty_Cycle = Du_lieu_nhan.Slave_Duty_Cycle;
Slave_Voltage = Du_lieu_nhan.Slave_Voltage;
Slave_PWM_Value = Du_lieu_nhan.Slave_PWM_Value;
digitalWrite(led_EspNow_Nhan, HIGH);
delay(50);
digitalWrite(led_EspNow_Nhan, LOW);
Serial.print("Slave_Duty_Cycle: ");
Serial.print(Slave_Duty_Cycle);
Serial.println(" %");
Serial.print("Slave_Voltage: ");
Serial.print(Slave_Voltage);
Serial.println(" V");
Serial.print("Slave_PWM_Value: ");
Serial.print(Slave_PWM_Value);
Serial.println(" ");
}
void setup() {
Serial.begin(115200);
Serial.println("start...");
if (!EEPROM.begin(EEPROM_SIZE)) {
Serial.println("failed to initialise EEPROM");
delay(1000);
return;
}
// Init Serial Monitor
pinMode(led_Blynk, OUTPUT);
pinMode(led_EspNow_Nhan, OUTPUT);
pinMode(led_EspNow_Phat, OUTPUT);
WiFi.mode(WIFI_AP_STA);
previousMillis = millis();
// Init ESP-NOW
if (esp_now_init() != ESP_OK) {
Serial.println("Error initializing ESP-NOW");
return;
} else {
digitalWrite(led_EspNow_Phat, HIGH);
}
// Once ESPNow is successfully Init, we will register for Send CB to
// get the status of Trasnmitted packet
esp_now_register_send_cb(OnDataSent);
// Register peer
memcpy(peerInfo.peer_addr, broadcastAddress, 6);
peerInfo.channel = 0;
peerInfo.encrypt = false;
// Add peer
if (esp_now_add_peer(&peerInfo) != ESP_OK) {
Serial.println("Failed to add peer");
return;
}
// Register for a callback function that will be called when data is received
esp_now_register_recv_cb(OnDataRecv);
}
void loop() {
unsigned long currentMillis = millis();
if ((unsigned long)(currentMillis - previousMillis) < interval) {
unsigned long currentMillis = millis();
Serial.println("__________________________________ESP NOW MODE_______________________");
// Set device as a Wi-Fi Station
WiFi.disconnect();
//WiFi.mode(WIFI_STA);
WiFi.mode(WIFI_AP_STA);
//digitalWrite(led_Blynk, LOW);
// Set values to send
Du_lieu_gui.Blynk_Duty_Cycle = EEPROM.read(addr);
// Send message via ESP-NOW
esp_err_t result = esp_now_send(broadcastAddress, (uint8_t *)&Du_lieu_gui, sizeof(Du_lieu_gui));
delay(100);
if (result == ESP_OK) {
Serial.println("Sent with success");
digitalWrite(led_EspNow_Phat, HIGH);
delay(50);
digitalWrite(led_EspNow_Phat, LOW);
} else {
Serial.println("Error sending the data");
digitalWrite(led_EspNow_Phat, LOW);
}
}
if ((unsigned long)(currentMillis - previousMillis) > interval && (unsigned long)(currentMillis - previousMillis) < interval * 2)
{
Serial.println("__________________________________BLYNK CONNECT MODE_______________________");
digitalWrite(led_EspNow_Nhan, LOW);
if ((unsigned long)(currentMillis - previousMillis) < (unsigned int)(interval + 1500)) {
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
} else {
Blynk.run();
int data = EEPROM.read(addr);
Serial.print("Blynk PWM is : ");
Serial.println(data);
Blynk.virtualWrite(V1, Slave_Duty_Cycle);
Blynk.virtualWrite(V2, Slave_Voltage);
Blynk.virtualWrite(V3, Slave_PWM_Value);
}
}
if ((unsigned long)(currentMillis - previousMillis) >= interval * 2) {
previousMillis = millis();
WiFi.disconnect();
}
// Reset bộ đếm thời gian sau 1 ngày (chống tràn)
if (millis() == 24*60*60)
{
ESP.restart();
}
Serial.print(currentMillis);
Serial.print(" - ");
Serial.println(previousMillis);
delay(200);
}