Hola
Llevo varios días con un problema que me vuelve loco.
He modificado el programa de cerradura electronica que os mostré aquí Arduino Forum para añadirle un nRF24L01. Así espero guardar un Log de entradas y salidas, ademas de dar avisos por twitter ante algunas entradas en casa. Uso un Arduino Nano 3.0.
El caso es que el programa, corriendo sin el resto del hardware, en algún PC, funciona perfecto. Pero es ponerlo en la puerta y ya no funciona el nRF24L01 (el resto va bien).
He comprobado:
El nRF24L01 recibe sus 3,3v medido con polimetro.
He alimentado el arduino por su toma USB y tampoco va.
He probado 1001 veces el cableado.
He desconectado el RTC y el LCD por I2C que le he añadido hace poco. (q x cierto, es lento de narices)
He acercado los nRF24L01 para asegurarme que no había problema de cobertura.
He cambiado el micro por otros con el mismo programa.
No entiendo por qué el mismo programa corriendo enganchado a un portátil va OK y en la puerta no va (no recibo nada de el), aunque esté siendo alimentado por el portátil.
¿Ha alguien se le ocurre algo y me puede ayudar? Gracias.
Os pongo parte del código, que entero no cabe. Aunque insisto en que el código va OK enganchado al PC sin ponerle el resto de cosas (teclado, buzzer y relés):
Los pines y los includes:
PINES:
2 Teclado Col 1
3 Teclado Col 2
4 Teclado Col 3
5 Zumbador Teclado Col 4 (Opcional)
6 Teclado Fila 1
7 Teclado Fila 2
8 Teclado Fila 3
9 Teclado Fila 4
10 CS de nRF24L01 (antes de Tarjeta SD)
11 MOSI
12 MISO
13 SCK
A0 (14) CE de nRF24L01
A1 (15) Sensor Temperatura 18B20
A2 (16) ABRIRCERRADURA Rele cerradura ON
A3 (17) CERRARCERRADURA Rele cerradura OFF
A4* RTC y LCD
A5* RTC y LCD
A6 Sensor timbre?
A7 Sensor puerta abierta (Poner una R de 5v al pin y luego el pin a Masa pasando por el interruptor)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>
#include <Time.h> // Para la hora
#include <DS1307RTC.h> // a basic DS1307 library that returns time as a time_t
#include <EEPROM.h>
//#include <SD.h>
// Incluimos la librería para establecer comunicación mediante el protocolo 1-Wire
#include <OneWire.h>
// Incluimos la librería para comunicarnos con los sensores
#include <DallasTemperature.h>
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
Inicialización:
/******* Para la Radio nRF24L01 **************/
// http://maniacbug.github.com/RF24/classRF24.html
RF24 radio(14, 10); // RF24 radio((CE,CSN)
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
bool Dato_perdido=false;
/******* FIN para la Radio nRF24L01 **************/
En el setup()
/******* Para la Radio nRF24L01 **************/
printf_begin(); // OJO ¿Esto será necesario?
radio.begin();
// optionally, increase the delay between retries & # of retries
radio.setRetries(15,15);
// Parece que abre la comunicacion en ambos sentidos?
radio.openReadingPipe(1,pipes[1]);
//Empieza a escuchar ¿será necesario?
radio.startListening();
//radio.printDetails();
/******* FIN para la Radio nRF24L01 **************/
En el main()
// Cada minuto: Comprobamos cambio de hora y enviamos cosas
if (minute() != minutoTemp){
ActualizaMinuto(); // Para restar o sumar hora en verano invierno
EnviaDato(now()); //Enviamos la hora
//GuardaTemp();
}
Y la función que envía los datos:
/************************************************************************************/
/***************** Envia datos por Radio ********************/
/** 1:CLAVE erronea 2:Puerta abierta 3:Entra CLAVE1 4:Entra CLAVE2 5:Entra CLAVE3 ******/
/** 6:ENTRA CLAVE DE UN SOLO USO 7: Reinicio 8:Puerta cerrada **/
/* Enviamos datos, como la temperatura. Y 10 si ha habido error de TX */
/************************************************************************************/
void EnviaDato(unsigned long Dato){
const int error=10;
if(Dato_perdido){ // Avisamos de que se han perdido datos enviando un CERO
radio.stopListening();
radio.write( &error, sizeof(unsigned long)); // Enviamos el dato
radio.startListening();
delay(50);
}
radio.stopListening();
radio.write( &Dato, sizeof(unsigned long)); // Enviamos el dato
radio.startListening();
// Wait here until we get a response, or timeout (250ms)
unsigned long started_waiting_at = millis();
bool timeout = false;
while ( ! radio.available() && ! timeout )
if (millis() - started_waiting_at > 200 ) timeout = true;
if ( timeout )
{
//Serial.println("Dato enviado, pero no recibido ¡¡¡¡");
Dato_perdido=true; // Dato no recibido ¡¡¡¡
lcd.setCursor(15,1); // Situamos el cursor
lcd.print("x");
}else
{
Dato_perdido=false; // Dato recibido ok
lcd.setCursor(15,1); // Situamos el cursor
lcd.print(" ");
// Serial.println("Dato recibido OK");
}
} // Fin de EnviaDato()