Adicionar vídeo do YouTube em uma página PHP

Wroom - LED com esquema de ligar e desligar

Descrição da imagem

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>


// Configuração global da rede wi-fi
const char* ssid = "***";
const char* password = "***";
int btnGPIO = 0;
int btnState = false;
/*
Pinos GPIO Disponíveis:
GPIO 2
GPIO 4 a GPIO 21
GPIO 34 a GPIO 39 (Alguns destes podem ter funções especiais)
*/

// Configuração global da api
const char* FKhorta = "***"; // MODIFICAR ESTA LINHA......
const char* apikey = "***"; // MODIFICAR ESTA LINHA......

// Protótipos das funções
int enviar(int inFKsensor, float inValor, int posicaoSensorLista);
void compararEnviar(int posicaoSensorLista, float valor, float diferenca);
void verifiqueInternetReconecte(int espera);
int getchanges(int FKsensor);
void conectar();

// Estrutura para informações de sensores
struct SensorInfo {
  int FK;
  int success;
  float lastValue;
  int pin;
};

const int totalSensores = 2; // possui 'totalSensores+1' posições começando do índice zero.
SensorInfo sensorLista[totalSensores];


void configureSensors() {
  // Configurar sensores aqui
  float valueConsideredNull = -10000;

  // Valor aleatório INDEX 0
  sensorLista[0] = {39, 1, valueConsideredNull, 4}; 
  pinMode(sensorLista[0].pin, OUTPUT);  // Configura o pino do LED como saída
}


int lastStatusChange = -1;  // Valor inicial, pode ser 0 ou 1 dependendo do seu caso
int contadorLoop = 0;  // Variável contadora

void setup() {
  configureSensors();
  void conectar();
  delay(2000);

  //RESGATAR O STATUS ANTERIOR AO REINICIAR.(ATÉ 15 DIAS)
  int inicial = getchanges(sensorLista[0].FK);
  if (inicial == 1){
    digitalWrite(sensorLista[0].pin, HIGH); 
  }else{
    digitalWrite(sensorLista[0].pin, LOW);
  }

}

void loop() {
  verifiqueInternetReconecte(2000);

  // Obter o novo valor de statuschange
  int novoStatusChange = getchanges(sensorLista[0].FK);

  // Verificar se houve uma mudança no valor
  if (novoStatusChange != lastStatusChange) {
    // Atualizar o último valor
    lastStatusChange = novoStatusChange;

    // Tomar ação com base no novo valor
    if (lastStatusChange == 0) {
      // Desligar o LED
      Serial.println("Desligado.....");
      digitalWrite(sensorLista[0].pin, LOW);
      compararEnviar(0, lastStatusChange, 0);
    } else if (lastStatusChange == 1) {
      // Ligar o LED
      Serial.println("Ligado.....");
      digitalWrite(sensorLista[0].pin, HIGH);
      compararEnviar(0, lastStatusChange, 0);
    }
  }
  // A cada 60 iterações do loop enviar status.
  contadorLoop++;
  if (contadorLoop >= 60) {
    compararEnviar(0, lastStatusChange, 0);
    contadorLoop = 0;  // Reinicia o contador
  }

  delay(1000);
}


// Se não tiver Internet reestabelecer conexão após 2 segundos.
void verifiqueInternetReconecte(int espera) {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.print("Sem internet. Tentar conexão em ");
    Serial.print(espera);
    Serial.println(" segundos...");
    delay(espera);
    conectar();
  }
}

/*
Envia dados do sensor para um determinado ID
*/
void compararEnviar(int sensorIndex, float valor, float limite) {

  float temp[3] = {sensorLista[sensorIndex].FK, sensorLista[sensorIndex].success, sensorLista[sensorIndex].lastValue};

  float FKsensor = temp[0];
  float sucesso = temp[1];
  float anterior = temp[2];
      
  if (abs(valor - anterior) >= limite) {
    int result = enviar(FKsensor, valor, sensorIndex);
    if (result == 1) {
      sensorLista[sensorIndex].success = 1;
      sensorLista[sensorIndex].lastValue = valor;
    }
  } else {
      // Não envia
      Serial.println("Diferença pequena no sensor de ID:" + String(FKsensor));
  }
}


