Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
RaspBerry Pi + nrf24L01
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.
Citar
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.
Citar
Cualquier duda, te lo intentamos solucionar
Citar
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
Citar
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.
Citar
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
Citar
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
Citar
Ok, lo pruebo esta noche. Gracias
Citar
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.
Citar
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...
Citar
Que bueno el proyecto, enorabuena a todos los que lo estáis desarrollando y aportando Mola

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 Triste

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 Mola
Citar
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.
Citar
Es buena idea, no lo habia pensado lo del rtc Mola

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... Facepalm

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!
Citar
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.
Citar
Ok, gracias por la info!
Saludos!
Citar
Solo daros las gracias, por que habéis resuelto la gran mayoria de los problemas que tenia con mi raspberry y arduino.
Citar
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
Citar
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 Guiño Guiño

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.
Citar
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;!
Citar
Pues yo tambien soy de zgz Sonrisa

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 Guiño
Citar


Temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Raspberry quemada al conectar USB de placa xero83 4 436 24-07-2018, 01:09 PM
Último mensaje: xero83
  NOTICIA Os invito a mi blog "Raspberry Para todos" Turriano 0 248 14-07-2018, 05:16 PM
Último mensaje: Turriano
  Encendido/Apagado LED con pulsador Raspberry Javier_DC 2 704 16-04-2018, 08:12 AM
Último mensaje: Javier_DC
  [TUTORIAL] Como ejecutar scripts al iniciar nuestra Raspberry Electromecánico 7 15,127 18-03-2018, 11:52 PM
Último mensaje: yuber1992
Pregunta Plataforma educativa online para curso de Raspberry Pi Electromecánico 1 517 17-01-2018, 09:09 PM
Último mensaje: grafisoft