Hola a todos, soy nuevo en arduino y estoy montando un proyecto para hacer pruebas y subir la temperatura de mi habitación a un servidor web del que dispongo, dicho servidor es un VPS completamente vacio en el que solo estoy, ahora mismo, haciendo estas pruebas.
Al código le hago un delay de 10 minutos para volver a subir la temperatura y esto es lo que me encuentro al cabo de un rato.
Me encuentro con un desfase de tiempo, también anoche, probé a subir un "hola" a la base de datos cada hora, y las 4 de la mañana se la saltó.
Dispongo de un arduino mega y la shield de ethernet, la sonda de temperatura es la DS18B20, lo que hago es obtener las medidas de la sonda y las mando a la web por un metodo GET.
Sin poner el código, poco se te puede ayudar, pero así, como para empezar, yo evitaría el uso del delay, y mucho más siendo de 10 minutos. Prueba a cambiarlo por millis. El ejemplo "blink without delay" te puede servir para entender cómo hacerlo.
Tienes razón compañero, voy a poner el código para que pueda ser mucho más fácil y comprensible.
//Se importan las librerías
#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define Pin 2 //Se declara el pin donde se conectará el pin de la sonda
OneWire ourWire(Pin); //Se establece el pin declarado como bus para la comunicación OneWire
DallasTemperature sensors(&ourWire); //Se instancia la librería DallasTemperature
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // Direccion MAC
byte ip[] = { 10,0,0,100 }; // Direccion IP del Arduino
byte server[] = { 92,xxx,xxx,xxx }; // Direccion IP del servidor
EthernetClient client;
float temperatura;
int analog_pin = 0;
void setup(void) {
Serial.begin(9600);
sensors.begin(); //Se inician los sensores
Ethernet.begin(mac, ip); // Inicializamos el Ethernet Shield
delay(1000); // Esperamos 1 segundo de cortesia
}
void loop(void) {
sensors.requestTemperatures(); //Prepara el sensor para la lectura
if (client.connect(server, 80)>0) { // Conexion con el servidor
client.print("GET /arduino/datos.php?valor="); // Enviamos los datos por GET
client.print(sensors.getTempCByIndex(0));
client.println(" HTTP/1.0");
client.println("User-Agent: Arduino 1.0");
client.println();
Serial.println("Conectado");
} else {
Serial.println("Fallo en la conexion");
}
if (!client.connected()) {
Serial.println("Disconnected!");
}
client.stop();
client.flush();
delay(600000); // Espero 10 minutos antes de tomar otra muestra
}
Muchas gracias, voy a ver también lo que me comentas.
#include <Ethernet.h>
#include <SPI.h>
#include <OneWire.h> //Se importan las librerías
#include <DallasTemperature.h>
// Configuracion del Ethernet Shield
#define Pin 2 //Se declara el pin donde se conectará la DATA
long millis_anteriores = 0;
long intervalo = 600000;
OneWire ourWire(Pin); //Se establece el pin declarado como bus para la comunicación OneWire
DallasTemperature sensors(&ourWire); //Se instancia la librería DallasTemperature
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // Direccion MAC
byte ip[] = { 10,0,0,100 }; // Direccion IP del Arduino
byte server[] = { 92,222,26,217 }; // Direccion IP del servidor
EthernetClient client;
float temperatura;
int analog_pin = 0;
void setup(void) {
Serial.begin(9600);
sensors.begin(); //Se inician los sensores
Ethernet.begin(mac, ip); // Inicializamos el Ethernet Shield
delay(1000); // Esperamos 1 segundo de cortesia
}
void loop(void) {
unsigned long millis_actuales = millis();
if(millis_actuales - millis_anteriores > intervalo) {
// almacena la ultima vez que parpadeo el LED
millis_anteriores = millis_actuales;
sensors.requestTemperatures(); //Prepara el sensor para la lectura
if (client.connect(server, 80)>0) { // Conexion con el servidor
client.print("GET /arduino/datos.php?valor="); // Enviamos los datos por GET
client.print(sensors.getTempCByIndex(0));
client.println(" HTTP/1.0");
client.println("User-Agent: Arduino 1.0");
client.println();
Serial.println("Conectado");
} else {
Serial.println("Fallo en la conexion");
}
if (!client.connected()) {
Serial.println("Disconnected!");
}
client.stop();
client.flush();
}}
lo puse a las 9 y 27, y me ha hecho bien, el 9-27, 9.37 pero las 9.47 y 9.57 no las ha puesto...
todos los millis son unsigned long. no quiero decir que el problema vebga de aqui, pero evita un posible problema. yo tengo un problema parecido con un programa que almacena datos en una sd.si le pido que grabe cada hora solo lo hace la primera vez. si le pongo cada 30 minutos lo hace perfecto.
Y a quien se le ocurre probar sobre animales vivos? Debes probarlo fuera del acuario en tiempos mas cortos y mas repetitivos para poder comprobar su funcionamiento sin aburrirte entre lapsos de tiempo.
Ahora veo que tu programa no hace nada entre lapsos de 10 min de modo que da igual como estaba hecho con delay(10601000) y ahora usando millis()
Cambie algunas cosas menores. Pruebalo fuera del acuario por favor.
#define Pin 2 //Se declara el pin donde se conectará la DATA
unsigned long millis_anteriores = 0;
unsigned long millis_actuales 0;
unsigned long intervalo = 600000;
OneWire ourWire(Pin); //Se establece el pin declarado como bus para la comunicación OneWire
DallasTemperature sensors(&ourWire); //Se instancia la librería DallasTemperature
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xEE}; // Direccion MAC
byte ip[] = { 10,0,0,100 }; // Direccion IP del Arduino
byte server[] = { 92,222,26,217 }; // Direccion IP del servidor
EthernetClient client;
float temperatura;
int analog_pin = 0;
void setup(void) {
Serial.begin(9600);
sensors.begin(); //Se inician los sensores
Ethernet.begin(mac, ip); // Inicializamos el Ethernet Shield
delay(1000); // Esperamos 1 segundo de cortesia
millis_anteriores = millis();
}
void loop(void) {
if (millis() - millis_anteriores > intervalo) { // almacena la ultima vez que parpadeo el LED
millis_anteriores = millis(); // se ejecuta cada vez que superamos intervalo
sensors.requestTemperatures(); //Prepara el sensor para la lectura
if (client.connect(server, 80)>0) { // Conexion con el servidor
client.print("GET /arduino/datos.php?valor="); // Enviamos los datos por GET
client.print(sensors.getTempCByIndex(0));
client.println(" HTTP/1.0");
client.println("User-Agent: Arduino 1.0");
client.println();
Serial.println("Conectado");
}
else {
Serial.println("Fallo en la conexion");
}
if (!client.connected()) {
Serial.println("Disconnected!");
}
client.stop();
client.flush();
}
}
Hola compañeros, despues de un accidente, vuelvo al ataque a continuar, no desaparecí por gusto... estoy probando lo del compañero surbyte y me da el siguiente error: temp.ino:10:31: error: expected initializer before numeric constant.
No se que puede estar pasando ya que si copio el codigo que puse aqui originalmente no da ningun problema.
Sigo investigando.