/*
* Conecta ao wi-fi
*/
void conectar() {
  Serial.begin(9600);
  delay(100);
  pinMode(btnGPIO, INPUT);

  Serial.print("[WiFi] Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);

  int tryDelay = 500;
  int numberOfTries = 20;

  while (true) {
    switch (WiFi.status()) {
      case WL_NO_SSID_AVAIL:
        Serial.println("[WiFi] SSID not found");
        break;
      case WL_CONNECT_FAILED:
        Serial.print("[WiFi] Failed - WiFi not connected! Reason: ");
        return;
        break;
      case WL_CONNECTION_LOST:
        Serial.println("[WiFi] Connection was lost");
        break;
      case WL_SCAN_COMPLETED:
        Serial.println("[WiFi] Scan is completed");
        break;
      case WL_DISCONNECTED:
        Serial.println("[WiFi] WiFi is disconnected");
        break;
      case WL_CONNECTED:
        Serial.println("[WiFi] WiFi is connected!");
        Serial.print("[WiFi] IP address: ");
        Serial.println(WiFi.localIP());
        return;
        break;
      default:
        Serial.print("[WiFi] WiFi Status: ");
        Serial.println(WiFi.status());
        break;
    }
    delay(tryDelay);

    if (numberOfTries <= 0) {
      Serial.print("[WiFi] Failed to connect to WiFi!");
      WiFi.disconnect();
      return;
    } else {
      numberOfTries--;
    }
  }
}


int getchanges(int FKsensor) {
  // Faça a requisição HTTP
  HTTPClient http;

  // Informe a URL desejada
  String url = "https://horta.gvsoftwares.com.br/api/get_sensoresstatuschange/?FKsensor=" + String(FKsensor);
  http.begin(url);

  // Obtenha e imprima o código de status da resposta
  int httpCode = http.GET();
  Serial.print("Código de Status HTTP: ");
  Serial.println(httpCode);

  // Inicialize a variável de retorno
  int statusChange = -1;  // Defina um valor padrão

  // Se a resposta for bem-sucedida, analise o JSON
  if (httpCode > 0) {
    String payload = http.getString();
    Serial.println("Resposta do servidor: ");
    Serial.println(payload);

    // Tamanho suficiente para armazenar o JSON
    const size_t capacity = JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(1) + 10;
    // Aloque o JSONBuffer
    DynamicJsonDocument doc(capacity);
    // Deserializar a string JSON
    DeserializationError error = deserializeJson(doc, payload);

    // Verificar erros de desserialização
    if (error) {
      Serial.print(F("Erro ao desserializar JSON: "));
      Serial.println(error.c_str());
    } else {
      // Obter o valor da chave "statuschange"
      statusChange = doc[0]["statuschange"];
    }
  }

  http.end();

  return statusChange;  // Retorna o valor, mesmo que seja o padrão -1 em caso de erro
}


/*
* Enviar os dados para a api.
*/
int enviar(int inFKsensor, float inValor, int sensorIndex) {
  btnState = digitalRead(btnGPIO);

  if (btnState == LOW) {
    Serial.println("[WiFi] Disconnecting from WiFi!");
    if (WiFi.disconnect(true, false)) {
      Serial.println("[WiFi] Disconnected from WiFi!");
    }
    delay(1000);
  }

  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;

    String data_to_send = "apikey=" + String(apikey) + "&FKhorta=" + String(FKhorta) + "&FKsensor=" + String(inFKsensor) + "&c=" + String(inValor);
    //Serial.println(data_to_send);
    http.begin("https://horta.gvsoftwares.com.br/api/set_leiturapost/");
    http.addHeader("Content-type", "application/x-www-form-urlencoded; charset=utf-8");
    int codigo_resposta = http.POST(data_to_send);

    if (codigo_resposta > 0) {
      Serial.println("Código HTTP -> " + String(codigo_resposta));

      if (codigo_resposta == 200) {
        String corpo_resposta = http.getString();
        Serial.println("O servidor Respondeu:");
        Serial.println(corpo_resposta);
        sensorLista[sensorIndex].success= 1;
        sensorLista[sensorIndex].lastValue = inValor;
        return 1;
      }
    } else {
      Serial.println("Erro ao enviar POST:");
      Serial.println(codigo_resposta);
      sensorLista[sensorIndex].success = 0;
      return 0;
    }

    http.end();

  } else {
    Serial.println("Erro na conexão WIFI.");
    sensorLista[sensorIndex].success = 0;
    return 0;
  }
}