Boa Noite pessoal, iniciei esta semana um projecto com Arduino Uno e Ethernet Shield WIZNET, o projecto basicamente é o sensor DHT22 e BMP180 que enviam informação da temperatura na rua, humidade, pressão etç para o ThingSpeak, o problema é que as vezes a estação liga-se a rede outras vezes não.
No serial diz a Estação ligou-se a rede com DHCP, e ela nao se liga aparecendo depois falha na conecção.
Outras vezes liga-se ao fim de algumas tentativas.
Vou postar codigo aqui. Obrigado
//Estação Metereológica SPT V1.0 Ethernet Shield
//Baseado em envio de dados para Thingspeak
#include "DHT.h"
#include <SPI.h>
#include <Ethernet.h>
#include <Adafruit_BMP085.h>
#include <Wire.h>
#define DHTPIN 2
#define DHTTYPE DHT22
Adafruit_BMP085 bmp;
// Definicões do sensor : pino, tipo
DHT dht(DHTPIN, DHTTYPE);
// Definições da Rede Local
byte mac[] = { 0xD4, 0x28, 0xB2, 0xFF, 0xA0, 0xA1 }; // Deve ser o unico na Rede LOCAL
byte ip[] = { 192, 168, 1, 200 }; // Must be unique on local network
byte gateway[] = { 192, 168, 1, 254 };
byte subnet[] = { 255, 255, 255, 0 };
// Initialize Arduino Ethernet Client
EthernetClient client;
// Definições ThingSpeak
char thingSpeakAddress[] = "api.thingspeak.com";
String writeAPIKey = "NN20KMC0QB71XFDG";
const int updateThingSpeakInterval = 16 * 1000; // Tempo intervalo em Milisegundos ThingSpeak (Numero de Segundos * 1000 = interval)
// Configuração Varíavel
long lastConnectionTime = 0;
boolean lastConnected = false;
int failedCounter = 0;
void setup()
{
// Arranca a Porta Serial para Debug no Monitor Serial
Serial.begin(9600);
dht.begin();
bmp.begin();
// Arranca a Placa Ethernet
startEthernet();
}
void loop()
{
// Leitura da Humidade
float h = dht.readHumidity();
// Leitura da temperatura (Celsius)
float t = dht.readTemperature();
//Leitura Temperatura BMP180
float b = bmp.readTemperature();
//Leitura da Altitude do BMP180
float a = bmp.readAltitude();
//Leitura de Pressão
float p = bmp.readPressure();
//Leitura de Altitude Real
float ra = bmp.readAltitude(101500);
//Altitude Relação ao Mar
float am = bmp.readSealevelPressure();
// Verifica se o sensor esta respondendo
if (isnan(h) || isnan(t))
{
Serial.println("Falha ao ler dados do Sensor DHT22");
return;
}
// Faz a leitura do Valor de Temperatura e Humidade
String analogValue0 = String(t);
String analogValue1 = String(h);
String analogValue2 = String(b);
String analogValue3 = String(a);
String analogValue4 = String(p);
String analogValue5 = String(ra);
String analogValue6 = String(am);
//Serial.println(t);
//Serial.println(b);
//Serial.println(ra);
//Serial.println(am);
// delay(3000);
// Mostra a actualização do Sensor
if (client.available())
{
char c = client.read();
Serial.print(c);
}
// Desliga-se do ThingSpeak
if (!client.connected() && lastConnected)
{
Serial.println("...Desligado");
Serial.println();
client.stop();
}
// Actualiza o Thingspeak
if(!client.connected() && (millis() - lastConnectionTime > updateThingSpeakInterval))
{
//updateThingSpeak("field1="+analogValue0);
//updateThingSpeak("field2="+analogValue1);
//updateThingSpeak("field3="+analogValue2);
//updateThingSpeak("field4="+analogValue3);
updateThingSpeak("field1="+analogValue0+"&field2="+analogValue1+"&field3="+analogValue2+"&field4="+analogValue3+"&field5="+analogValue4+"&field6="+analogValue5+"&field7="+analogValue6);
}
// Check if Arduino Ethernet needs to be restarted
if (failedCounter > 3 ) {startEthernet();}
lastConnected = client.connected();
}
void updateThingSpeak(String tsData)
{
if (client.connect(thingSpeakAddress, 80))
{
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+writeAPIKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
lastConnectionTime = millis();
if (client.connected())
{
Serial.println("Connecting to ThingSpeak...");
Serial.println();
failedCounter = 0;
}
else
{
failedCounter++;
Serial.println("A conecção com o Servidor falhou... ("+String(failedCounter, DEC)+")");
Serial.println();
}
}
else
{
failedCounter++;
Serial.println("Conecção com o servidor falhou, tentaiva ("+String(failedCounter, DEC)+")");
Serial.println();
lastConnectionTime = millis();
}
}
void startEthernet()
{
client.stop();
Serial.println("Conectar a Estação a rede...");
Serial.println();
delay(1000);
// Connect to network amd obtain an IP address using DHCP
if (Ethernet.begin(mac) == 0)
{
Serial.println("DHCP Failed, reset Arduino to try again");
Serial.println();
}
else
{
Serial.println("A Estação ligou-se a rede usando DHCP");
Serial.println();
}
delay(1000);
}