LusoRobótica - Robótica em Português
Robótica => Projectos de robótica => Projectos em desenvolvimento => Tópico iniciado por: kast em 14 de Outubro de 2012, 20:03
-
Boas
Depois de ter conseguido fazer os nós para a minha rede de domótica, comecei a programara parte do servidor.
O Servidor neste momento é composto por:
1x Arduino Uno
1x Ethernet W5100 shield (com microSD)
1x NRF24L01
Até ao momento ele consegue receber os dados dos nós, e envia a informação por serial e guarda esta informação no microSD.
Aqui fica o código:
//*******************************************************************************************************************
//
// SERVIDOR DOMÓTICA v0.10
//
//*******************************************************************************************************************
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <SD.h>
RF24 radio(9,8); // Define o RF24L01 radio em bus SPI bus mais os pinos 10 (CE) & 9 (CSN)
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL }; // Radio pipe addresses for the 2 nodes to communicate.
struct payload_t
{
byte id; // ID do nó
unsigned long bstatus; // Estado da bateria/pilha
unsigned long n_tms; // Numero de transmissões
unsigned long n_ftms; // Numero de falhas de transmissoes
payload_t(void): id(),bstatus(),n_tms(),n_ftms() {}
};
payload_t payload;
int nrf_cs=9;
int sd_cs=4;
int ethernet_cs=10;
int led=5;
File fich;
void setup(void)
{
Serial.begin(57600);
Serial.print("DOMOTICA SERVIDOR v0.10\n\r");
Serial.print("\n\r");
pinMode(sd_cs, OUTPUT);
pinMode(nrf_cs, OUTPUT);
pinMode(ethernet_cs, OUTPUT);
pinMode(led, OUTPUT);
//******************************
//
// Configuração do RTC
//
//******************************
// Ainda não se encontra incluído no Hardware
//******************************
//
// Configuração do SD
//
//******************************
sd_on(); //liga o SD e desliga o NRF e ETHERNET
if (!SD.begin(sd_cs)) { //inicialização do SD
Serial.println("SD não inicializado");}
else {
Serial.println("SD inicializado");}
if (SD.exists("registo.csv")) {
Serial.println("Ficheiro de registo existe."); }
else {
Serial.println("Ficheiro de registo nao existe. A criar ficheiro de registo ...");
fich = SD.open("registo.csv", FILE_WRITE);
fich.close();
Serial.println("Ficheiro de registo criado."); }
Serial.println("\n\rVerificacoes de SD terminadas.");
//******************************
//
// Configuração do ETHERNET
//
//******************************
ethernet_on();
//pinMode(ethernet_cs, OUTPUT);
//******************************
//
// Configuração do NRF24L01
//
//******************************
nrf_on();
radio.begin();
radio.setChannel(101);
radio.setAutoAck(true);
radio.setDataRate(RF24_250KBPS);
radio.setPayloadSize(sizeof(payload)); // define tamanho máximo da var a transmitir
radio.setRetries(15,15); //define n de tentativas e tempo entre elas (ainda falta perceber como e que isto esta a funcionar)
//falta definir a potência de emissão
radio.openReadingPipe(1,pipes[1]); // abre o pipe para receber
radio.openWritingPipe(pipes[0]); // abre o pipe para enviar
radio.startListening(); // inicia a escuta
radio.printDetails(); //Mostra os detalhes do radio
Serial.print("\n\rA escuta ...\n\r");
Serial.print("\n\r");
}
void loop(void)
{
if (radio.available())
{
radio.read( &payload, sizeof(payload) );
String dados="";
dados+=payload.id;
dados+=";";
dados+=payload.bstatus;
dados+=";";
dados+=payload.n_tms;
dados+=";";
dados+=payload.n_ftms;
Serial.println(dados);
radio.stopListening();
sd_on();
sd_write(dados);
nrf_on();
radio.startListening();
blink_led();
}
}
//******************************
//
// Funções/procedimentos SD
//
//******************************
void sd_on(void)
{
digitalWrite(nrf_cs,HIGH);
digitalWrite(ethernet_cs,HIGH);
digitalWrite(sd_cs,LOW);
}
void sd_write(String linha_dados)
{
File fich = SD.open("registo.csv", FILE_WRITE);
if (fich) {
fich.println(linha_dados);
fich.close();}
else {
Serial.println("Erro ao tentar escrever no SD");
}
}
//******************************
//
// Funções/procedimentos NRF24L01
//
//******************************
void nrf_on(void)
{
digitalWrite(ethernet_cs,HIGH);
digitalWrite(sd_cs,HIGH);
digitalWrite(nrf_cs,LOW);
}
//******************************
//
// Funções/procedimentos ETHERNET
//
//******************************
void ethernet_on(void)
{
digitalWrite(sd_cs,HIGH);
digitalWrite(nrf_cs,HIGH);
digitalWrite(ethernet_cs,LOW);
}
//******************************
//
// Funções/procedimentos OUTROS
//
//******************************
void blink_led(void)
{
digitalWrite(led, HIGH);
delay(1);
digitalWrite(led, LOW);
}
Próximos updates:
- Ligar ao patchube ou a qualquer lado onde possa registar os valor on-line.
Próximos upgrades:
- Um shield de forma a acomodar o NRF24L01 como deve de ser, com RTC e ainda um ecra lcd.
Se tiverem alguma ideia ou pretenderam ajudar digam qualquer coisa.
-
Bom Dia, Kast sei que esse e um assunto antigo mas estou com dificuldades em enviar um comando através do W5100 para um radio Nrf24l01 para que o mesmo acione uma carga.
Grato Silvio Cavalcante
-
É do fio verde.
-
Azul.
Tem que cortar o azul.
-
Vermelho! ... corta o vermelho ;D
-
Nitidamente este pessoal não sabe do que está a falar ... toda a gente sabe que o fio a cortar é o amarelo .... :D
Deixando de brincadeiras, Silvio, se queres ajuda tens de explicar detalhadamente qual é o teu problema.
Sei que há muitos, mesmo entre os que estão a brincar, que te podem ajudar mais que eu, que sou eng civil.