collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Domótica - NRF24L01, RTC, ETHERNET e SD - (Servidor)  (Lida 7033 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline kast

  • Mini Robot
  • *
  • Mensagens: 868
Domótica - NRF24L01, RTC, ETHERNET e SD - (Servidor)
« 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:
Código: [Seleccione]
//*******************************************************************************************************************
//
// 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.

« Última modificação: 14 de Outubro de 2012, 20:19 por kast »
Os electrões são nossos amigos !!! :D

Offline Silvio Cavalcante

  • Mini Robot
  • *
  • Mensagens: 1
Re: Domótica - NRF24L01, RTC, ETHERNET e SD - (Servidor)
« Responder #1 em: 07 de Novembro de 2014, 03:29 »
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

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.947
  • NERD!
Re: Domótica - NRF24L01, RTC, ETHERNET e SD - (Servidor)
« Responder #2 em: 07 de Novembro de 2014, 08:57 »
É do fio verde.

Offline Sérgio_Sena

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 1.649
    • Electronic Gear for Musicians
Re: Domótica - NRF24L01, RTC, ETHERNET e SD - (Servidor)
« Responder #3 em: 07 de Novembro de 2014, 09:24 »
Azul.
Tem que cortar o azul.


StarRider

  • Visitante
Re: Domótica - NRF24L01, RTC, ETHERNET e SD - (Servidor)
« Responder #4 em: 07 de Novembro de 2014, 09:31 »
Vermelho! ... corta o vermelho  ;D

Offline kast

  • Mini Robot
  • *
  • Mensagens: 868
Re: Domótica - NRF24L01, RTC, ETHERNET e SD - (Servidor)
« Responder #5 em: 07 de Novembro de 2014, 11:56 »
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.
Os electrões são nossos amigos !!! :D