/*
   MODDER: @RED9030
*/
/*
   TITLE: Control de Leds de manera inalambrica mediante uso de protocolo ESPNOW (TRANSMISOR)
   SIMULATION: https://wokwi.com/projects/
   HARDWARE: ESP32
*/

//Pins 34,35,36,39 no output

/*
 *****************************************************
      LIBRERIAS
 *****************************************************
*/
//esp8266 LIBRARIES
//#include <espnow.h>
//#include <ESP8266WiFi.h>

//esp32 LIBRARIES
#include <esp_now.h>
#include <WiFi.h>

/*
 *****************************************************
      VARIABLES
 *****************************************************
*/
// Definimos los pines a utilizar
const int pin_pot = 34;   //Pin ADC con entrada del potenciometro ESP32
//const int pin_pot = A0; //Pin ADC con entrada del potenciometro ESP8266 00-A0 (lectura de analógico)

uint8_t mac_addr[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};// Reemplaza con la dirección MAC de tu Receptor 
//MAC_RECEPTOR: FF:FF:FF:FF:FF:FF

//ESTRUCTURA DE LOS DATOS TRANSMITIDOS (TRANSMISOR)
typedef struct mensaje_enviado {
  uint16_t pot;
} mensaje_enviado;

// Creamos una estructura de mensaje llamdo myData
mensaje_enviado myData;

esp_now_peer_info_t peerInfo; // obtener información del par

/*
 *****************************************************
      INICIO
 *****************************************************
*/
//NOTA: EN ESP8266 ESP_OK ES UN VALOR DE 0

void setup() {
  // Inicialización del puerto serial
  Serial.begin(115200);

  // Colocamos el dispositivo en modo estación
  WiFi.mode(WIFI_STA);
 
  // Inicialización del protocolo ESP-NOW 
  if (esp_now_init() != ESP_OK) {
      Serial.println("Error initializing ESP-NOW");
      return;
    }
  /*
  Una vez que ESPNow haya iniciado con éxito, nos registraremos 
  en SentCB para obtener el estado del paquete enviado (transmitido)
  */
  esp_now_register_send_cb(OnDataSent);//Registramos los datos enviados por el transmisor

   // Registrando módulo (par)
  memcpy(peerInfo.peer_addr, mac_addr, 6);
  peerInfo.channel = 0;  
  peerInfo.encrypt = false;
  
  // Agregando par        
  if (esp_now_add_peer(&peerInfo) != ESP_OK){
    Serial.println("Failed to add peer");
    return;
  }
  pinMode(pin_pot, INPUT);
}

/*
 *****************************************************
      REPETICIÓN
 *****************************************************
*/
void loop() {
  //Datos a enviar
  myData.pot = analogRead(pin_pot); //Leemos el potenciometro de form analógica
  Serial.print("Dato potenciometro: ");
  Serial.println(myData.pot);

  // Envia mensaje via ESP-NOW
  esp_err_t result = esp_now_send(mac_addr, (uint8_t *) &myData, sizeof(myData));

  if (result == ESP_OK) {
    Serial.println("Sent with success");
  }  else {
    Serial.println("Error sending the data");
  }
  delay(2000);

}

/*
 *****************************************************
 *    FUNCIONES
 *****************************************************
*/
// 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");
}