grafisoft escribió:Pero igual puedes cargar la imagen del plano escaneado, y sobre este, añadir lo que precises Seguro que se puede, pero yo no domino PHP. Si alguien se anima, perfecto. Todo el codigo fuente esta publicado.
Sigo avanzando. Tengo el hardware listo, con algo de código para probarlo. Falta pulir lo bastante y solucionar algunos problemillas, pero ya es cuestión de software.
Cualquier duda, te lo intentamos solucionar
Asi queda el codigo python en la rasp:
Código: #!/usr/bin/python
from nrf24 import NRF24
import time
import string
import MySQLdb
import datetime
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASS = 'sqlpi'
DB_NAME = 'sensores'
pipe = [0xc2, 0xc2, 0xc2, 0xc2, 0x01]
radio = NRF24()
radio.begin(0, 0, 25, 18)
radio.setRetries(15,15)
radio.setPayloadSize(10)
radio.setChannel(0x40)
radio.setDataRate(NRF24.BR_1MBPS)
radio.setPALevel(NRF24.PA_MAX)
radio.openReadingPipe(1, pipe)
radio.startListening()
radio.printDetails()
radio.powerUp()
salida = ""
con_info = False
def ejecuta_consulta(consulta):
datos = [DB_HOST, DB_USER, DB_PASS, DB_NAME]
conexion = MySQLdb.connect(*datos)
cursor = conexion.cursor()
cursor.execute(consulta)
conexion.commit()
cursor.close()
conexion.close()
nodo = -1
trama = -1
bat1 = 4.0
tem1 = 25.6
hum1 = 67.5
indice = -1
indi = -1
while True:
while not radio.available(0):
time.sleep(0.250)
ignora = 0
buffer = []
radio.read(buffer)
for caracter in buffer:
if caracter > 31 and ignora > 1:
letra = chr(caracter)
if con_info == True:
if letra == '>':
print salida
con_info = False
indice = string.find(salida, "BA");
bat1 = salida[(indice+3):(indice+7)]
# print bat1
indice = string.find(salida, "TE");
# print indice
tem1 = salida[(indice+3):(indice+7)]
# print tem1
indice = string.find(salida, "HU");
hum1 = salida[(indice+3):(indice+7)]
# print hum1
#Dato de numero de nodo
indi = string.find(salida, chr(35), 1)
# print indi
nodo = salida[0:indi]
# print nodo
#Dato numero de trama
indi2 = -1
indi2 = string.find(salida, chr(35), 2)
trama = salida[(indi+1):indi2]
# print trama
# Annadimos a la BD los datos recibidos del nodo.
cadena = "INSERT INTO trama(nodo, numero, bateria, temperatura, humedad) VALUES(%s, %s, %s, %s, %s)" % (nodo, trama, bat1, tem1, hum1)
ejecuta_consulta(cadena)
elif letra == '<':
salida = ""
else:
salida = salida + letra
elif letra == '<':
con_info = True
salida = ""
ignora = ignora + 1
Tengo que probarlo. Hay que tener en cuenta una cosa, y es si varios nodos envían tramas a la vez, ya que como son de 10 bytes se puede solapar la información.
No tenia pensao mandar a la vez, si no darle a cada nodo su ventana. De momento estoy probando con un nodo. Envia cada 20 segundos, es una prueba de consumo. La rasp la conecto a ratos.
Me tengo que meter mas en serio con la rtc porqur no la acabo de configurar bien
Te propongo un cambio en el código de python, para hacerlo más cómodo puedes usar la función split, quedaría así:
Código: #!/usr/bin/python
from nrf24 import NRF24
import time
import string
import MySQLdb
import datetime
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASS = 'sqlpi'
DB_NAME = 'sensores'
pipe = [0xc2, 0xc2, 0xc2, 0xc2, 0x01]
radio = NRF24()
radio.begin(0, 0, 25, 18)
radio.setRetries(15,15)
radio.setPayloadSize(10)
radio.setChannel(0x40)
radio.setDataRate(NRF24.BR_1MBPS)
radio.setPALevel(NRF24.PA_MAX)
radio.openReadingPipe(1, pipe)
radio.startListening()
radio.printDetails()
radio.powerUp()
salida = ""
con_info = False
def ejecuta_consulta(consulta):
datos = [DB_HOST, DB_USER, DB_PASS, DB_NAME]
conexion = MySQLdb.connect(*datos)
cursor = conexion.cursor()
cursor.execute(consulta)
conexion.commit()
cursor.close()
conexion.close()
while True:
while not radio.available(0):
time.sleep(0.250)
ignora = 0
buffer = []
radio.read(buffer)
for caracter in buffer:
if caracter > 31 and ignora > 1:
letra = chr(caracter)
if con_info == True:
if letra == '>':
print salida
con_info = False
campos = salida.split("#")
nodo = -1
trama = 0
bat1 = 0
tem1 = 0
hum1 = 0
indice = 0
for campo in campos:
if indice == 0:
nodo = campo
elif indice == 1:
trama = campo
else:
if campo.startswith("BA"):
bat1 = campo.split(":")[1]
elif campo.startswith("TE"):
tem1 = campo.split(":")[1]
elif campo.startswith("HU"):
hum1 = campo.split(":")[1]
indice = indice + 1
cadena = "INSERT INTO trama(nodo, numero, bateria, temperatura, humedad) VALUES(%s, %s, %s, %s, %s)" % (nodo, trama, bat1, tem1, hum1)
ejecuta_consulta(cadena)
elif letra == '<':
salida = ""
else:
salida = salida + letra
elif letra == '<':
con_info = True
salida = ""
ignora = ignora + 1
Ok, lo pruebo esta noche. Gracias
Con la aparición de los módulos Esp8266 Esp-01 modulo WiFi inalámbrico Para Arduino esto cambia radicalmente asignación de ips para cada nodo, uso de la red wifi de casa sin tener que implementar una con los módulos nrf, mismo precio del modulo.
me he pedido unos pocos para probar y a guardar los nrf24.
El esp no vale 1$ el modulo como si lo hace el nrf. El consumo es muy superior, etc. El modulo esta muy bien, pero para desplegar segun que redes...
Que bueno el proyecto, enorabuena a todos los que lo estáis desarrollando y aportando
Tengo una Rpi muerta de risa, a ver si tengo un tiempo y me animo a montar este proyecto, aunque el tema de bases de datos/php, etc, estoy bastante perdido
Una duda, estoy comunicando 2 arduinos con nrf24, con la libreria mirf, utilizo una estructura de datos para enviar la información. Habéis comentado, de que el maestro reciba información de varios nodos a la vez asincronamente (Ya que estos se despertarán mediante interrupción externa, o por el WDT). Como se podría solucionar este problema?
Habéis comentado algo de ventanas para cada nodo, pero no entiendo bien a que os referís con esto
No se muy bien si este mensaje encaja aquí, o postearlo en el foro de arduino
Un saludo, y muy buen trabajo, en este foro hay un enorme potencial de gente que sabe mucho, da gusto entrar y aprender de todos vosotros
Asi pensandolo rapidamente se me ocurre que añadas un rtcc y puedas tener tus nodos sincronizados de tal forma que cada uno envie en un espacio temporal distinto. Por ejemplo, tengo 3 nodos y estos tienen que wnviar datos e ir a dormir. Supongamos que se despiertan todos a la vez a las 00;00. Su procesos de captura de datos o lo que twngan que hacer les llevan 20 segundos. Les damos 10s mas de margen por si se retrasa algo. Entonces el primer nodo estara listo para enviar a las 00;30. A cada nodo le asignamos una ventana de transmision de unos 5 segundos, asi que la cosa quedaria asi; Nodo 1 envia desde las 00;30 a las 00;35. Nodo 2 envia desde las 00;35 a 00;40. Nodo 3 desde 00;40 a 00;45. Si tuvieramos mas nodos, los iriamos encolando. El nodo realmente no va a tardar 5 segundos en transmitir y recibir el ack, pero asi nos aseguramos que la puesta en hora de nuestra rtcc no tenga que ser muy exacta y por tanto, errores de 1-2s entre rtcs no sean importantes.
Otro modo si el consumo no es critico, es que el master pida a cada nodo los datos. De esta forma tampoco se pisarian, ya que iria de 1 en 1 pasando por todos los que tenga en su lista.
Es buena idea, no lo habia pensado lo del rtc
Con respecto a esto me surgen varias dudas
*) Tener alimentado el rtc continuamente aumentaría mucho el consumo del nodo alimentado por batería?
*) En el rtc ds3231 creo que se pueden programar alarmas para que mande un pulso para que el micro se despierte por interrupción.
Alguien lo ha probado?
*) Con respecto a los envíos asíncronos no se si se solucionaría con las ventanas, veo que es muy buena idea guardar el dato cuando se produzca la int externa del evento y enviarlo cuando rtc le de permiso, pero, y si el proceso es crítico?
Es muy complicado que dé la casualidad que 2 nodos se despierten por int externa y envíen simultáneamente, pero si puede pasar..., alguna vez pasará, menudo artista el murphy este...
No se si sería muy complicado hacer una comunicación de que el nodo pregunte al master si está ocupado, si es así que espere a volver a preguntar, y cuando esté libre le envíe la trama
Saludos!
Si envias comunicacion, chafas la de otro nodo si en ese instante esta transmitiendo.
El RTC tiene un consumo casi despreciable. Es mas, sin el, no existiria la posibilidad de hacer deepsleep (modo de sueño de muy bajo consumo que precisa de una interrupcion externa para despertarse. Generalmente la genera una rtc)
La rtc lo uico que hace es despertar el micro. Luego el usuario tiene que controlar el tiempo. En arduino es extremadamente sencillo gracias a la funcion millis(). Con ella estableces varios bucles de los cuales no sales hasta pasado un tiempo. Gracias a eso, puedes por ejemplo estar X tiempo haciendo una cosa (o mejor dicho, darle X tiempo a realizar un proceso), cuando pase ese tiempo, sale del bucle y continua ejecutando codigo.
Esto definido mejor lo que se hace es, mido con la funcion millis() antes de empezar a ejecutar codigo, cuando ejecuta el codigo que queremos, añadimos un bucle del cual no saldra hasta que se cumpla X tiempo.
Viene muy bien para tener cierto control sobre las cosas.
Como bien dices, el rtc despierta al micro gracias a las alarmas que dispone. Esta muy probado, funciona muy bien.
Ok, gracias por la info!
Saludos!
Solo daros las gracias, por que habéis resuelto la gran mayoria de los problemas que tenia con mi raspberry y arduino.
Comenzar dando las gracias a todos por el gran trabajo que habéis realizado.
Estoy haciendo un termostato/Estación meteorológica con pantalla táctil y 5 sensores.
Tengo todo bastante avanzado, pero no logro ver la forma de hacer que estos sensores sean inalambricos, he visto este hilo y casi veo la luz!
Me falta saber como hacer a nivel del sensor como queda el hardware, tengo sensores DHT22 y nrf24L01 pero me falta el controlador.
como lo habéis planteado vosotros?
Gracias!!
Un saludo
inosen escribió:Comenzar dando las gracias a todos por el gran trabajo que habéis realizado.
Estoy haciendo un termostato/Estación meteorológica con pantalla táctil y 5 sensores.
Tengo todo bastante avanzado, pero no logro ver la forma de hacer que estos sensores sean inalambricos, he visto este hilo y casi veo la luz!
Me falta saber como hacer a nivel del sensor como queda el hardware, tengo sensores DHT22 y nrf24L01 pero me falta el controlador.
como lo habéis planteado vosotros?
Gracias!!
Un saludo
Aqui use PIC, pero puedes usar atmel perfectamente. Si quieres un HW pequeño, tendras que hacerte el diseño. Si sale gente interesda, miramos de hacer un diseño y fanricarlo, y asi, estaciones para todos!! Si quieres ehh
Tienes las 2 opciones, PIC o Atmel. La mas facil hoy en dia, sin duda atmel porque trabajas bajo arduino.
Y pensandolo mejor, tienes los arduinos micro, con lo que la parte de HW la tienes casi resuelta. Solo te falta conectar el nrf al microarduino. Los microarduino son muy economicos. El hacer un diseño de HW especifico es de cara a reducir tamaño y si son varias unidades, coste. Si solo vas a necesitar 1-5 unidades, creo que la opcion barata y sencilla es tirar de microarduino.
Grafisoft muchas gracias!!
La verdad q el hacer los HW me da un poco de reparo pero estoy dándole vueltas porque tengo intención de usar 6 sensores.
A ver si me va llegando el material q me falta q por aquí en Zaragoza comprar material es complicado t hay q encargarlo todo al lejano oriente ;-)
Si nos animamos más gente podíamos hacer el diseño para usarlo todos.
Yo cuando termine este proyecto de estacion/termostato subiré todo el proceso y el código.
Profundizando un poco más en la idea del proyecto, es con la raspeberry y pantalla táctil usarla de central domótica, con un servidor web accesible desde el exterior.
El portal en lo q a temperatura se refiere almacenará los datos de todos los sensores para generar gráficas, para posteriormente usar el último dato de cada sensor para hacer encender la caldera, programar el encendido y demás.
Soy informático por lo q en el portal no me esta dando muxo miedo, pero el tema de los sensores si, tengo todos funcionando por cable, pero quiero hacer por RF.
Siento la chapa y os voy contando avances,
Si alguno más se anima tratamos de dar un empujón entre todos.
Saludos;!
Pues yo tambien soy de zgz
Yo con pic hice unos pequeños nodos (proyecto air) y los conecte a la rasp. Porque pic? Pues por las muestras y porque la gama nanowatt tiene unos consumos ridiculos. Lo malo, que a nivel de codigo tienes que buscarte mas la vida, no hay tanta ayuda como en arduino ( que es uno de sus puntos mas fuertes).
Si planteas el proyecto en un post nuevo, miramos de ver cuanta gente interesada hay, hacemos cuentas y se decide. Puede quedar una cosa muy chula, y no es empezar de 0. Yo me ocupo de la parte de hw si fuera necesario
|