ethernet shield + RF 433Mhz

hola,

estoy haciendo una estacion meteorologica para casa con dos sensores remotos, uno para interior y otro para exterior, transmitiendo de forma inalabrica con los modulos FS1000 de 433MHz. Mi intencion es poderlo ver en un display 16x2 i2c y poder ver los datos a traves de la web, simplemente los valores.

No se nada de programación, de electronica y de RF aun me defiendo, pero poco a poco mirando aqui y alla, copia-pega de aqui alla he hecho funcionarlo hasta poderlo ver en el display.
He estado intentado hacerlo funcionar con la Ethernet shield, montar un simple servidor que pueda ver los valores de las 2 sondas, pero se queda todo el rato el navegador en "cargando..." y no consigo conectar.
He revisado el tema de la ip, ip fija, con y sin gateway y submask, dhcp etc... consigo hacer un ping obteniendo respuesta desde otro pc en la misma red, pero no consigo que cargue con ningun navegador.

He estado mirando sketch que ha hecho la gente con la ethernet shield, incluso los ejemplos, por si me habia dejado algo, pero creo que esta bien las configuraciones, pero mis pocos conocimientos de programacion no me dejan ver mas :~
Podriais hecharme una mano donde he cometido el error?

Os dejo el codigo que hasta ahora he podido conseguir hacer funcionar hasta el display, pero no los datos en una simple web :roll_eyes:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <VirtualWire.h>
#include <SPI.h>
#include <Ethernet.h>

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); 

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
IPAddress ip(192,168,1,177); 

EthernetServer server(80);

int Sensor1Data;
int Sensor2Data;
int Sensor3Data;

int h, t, m;

char StringReceived[21]; 
int led = 13;


void setup() {
  
  lcd.begin(16, 2);  
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  
  pinMode(led, OUTPUT); 


    vw_setup(2000);
     
    vw_set_rx_pin(7);  
   
    vw_rx_start();       

 lcd.setCursor(1, 0); 
 lcd.print("RX is");
 lcd.setCursor(1, 1);
 lcd.print("OK");
 delay (2000);
 lcd.clear();
}
 
 
 
 void loop(){
    uint8_t buf[VW_MAX_MESSAGE_LEN];
    uint8_t buflen = VW_MAX_MESSAGE_LEN;
      
    if (vw_get_message(buf, &buflen)) 
    {
      digitalWrite(led, HIGH);
      
    
      int i;
        
        for (i = 0; i < buflen; i++)
 {               
          StringReceived[i] = char(buf[i]);
          Serial.print(StringReceived[i]);
 }
 
 sscanf(StringReceived, "%d,%d,%d",&Sensor1Data, &Sensor2Data, &Sensor3Data);

digitalWrite(led, LOW);        
h = Sensor1Data;
t = Sensor2Data;
m = Sensor3Data;

if (Sensor3Data == 1) // Numero de sonda
{
lcd.setCursor(0, 0);
    lcd.print("T="); 
    lcd.print(t);
    lcd.write(0b11011111);
    lcd.print("C");
    lcd.setCursor(7, 0);
    lcd.print("H="); 
    lcd.print(h);
    lcd.print("%");
    lcd.setCursor(13, 0);
    lcd.print("S="); 
    lcd.print(m);
Serial.println(Sensor3Data);

}
if (Sensor3Data == 6) // numero de sonda
{

lcd.setCursor(0, 1);
    lcd.print("T="); 
    lcd.print(t);
    lcd.write(0b11011111);
    lcd.print("C");
    lcd.setCursor(7, 1);
    lcd.print("H="); 
    lcd.print(h);
    lcd.print("%");
    lcd.setCursor(13, 1);
    lcd.print("S="); 
    lcd.print(m);
Serial.println(Sensor3Data);
}

if (isnan(t) || isnan(h)) {
    Serial.println("Failed to read");
  } else {
    Serial.print("Humidity: ");
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: ");
    Serial.print(t);
    Serial.println(" *C");
    Serial.print("Sonda:");
    Serial.print(m);
    Serial.println();
    Serial.println();
  }
//--------------HASTA AQUI TODO FUNCIONA OK------------------------
//--------------A PARTIR DE AQUI NO CARGA EL CLIENTE WEB-----------
//--------------EL NAVEGADOR SE QUEDA...CONECTANDO...--------------


EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        if (c == '\n' && currentLineIsBlank) {
          
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println("Refresh: 1");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
        
        if (Sensor3Data == 1) // Numero de sonda
            {
           client.print("SONDA: ");
            client.println("</H2>");
            client.println("<H1>");
            client.print(m);
            client.println(" %\t");
            client.println("</H1>");
            client.println("
");
            client.println("<p />");

            client.print("Temperatura: ");
            client.println("</H2>");
            client.println("<p />");
            client.println("<H1>");
            client.print(t);
            client.println(" &#176;");
            client.print("C");
            client.println("</H1>");
            client.println("<p />"); 
            client.println("<H2>");
            client.print("Humedad: ");
            client.println("</H2>");
            client.println("<H1>");
            client.print(h);
            client.println(" %\t");
            client.println("</H1>");
            client.println("
");
            client.println("<p />");
            }
            if (Sensor3Data == 6) // numero de sonda
            {
            client.print("SONDA: ");
            client.println("</H2>");
            client.println("<H1>");
            client.print(m);
            client.println(" %\t");
            client.println("</H1>");
            client.println("
");
            client.println("<p />");
            
            client.print("Temperatura Ext.: ");
            client.println("</H2>");
            client.println("<p />");
            client.println("<H1>");
            client.print(t);
            client.println(" &#176;");
            client.print("C");
            client.println("</H1>");
            client.println("<p />"); 
            client.println("<H2>");
            client.print("Humedad Ext.: ");
            client.println("</H2>");
            client.println("<H1>");
            client.print(h);
            client.println(" %\t");
            client.println("</H1>");
            client.println("
");
            client.println("<p />");
            client.println("<p />");
            client.println("<p />");
            client.println("<H2>");
            }           
         
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          
          currentLineIsBlank = false;
        }
      }
    }
    
    delay(1);
    
    client.stop();
    Serial.println("client disonnected");
  }
  
//----------------------------------------------------
//----------------------------------------------------
//----------------------------------------------------

memset( StringReceived, 0, sizeof( StringReceived));
}
 }

Muchas gracias de antemano, a ver si con un poco de suerte puedo destravarme.

saludos

el modulo rf433 lo debes hacer transmitir/recibir por los pines 0 y 1 (tx/rx) y por la lan lo que quieras

hola Maxid,

muchas gracias por contestar, he probado lo que me has dicho, he puesto a los sensores el pin 2 para TX y al arduino que recibe le he puesto el 3 para RX y sigue sin dar resultado. Influye mucho los puertos para tx-rx? es decir antes tenia TX pin 4 en los sensores y pin 7 al que recibe RX y recibibe todo bien, incluso en el serial. Lo unico que no carga.
He probado los sketch de ejemplo de ethernet y funcionan bien, y a simple vista esta como aqui.

Alguna pista mas? :~

Saludos!

en arduino uno por ejemplo los pines tx/rx estan compartidos con el usb. Con lo que para subir el sketch debes retirar las conexiones.
No se a que te referis con sensores y esos pines.

En el pin tx conectas el data del transmisor. y en el pin rx el data del receptor. y listo

hola Maxid,

Me referia que al arduino uno que tengo en el display, solo tengo el RX (modulo receptor), puesto en el pin 3. Y en los otros dos arduinos los TX (modulos transmisores), puestos en el pin 2. Si es asi como me decias tampoco me funciona. Los datos llegan bien en el serial, pero no carga la web.

Por eso preguntaba si influye mucho el tema de pines tx-rx una vez que recibas datos y salen en el serial tambien.

Lo he hecho bien? :roll_eyes:

Saludos!

Mejor que pongas un esquema del conexionado porque no te entiendo. creo estas mezclando cosas.

hola Maxid,

si, creo que me explico mal con lo de tx y rx.

Me referia que al arduino uno que tengo en el display, solo tengo el modulo receptor, puesto en el pin 3. Y en los otros dos arduinos los modulos transmisores, puestos en el pin 2. Si es asi como me decias tampoco me funciona. Los datos llegan bien en el serial, pero no carga la web.

Asi creo que se me entiende mejor.

te adjunto un esquema.

El esquema del receptor es una ethernet shield, disculpa.

Te dije mal
Para transmitir el data en el pin tx
y para recibir en el pin rx

ok lo acabo de probar (RX pin 0 y TX pin1) y creo que peor, es decir, el modulo de transmision se queda siempre en transmision continua, al tener un walky que me sube a 433Mhz he podido comprobarlo, no me sale en el display asi y tampoco me carga la web :~

Porque no empiezas por algo simple
Enviar 1 caracter y ver que llegue al otro lado.
puedes poner un delay o un pulsador para iniciar la transmision.

el monitor serial captura lo que envias por el puerto y debiera salir por el modulo TX.

si, asi es como fui haciendo hasta llegar a este obstaculo. Primero una cosa luego la otra, hasta que llegue a la ethernet.

Por serial por lo menos lo puedo ver todo bien de como se recibe por eso creo que el tema sondas(arduinos con transmisores) me funciona bien. Digo creo porque realmente no se si pueden influir mas cosas.

Si hago el sketch server simple de la libreria, funciona a la perfeccion, pero pasandolo al sketch que pretendo hacer funcionar, no hay forma de que el navegador cargue la web. :~

Tal vez has mezclado códigos de cliente y servidor.
busca la documentación de la librería de tu tarjeta Eternet, por cierto estoy haciendo un proyecto parecido, con una sola estación.
ENC28J60 + DHT11 + 433MHZ

Hola Ehrja,

muchas gracias por contestar, pegare un vistazo a ver si es por mezclar codigos sin haberme dado cuenta :~
Animarte desde aqui con tu proyecto tambien!

Utilizo W5100 + 2x DHT11 + 2x 433MHZ + LCD 16x2 i2c

Saludos!

EDITO:
Acabo de revisarlo, y esta creo todo conforme el sketch del server, he probado incluso a borrar el contenido del codigo de los sensores para que solo me muestre un html en blanco, pero nada tampoco, se queda mi navegador en cargando...
Tengo que montar igual que el "servidor" de los ejemplos de la libreria ethernet verdad?. Los ejemplos de la libreria si me funcionan, pero al pasarlo al sketch no :relaxed:

gains:
EDITO:
Acabo de revisarlo, y esta creo todo conforme el sketch del server, he probado incluso a borrar el contenido del codigo de los sensores para que solo me muestre un html en blanco, pero nada tampoco, se queda mi navegador en cargando...
Tengo que montar igual que el "servidor" de los ejemplos de la libreria ethernet verdad?. Los ejemplos de la libreria si me funcionan, pero al pasarlo al sketch no :relaxed:

Ok me he confundido un poco:

He comparado el tu código con el del ejemplo pero no he encontrado nada, lo revisare mas tarde.
//----
Los ejemplos si te funcionan verdad?
y al agregar el código del LCD y/o el del receptor inalambrico se queda esperando el navegador?

Disculpa Ehrja, tambien puede que yo no me explique bien :blush:

Si, los ejemplos funcionan todos bien, no hay problemas, inclusos ejemplos que hay en la red que hacen lecturas de los analogos tambien funcionan bien.
Exacto! es cuando agrego el codigo server para que me muestre los valores en un simple html, como multitud de ejemplos que hay.
El navegador se queda todo el rato..."cargando..." pero nunca llega a cargar.

El lcd y el serial me funciona bien, es simplemente cuando intento hacer un servidor web con las lecturas no me sale.

Muchas gracias por tomarte las molestias en revisarlo Ehrja

Saludos

HOLA
he visto solo algunos errores en el HTML al abrir y cerrar etiquetas.

client.println("Refresh: 1");
En el ejemplo esta linea esta a 5 y tu la tienes a 1, los comentarios dicen que se refresca cada 5 segundos y en tu caso supongo que cada segundo se refresca, posiblemente por eso se queda en cargando...

Serial.println("new client");
Unas lineas antes hay un punto de debug si el serial muestra "new client" entonces el cliente(el navegador) ha accedido al servidor (el arduino) y el navegador le manda una petición http y el final de esta es una nueva linea ("\n") esta peticion tambien se muestra en el serial con las siguientes lineas
char c = client.read();
Serial.write(c);

//------------------------
El serial es importante para hacer debuging( buscar problemas en codigo del arduino) si no aparece "new client" cuando entras a la ip del arduino entonces el problema esta antes, si si aparece y se queda en cargando ajusta esa linea del Refresh a 5 y me cuentas que pasa.

hola Ehrja,

muy buena explicacion, ahora he entendido como funciona un poco mas! Gracias!

Lo de "client.println("Refresh: 1");" lo tengo en 1 de tantas pruebas que hice, cambie varias veces 1 , 2, 5.... por si tambien fuera eso.
Pero nada, he puesto a 5 segundos y sigue "cargando"...

En el serial, solo me aparece como la captura que agregue. Solo me aparece "server is at..." y empieza a mostrar las temperaturas, por mas que intento acceder a la web, nunca me muestra en el serial "new client". He probado el ejemplo de "server" de la libreria ethernet y efectivamente al acceder en el navegador en el serial SI me muestra que la conexion fue buena:

server is at 192.168.1.177
new client
GET / HTTP/1.1
Host: 192.168.1.177
.......

esa respuesta en el serial, en este sketch, no me sale nunca, es decir nunca llega a conectar el cliente.

Entonces puede que tenga el error antes de la parte de la ethernet?

Saludos!

Ya me lo había imaginado que lo habrías cambiado a propósito....
pero al menos debería mostrarte:

server is at 192.168.1.177

//-----
Me párese que también podría haber un conflicto entre los códigos que mezclaste y como los mezclaste, me explico:

tu código tiene tres partes principales:

1.- recibir los datos
2.-mostrar los datos en el lcd
3.- mostrarlos en el navegador

en ese mismo orden de ejecución y de importancia, pero solo los primeros dos tienen la posibilidad de ejecutarse (eso esta claro) y en ejecución ocupan gran parte del ciclo loop mientras que a la parte del servidor solo le queda un poco de tiempo para mirar si hay una nueva conexión con la siguiente condición:

// listen for incoming clients
EthernetClient client = server.available();
if (client) {
....// codigo que no se ejecuta
}

Si miras en el ejemplo del Ethernet esta condición es la única que se ejecuta en el loop hasta que recibe una petición http, con lo cual siempre esta vigilante a una nueva petición http,
tal vez si actualizas manual mente cada 2 segundos te aparezca algo en una de esas, sin embargo hay que mejorar el código, definitivo.

cuéntame si te aparece algo y si al menos en el serial recibiste esto: "server is at 192.168.1.177" al inicio
me parece que también ya has intentado eso jeje pero bueno seguimos en contacto.
actualizando varias veces seguidas tal vez obtengas una respuesta en el serial aunque no veas algo en el navegador:

new client
GET / HTTP/1.1
Host: 192.168.1.177
.......

//*------
aunque no parezca hemos avanzado descartando cosas, sigue adelante porque esta parte es la mas divertida....

hola Ehrja,

lo mas seguro es lo que dices, habra un conflicto de codigos, realmente son parches medio adaptados que al final he ido haciendo funcionar, pero claro cuando quieres un poco mas ya no sirve. Divertida? jejeje ufff! llevo unos dias con esto que saco humo! XD Pero estoy aprendiendo un monton y ya no todo me suena a raro lo que leo.

Al grano...

He ido haciendo mas pruebas, separando codigos por partes, es decir, he quitado toda la parte que me muestra el LCD dejando solo la parte de la recepcion de los datos y el servidor web. Asi tampoco llega a cargar el navegador. Otra prueba ha sido clickar rapido a refrescar varias veces al navegador pero no llega hacer el "new client". He probado en varios valores refresh y nada.

Otra prueba que he hecho ha sido jugar con "delay()" para ir retrasando el void loop, creo que no se hace asi, obteniendo el mismo resultado. He subido mas el tiempo a los sensores remotos para que envien la informacion a unos 20 segundos, por si fuera tambien. He quitado la parte del codigo en la que modifico la interpretacion del serial de los valores obtenidos para dejar solo receptor-lcd-servidor y con los valores a secas. Nada :~

He visto otra forma que hace la gente para mostrar los valores (analog) es con tarjeta SD guardando un .txt y luego es el servidor el que lee los datos de ese archivo. Realmente se me escapa de mis conocimientos, pero, seria mejor solucion? quizas no tendrian conflictos entre partes del sketch?. Quedando... receptor - lcd - sd - servidor ... o algo parecido?
Pero pienso que si no sale asi de simple como para complicar mas el asunto :~

Sigo haciendo mas pruebas.

Saludos!

Hola

Bueno parece que ya has hecho casi todas las pruebas de rigor aunque usar el delay() en este caso empeora la cosa, tal vez falta enviar datos falsos, eliminar la parte del receptor inalambrico y cargar en las variables datos falsos por ejemplo:
h=88;
t=24;
m=...;

de modo que no se use el virtualwire ni el receptor inalambrico, para también descartar eso.
//------------------------
mañana intentare ayudarte a re acomodar el código, partiendo del ejemplo del servidor a ver si le doy.
//------------------------
animo ya mero queda
saludos.