// Thingspeak.ino: comunicacao entre Arduino e a Nuvem! // // Baseado no programa esp8266_test de Mahesh Venkitachalam #include "DHT.h" #include #include int pinoLED = 13; int pinoLDR = A0; int pinoDHT = 8; int tipoDHT = DHT11; DHT dht(pinoDHT, tipoDHT); // Inicializa o sensor SoftwareSerial EspSerial(6, 7); // Inicializa a porta de comunicacao com modulo WiFi // substitua pela chave de leitura do seu canal no Thingspeak String chaveDeEscrita = "INSIRA_AQUI_SUA_CHAVE_DE_ESCRITA_DO_THINGSPEAK"; void setup() { pinMode(pinoLED, OUTPUT); Serial.begin(9600); // Comunicacao com Monitor Serial EspSerial.begin(9600); // Comunicacao com Modulo WiFi dht.begin(); EnviarComando("AT+RST", "Ready"); //Reset do Modulo WiFi } void loop() { float luminosidade = 1024.0f - analogRead(pinoLDR); // valores baixos: luminosidade baixa float umidade = dht.readHumidity(); float temperatura = dht.readTemperature(); // converte leiturasnpara String String strLuminosidade = floatToString(luminosidade); String strUmidade = floatToString(umidade); String strTemperatura = floatToString(temperatura); // Conexao com TCP com Thingspeak String cmd = "AT+CIPSTART=\"TCP\",\""; cmd += "184.106.153.149"; // Endereco IP de api.thingspeak.com cmd += "\",80"; EspSerial.println(cmd); if(EspSerial.find("Error")){ Serial.println("AT+CIPSTART error"); return; } // preparacao da string GET String getStr = "GET /update?api_key="; getStr += chaveDeEscrita; getStr +="&field1="; getStr += String(strLuminosidade); getStr +="&field2="; getStr += String(strUmidade); getStr +="&field3="; getStr += String(strTemperatura); getStr += "\r\n\r\n"; // envia o tamanho dos dados cmd = "AT+CIPSEND="; cmd += String(getStr.length()); EspSerial.println(cmd); // envia comando de GET if(EspSerial.find(">")){ EspSerial.print(getStr); } else{ EspSerial.println("AT+CIPCLOSE"); // alerta usuario Serial.println("AT+CIPCLOSE"); } Serial.println("Comando enviado ao Thingspeak:"); Serial.println(getStr); // pisca o LED a cada envio digitalWrite(pinoLED, HIGH); delay(200); digitalWrite(pinoLED, LOW); // o thingspeak precisa de pelo menos 16 segundos entre atualizacoes delay(16000); } String floatToString(float f) { char buf[16]; return dtostrf(f, 4, 1, buf); } boolean EnviarComando(String cmd, String ack){ EspSerial.println(cmd); // Envia comando "AT+" para o modulo if (!echoFind(ack)) // tempo de espera para string de ack return true; // ack vazio ou ack encontrado } boolean echoFind(String keyword){ byte current_char = 0; byte keyword_length = keyword.length(); long deadline = millis() + 5000; // Tempo de espera 5000ms while(millis() < deadline){ if (EspSerial.available()){ char ch = EspSerial.read(); Serial.write(ch); if (ch == keyword[current_char]) if (++current_char == keyword_length){ Serial.println(); return true; } } } return false; // Tempo de espera esgotado }