#include #include #include #include #define DHT_SENSOR_PIN 21 #define DHT_SENSOR_TYPE DHT11 DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE); /// Configuração global da api const char* FKhorta = "****"; // MODIFICAR ESTA LINHA...... const char* apikey = "*******************************************"; // MODIFICAR ESTA LINHA...... // Configuração global da rede wi-fi const char* ssid = "*****"; // MODIFICAR ESTA LINHA...... const char* password = "******"; // MODIFICAR ESTA LINHA...... int btnGPIO = 0; int btnState = false; // 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); void conectar(); int solenoideLigada(int pin); // Estrutura para informações de sensores struct SensorInfo { int FK; int success; float lastValue; int pin; }; const int totalSensores = 3;// MODIFICAR ESTA LINHA SE ADICIONAR OUTROS SENSORES....... // possui 'totalSensores+1' posições começando do índice zero. SensorInfo sensorLista[totalSensores]; void configureSensors() { // Configurar sensores aqui float valueConsideredNull = -10000; dht_sensor.begin(); // Sensor de temperatura DHT INDEX 0 sensorLista[0] = {46, 1, valueConsideredNull, -1}; // MODIFICAR ESTA LINHA. ID 29 // -1 indica que não usa pino específico // Sensor de umidade DHT INDEX 1 sensorLista[1] = {49, 1, valueConsideredNull, -1};// MODIFICAR ESTA LINHA. ID 30 // -1 indica que não usa pino específico // Sensor de solenoide INDEX 3 sensorLista[2] = {52, 1, valueConsideredNull, 33}; // MODIFICAR ESTA LINHA. ID 32 - PORTA IO 33 pinMode(sensorLista[2].pin, INPUT); } void setup() { Serial.begin(9600); delay(100); configureSensors(); conectar(); } void loop() { verifiqueInternetReconecte(2000); // Sensor de temperatura DHT INDEX 0 float readTempC = dht_sensor.readTemperature(); // ler temperatura em Graus Celsius. compararEnviar(0, readTempC, 0.2); // Sensor de umidade DHT INDEX 1 float readUmidade = dht_sensor.readHumidity(); /*ler umidade em %*/ compararEnviar(1, readUmidade, 2); // Sensor de solenoide INDEX 2 int readSolenoide = 0; readSolenoide = solenoideLigada(sensorLista[2].pin); compararEnviar(2, readSolenoide, 1); 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() { 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--; } } } /* verifica se a valvula solenoide está energizada. (código não está retomando a voltagem correta (110v resulta em 6,9), mas é possível para saber se está ligada ou não.) */ int solenoideLigada(int pin) { int insolenoide = 0; float medida = 0.0; float medida2 = 0.0; int i = 0; for (int i = 0; i < 10000; i++) { float abc = analogRead(pin); medida = medida + abc; //acumulado medida medida2 = medida2 + (abc * abc); //acumulado ao quadrado. } float media = (medida / 10000.0); float RMS = ((sqrt(medida2 / 10000.0)) - media) * 0.624256838; if (RMS < 5) { insolenoide = 0; } else { insolenoide = 1; } return insolenoide; } /* * 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; } }