Feliz año nuevo a todo@s antes de otra cosa.
Ya tengo el sistema funcionando y subiendo datos a ThingSpeak. Os pongo el código para que me aconsejéis sobre posibles problemas en el código o en el hardware.
Estoy en fase de pruebas. Algunas veces el sistema ha dejado de mostrar datos por el puerto serie y por tanto de subir datos a la nube, pero los leds de la Shield parpadeaban y respondía al ping, por lo que no es que estuviera colgado sino algo diferente.
El monitor serie está muy presente en el código para visualizar el funcionamiento y depurar errores, pero en el futuro cuando este en mitad del monte no será necesario.
Si cerraba el monitor serie y lo volvía a abrir, los datos de paquetes recibidos empezaban a recibirse, por lo que he pensado que quizás es alguna interferencia en el monitor serie con el pc y he hecho // Serial.begin(); y ya no inicializo el puerto serie, y así lo he vuelto a compilar. Lleva ya varias horas, a ver si no hay funcionamiento errático.
Explico el modo de funcionar:
Habrá 5 Arduinos en total. 4 enviando datos en distintas partes y 1 recibiendo.
Los emisores a falta de cambio serán.
• 1 Arduino uno emisor con 2 sensores de temperatura (1 BME 280y 1 BME 280,) que me indicaran temperatura y humedad de una caseta de bombeo y del cuadro eléctrico, 1 Emisor Lora 433 Mhz sx1278- Ra2 con antena exterior, 1 transductor de presión nivel de señal 0-5 v en función de la presión (altura del depósito), 1 sensor de humedad de suelo capacitivo, también un relé externo que abrirá o cerrara el paso de corriente en función de si el motor donde se aloja está o no en marcha. Este emisor esta funcional y enviando datos (en casa) a falta del sensor de humedad que aún no me ha llegado.
• 1 Arduino uno emisor en una caseta de un pozo, con un sensor BME 280 para saber humedad y temperatura de la caseta de bombeo, relé para saber estado del motor, un transductor de presión para saber la profundidad del acuífero, 1 electroválvula neumática y 1 relé de estado sólido para arrancar un compresor. Esto funcionara de la siguiente manera. En el fondo del pozo hay un tubo de plástico fino 4mm, 6 mm, algo así, que llega hasta la parte más profunda del pozo. Si metemos aire por el tubo, llegara un momento que el aire empujara el agua que hay dentro del tubo hasta que haya salido todo el agua y el aire empiece a salir también. En ese momento si cortamos el paso de aire el agua intenta entrar dentro del tubo, pero la presión de aire se lo impide. En se momento, la presión dentro del tubo es igual al de la columna de agua que tiene encima. Si manualmente miramos con un manómetro veremos una presión. Esa presión es la altura de la columna de agua o la altura de agua que tiene el pozo. El Arduino ha de arrancar el compresor cada 12 horas durante 4 minutos de modo que se cargue de aire el calderin, después abrirá la electroválvula durante 1 minuto, para asegurarme que ha desplazado toda el agua de dentro del tubo. Después cerrara la válvula y tomara la presión de ese circuito neumático. Esa presión es la altura de agua. También tomara cada 5 min el dato de si el motor está en marcha o no y la humedad del suelo cercado con sensor capacitivo. Este Arduino no está aún implementado ni el código.
• 2 NodenCu, es un TTGO con lora 433 MHz integrado, pantalla .96 oled, Esp86. Emisor, conectado un sensor de humedad de suelo y un transductor de presión para saber la altura de un deposito. Aquí mi duda es sobre los niveles. Trabaja a 3,3 voltios, pero el transductor de presión trabaja a 0-5 voltios, por lo que aún no se cómo resolver este problema. Quizás al final ponga un Arduino uno. Creo que los Arduinos son más estables que los NodemCu, pero es solo una sensación. He observado varios cuelgues en el Nodemcu, configurado tanto en emisor, como al principio que lo probé como receptor. He optado por configurarlo como emisor y he observado un cuelgue también, por lo que he desactivado el monitor serie en el código por si acaso, a ver qué pasa si es esa la causa. El emisor que tengo funcionando con un Uno no se ha colgado nunca, por eso creo que al final pasare de los NodemCu.
• Un receptor que es un Arduino Mega de Elegoo. Lleva una Shield ethernet W5500 marca Keyestudio, un módulo BME 280, un anemómetro señal 0-5 voltios, un pluviómetro de pulsos, una veleta de dirección de viento y un módulo sx1278-ra2 con antena externa. También para facilitar el conexionado se montará en una segunda Shield que lleva terminales de tornillos para conectar más fácilmente los sensores. Aquí hay varios retos uno de ellos es saber cuánto puedo alejar un módulo del Arduino. Por ejemplo, el sensor de temperatura ira fuera de la caja estanca. Se comunica por I2C. No se la distancia máxima que puedo alejar el sensor del Arduino. Las señales que son digitales son las que me preocupan. También me gustaría alejar el módulo Sx1278 del Arduino para buscar más altura y ganar señal, pero no sé qué tal se comportará. En el caso de este módulo hablamos de 9 cables. Es más complicado. La función del receptor es recibir las señales de los otros Arduinos, así como las variables meteorológicas ambientales y subirlas a la nube, mediante un conector RJ45 que ira conectado a un router GSM movistar ya que no hay civilización en kilómetros. El receptor funciona y sube datos a internet tal y como he dicho antes, pero me gustaría consejos y ayuda para optimizarlo.
A continuación, explicó un poco el modo de funcionar una vez descrito el hardware. Cada variable tiene un código único, de modo que por ejemplo el deposito principal es el número 1.
El emisor cada cierto tiempo, toma el dato de presión del transductor de presión y lo convierte en altura. Pensar que la altura del depósito deposito es 4.19 m. A continuación, toma el dato y lo multiplica por 1000 de modo que tenemos 4190 es nuestra parte de datos de altura. Para que el receptor sepa que hacer hemos de decirle a continuación el número de estación. En este caso se le suma la parte decima. La estación 1 sería la .01 ya que uso 2 dígitos. Entonces paso el número se convierte en String y se le suma la cadena.01, así mi String completo seria 4190.01 (4190 numero) y (.01 estación correspondiente a deposito principal)
En el receptor hacemos el paso inverso.
Una vez recibido el String hago 2 operaciones, lo paso a número y desprecio la parte decimal, así me quedo con el 4190.
Respecto a la estación, hago una búsqueda el lugar donde está el punto (.) a partir de ahí extraigo el valor. Del string extraigo el valor a partir de ahí convierto este número en entero y multiplico así ya tengo el número de estación. Comparo el número de estación y en función de la estación, muestro los resultados y los subo a la nube.
También decir por si antes no me he explicado bien, que este Arduino se encargara de recoger los valores meteorológicos ambientales de lluvia, viento, temperatura, presión humedad, etc.
Para el pluviómetro se utiliza una interrupción.
Quiero implementar un Watch dog timer, pero no se si mi arduino soporta el boot, no se donde se mira eso. Son modernos y unos chinos que aun no me han llegado.
Respecto a la tarjeta de red me gustaria saber si puedo hacer esto: en el loop:
if (Ethernet.begin(mac) == 0) {
Serial.println(F("Failed to configure Ethernet using DHCP"));
// no point in carrying on, so do nothing forevermore:
for (;;)
;
}
Eso seria si se pierde la conexión por un tiempo y no vuelve a conectar, para forzar volver a conectar.
Respecto a que se quede como sin recibir datos y subir datos a la nube, podría ser del lora. He leído algo en Internet. Igual que con el Shiel, si por ejemplo no recibo datos en 10 min, podría volver a inicializar el lora en midad del loop asi: ?
if (!LoRa.begin(BAND)) {
Serial.println(F("Starting LoRa failed!"));
while (1);
En este modo se inicial el modulo, por si no responde en un tiempo volver a despertarlo o forzarlo a despertar.
Un saludo, espero consejos.
Adjunto el código del receptor que es el mas gordo y el de uno de los emisores que manda mas datos.
algunas funciones en el receptor no están completas como por ejemplo la de la dirección del viento.
receptor.ino (38.7 KB)
emisor_1.ino (26.1 KB)