Hardware > Ordenadores control estaciones
Diseño de estación con Arduino y raspberry pi con sensores tipo PCE FWS-20
mielmari:
Este el código en Arduino que calcula la dirección
--- Código: ---int ADCvalue; // lectura de la tension
static int ADCvalues[] = {66, 84, 92, 127, 184, 244, 287, 406, 461, 600, 631, 702, 786, 827, 889, 946 };
static float vaneDirections[] = {112.5, 67.5, 90.0, 157.5, 135.0, 202.5, 180.0, 22.5, 45.0, 247.5, 225.0, 337.5, 0.0, 292.5, 315.0, 270.0};
float ADCtoDirection(int ADCvalue)
{
for(int n=0; n<16;n++)
{
// valor intermedio
if(ADCvalue < ( ADCvalues[n] + ( (ADCvalues[n+1] - ADCvalues[n]) / 2) ) )
return vaneDirections[n];
}
Serial.print("ADCtoDirection error, ADCvalue: ");
Serial.println( ADCvalue);
return -1.0;
}
--- Fin del código ---
mielmari:
Hola,
he conseguido establecer comunicación serie entre Arduino y PC linux (Mint 18), porque todavía no he he recibido la RPi. L RPi envía a Arduino códigos de un carácter, 't' para temperatura, 'r' para lluvia... Arduino responde envíando una línea de texto con el valor del sensor a la RPi
Código lado Arduino:
--- Código: ---void loop()
{
if (Serial.available() > 0)
{
bme.readSensor();
s = Serial.read();
// inicio dia, poner a cero contadores de lluvia y viento
if (s == '0')
{
dailyrainin = 0;
windturns = 0;
}
// temperatura
else if (s == 't')
Serial.println(bme.getTemperature_C());
// humedad
else if (s == 'h')
Serial.println(bme.getHumidity());
// presion
else if (s == 'p')
Serial.println(bme.getPressure_MB());
// lluvia
else if (s == 'r')
Serial.println(dailyrainin);
// velocidad viento
else if (s == 'v')
Serial.println(windturns);
// direccion viento
else if (s == 'd')
{
ADCvalue = analogRead(A0);
gradosRosa = ADCtoDirection(ADCvalue);
Serial.println(gradosRosa);
}
}
}
--- Fin del código ---
El código en lado RPi me ha dado algún problemilla. Estoy usando python3. Se trata de convertir valores ascii a unicode y viceversa. Además hay qye eliminar el final de línea.
--- Código: --- arduinoPort.write("t".encode('ascii') )
getTenperatura = arduinoPort.readline()
getTenperatura = getTenperatura.decode('ascii')
getTenperatura = getTenperatura.rstrip('\r\n')
arduinoPort.write("h".encode('ascii') )
getHumedad = arduinoPort.readline()
getHumedad = getHumedad.decode('ascii')
getHumedad = getHumedad.rstrip('\r\n')
arduinoPort.write("p".encode('ascii') )
getPresion = arduinoPort.readline()
getPresion = getPresion.decode('ascii')
getPresion = getPresion.rstrip('\r\n')
arduinoPort.write("r".encode('ascii') )
getLluvia = arduinoPort.readline()
getLluvia = getLluvia.decode('ascii')
getLluvia = getLluvia.rstrip('\r\n')
# etc.
--- Fin del código ---
Luego se abre un fichero en modo 'a'a (append) y se van guardando los valores
--- Código: ---
file = open("/home/pi/weather/weather3_log.txt","a+")
file.write(orain.strftime('%Y-%m-%d %H:%M:%S\t'))
file.write('%.1f\t' % float(getTenperatura) )
file.write('%.0f\t' % float(getHumedad) )
file.write('%.0f\t' % float(getPresion) )
file.write('%d\t' % int(getLluvia) )
file.write('%d\t' % int(getVelocidadViento) )
file.write('%.0f\t' % float(getDireccion) )
file.write('%s\n' % getRosa)
file.flush()
file.close()
--- Fin del código ---
mielmari:
Otro día comentaré otros puntos:
- cómo hacer que el programa python se cargue al encenderse la RPi, y se ejecute como un proceso en segundo plano.
- cómo hacer que la RPi detecte automáticamente el puerto Arduino, que cada vez que se enchufa el usb puede variar, en mi caso a veces es ttyUSB0, otras veces es ttyUSB1, ttyUSB2...
jmviper:
Un apunte por si te sirve de utilidad con el buen trabajo que estás haciendo....
los logs supongo que los harás en la RPi cada minuto con crontab y en ese caso sería bueno para la organización de los mismos que fuesen llamados por el nombre o número del mes. Por ejemplo el de este mes se podría llamar 012018log.txt, 022018log.txt el de febrero etc etc, por ejemplo con open('/home/pi/weather/logfiles/' + time.strftime("%m%Y") + 'log.txt','a+')
Para las máx/mín podrías hacer como en Cumulus un today.ini en que se guardasen las del día en curso con sus tiempos, un month.ini para las del mes y para las del año un year.ini (los nombres los que tú quieras claro está). Así podrías editarlos fácilmente en caso de algún valor erróneo aunque también tendrías que ver en el log correspondiente ese valor erróneo y corregirlo. También un dayfile.txt que te grabase las máx/mín del día al final del mismo en un fichero con todos los días del que podrías extraer los valores fácilmente.
Recurro a Cumulus porque tiene un sistema interesante al respecto, fácilmente editable y de consultar.
Poco a poco va tomando cuerpo la cosa.
Enhorabuena :)
mielmari:
Hola
no utilizo crontab, lo que hago es mirar la hora, dividir los minutos por 5 (se podría hacerlo por otro número como 1 o 2 o 5) y cuando el resto es igual a 0 y los segundos son 0, guardo los datos. divmod() da dos datos: r[0] es el cociente y r[1] es el resto. Así funciona exacto.
--- Código: ---while True:
try:
ahora = datetime.now()
# cada 5 min
r = divmod(ahora.minute, 5)
resto = r[1]
if resto == 0 and ahora.second == 0:
file = open("/home/pi/eguraldi/eguraldi3_log.txt","a+")
# leer datos de Arduino...
# guardar datos en un fichero
file.write(orain.strftime('%Y-%m-%d %H:%M:%S\t'))
file.write('%.1f\t' % float(getTenperatura) )
file.write('%.0f\t' % float(getHumedad) )
file.write('%.0f\t' % float(getPresion) )
file.write('%d\t' % int(getLluvia) )
file.write('%d\t' % int(getVelocidadViento) )
file.write('%.0f\n' % float(getDireccion) )
file.flush()
file.close()
time.sleep(40)
--- Fin del código ---
Como el primer dato que guardo es fecha y hora en la forma "2018-01-27 07:48:00", todo va a un fichero. Es buena idea renovar el nombre del fichero cada mes, utilizaré tu fórmula.
(nota: veréis que en algún lugar utilizo "eguraldi", es una palabra en euskera que equivale exactamente a "weather")
Por ahora no hago ningún tratamiento de datos (por ejemplo, máximos o mínimos diarios). Simplemente quiero recogerlos. La elaboración la dejo para más tarde.
Mi pregunta: ¿cada cuánto tiempo conviene tomar los datos? En otros ámbitoss he visto que a menudo lo hacen cada 10 minutos. En el mensaje anterior insinúas cada minuto. ¿Hay algún criterio aceptado de forma general en meteorología?
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa