Automação residencial em módulos

HugoPT:
Ola colegas recentemente também comprei 10 nrf no ebay e este fim de semana vou brincar um pouco com eles.Vou tentar usar a lib do maniacbug e depois descrevo como correu por aqui.

Aew!!! Bem vindo ao clube Nordic RF XD

Para você a coisa deve ficar fácil, mas esses bichinhos são interessantes =)

Qual modelo você comprou (com ou sem plus, com ou sem antena, etc)?

Pessoal,

Continuo na busca infinita de resolver o problema de espaço nas caixinhas elétricas.

Não entendo quase nada de eletrônica, por isso não sei como contribuir com vocês.

Acompanhando as postagens, acho que o produto final vai ser algo parecido com isso: Think_RF V1

O que vocês acham?

Creio que o máximo que conseguimos foi o rele de estado sólido (em substituição ao rele gorducho) e interruptor touch (para tirar o trambolho do interruptor tradicional). Mas a fonte (e no meu caso as baterias) ainda ocupam muito espaço, o único negócio parece ser quebrar a parede e colocar caixinhas maiores (aquelas 2x) rs

Esse RF não é muito menor que o nordic que a maioria esta usando...

Mortis:
Bacana... e já tens as torneiras funcionando com touch? ^^

Demorei para responder porque estava com esperanças de ter uma reposta positiva, kkkkkkkk.

Por enquanto não tive muito sucesso não, mas estou com esperanças de o problema ser a torneira que eu estava testando. Ia trocar a torneira mas as ferramentas necessárias para troca sumiram, rs. A casa está um pouco bagunçada, hehehe.

O fato de estar utilizando um attiny85 não está ajudando a debugar. Se eu uso a biblioteca CapacitiveSensor, o SoftwareSerial não funciona. E também não consegui fazer o LCD funcionar com Shift Register no attiny85.

Poxa, vemos vários projetos na net usando as duas libs com o attiny, infelizmente não tenho nenhum attiny para testar, mas esse cara disse que funciona! rs

Será que tens uma má versão de alguma das livrarias (ou incompatibilidade da versão da lib com a versão da ide do arduino)?

Recebi ontem os nRF com amplificador e antena (promessa de 1 KM outdoor), vamos ver se indoor também melhorará a eficiência.

Também estou trabalhando na interface USB/Serial do android com o arduino. A ideia é poder espetar o android numa base com arduino + nrf (inicialmente a central) e aproveitar os recursos e capacidade de processamento de um sansung que esta jogado aqui :).

Muitas ideias e pouco tempo livre, mas aos poucos chegamos lá =)

Valeu pela dica! Vou olhar esse exemplo com bastante carinho, deve resolver muitos dos meus problemas! =D

LegendBR:
Valeu pela dica! Vou olhar esse exemplo com bastante carinho, deve resolver muitos dos meus problemas! =D

Espero que você tenha sucesso...

Sobre os nRF24L01, eu recebi dois com PA +LNA, from ebay, mas fiquei frustrado ao trocar os nRFs e ter desempenho pior, foi um teste bem rápido (apenas troquei os módulos em duas unidades e assisti ao tempo de resposta), o alcance foi menor que com o nRF24L01 com antena onboard e sem amplificador... :frowning:

Ainda procurarei uns capacitores de pelo menos 450uf para descartar interferência (os +PA +LNA são mais sensíveis por terem amplificadores?)e testarei em outros canais... Pensei que seria pegar meu circuito atual, tirar um e botar o outro, mas não foi assim :disappointed_relieved:

Já minha experiência com o nRF24L01+ com PA+LNA foi diferente. Meus nós escravos continuam só transmitindo quando coloco o dedo no módulo nRF24L01+, mas quando troco pelo módulo com PA+LNA, ele funciona.

Não sei se o fato do ATMega328P estar funcionando com 3.3v ao invés de 5v seria a diferença, já coloquei um capacitor eletrolítico de 200 uF, o próximo passo é aumentar esse capacitor...

Nesses momentos é duro ser hobista, se fosse cientista teria conhecimentos, equipamentos e recursos e já tinha descoberto o problema rs

Vi em algum sitio um cara com o mesmo problema (alegou trocar os módulos e o range não passar de 5 metros), mas nenhum comentário posterior e nenhum retorno sobre qualquer solução... por agora continuo com os sem PA+LNA e um node intermediário (rebatedor), até encontrarmos uma solução... infelizmente só tenho algumas horas do final de semana para testar, mas se eu encontrar algo, posto aqui.

LegendBR:
Já minha experiência com o nRF24L01+ com PA+LNA foi diferente. Meus nós escravos continuam só transmitindo quando coloco o dedo no módulo nRF24L01+, mas quando troco pelo módulo com PA+LNA, ele funciona.

Não sei se o fato do ATMega328P estar funcionando com 3.3v ao invés de 5v seria a diferença, já coloquei um capacitor eletrolítico de 200 uF, o próximo passo é aumentar esse capacitor...

Ah sim, não acredito que o problema esteja no ATMEGA, pelo que percebi, se ele trabalha com o cristal interno, 3.3v seria suficiente para manter tudo estável... Depois testarei usando os módulos bluetooth para monitorar a serial e descartar interferências oriundas das portas usb.

FUNCIONOU! heheheh, coloquei um capacitor de 0.1 uF junto com o módulo e começou a funcionar! Ainda tem algumas falhas, então preciso fazer um ajuste melhor desse capacitor.

O interessante é que depois que eu tirei o capacitor de 0.1 uF, continuou a funcionar. Acho que o problema estava no capacitor de 100 uF que está abaixo do módulo nRF24L01+. Antes ele estava muito próximo, praticamente encostado no módulo nRF24L01+. Quando afastei esse capacitor, mesmo sem o capacitor de 0.1 uF, continuou funcionando. Mas quando eu aproximava o capacitor de novo do módulo, começava a perder mais pacotes.

Ola amigos
Por acaso não queres partilhar o código com que estas a testar entre os nós.Recentemente também comprei 10 módulos no ebay, já passei os olhos na lib do maniacBug mas ainda pouco fiz, no entanto gostava de testar o comportamento que vocês relatam.Tenho andado dedicado a outras coisas e não me tem sobrado muito tempo pra os estudar :frowning:
Comprei os por serem muito populares com baixo custo e gostava de os testar.
Uma coisa que me deixou de pé a traz com estes módulos é eles trabalharem na frequência 2.4Ghz que já é ocupada com as redes Wireless, num deles fiz o upload do programa do maniacBug e sem ligar o outro modulo já me estava a escrever na serie pacote recebido lol.

Estoou usando os códigos de exemplo mesmo para testar (pingpair do RF24, helloworld_rx/tx do RF24Network) com dois arduinos, naturalmente.

E sobre essas "leituras" com o módulo desconectado, é assim mesmo, todos os meus testes tiveram o mesmo resultado, hehehe.

LegendBR:
coloquei um capacitor de 0.1 uF junto com o módulo e começou a funcionar!

Que bom que produziu efeito... Estou usando baterias de li-ion (7.4v) o LM7805 para o atmega e o LM1117 para o nrf (com capacitores de tantalum de 10uf em todas as entradas e saídas dos reguladores, como manda os datasheets), mas vamos ver o que acontece depois dos testes que citei...

HugoPT:
Tenho andado dedicado a outras coisas e não me tem sobrado muito tempo pra os estudar :frowning:

Creio que tempo de sobra esta difícil para todos nós (tristeza)... Por isso não tenho evoluído muito... É muita coisa para estudar e entender, ainda mais para leigos como eu...

Mortis:

Se seguir o quote acima verás três locais onde fiz alterações para não perder pacotes com a concorrência, o próximo passo ( depois de entender o que se passa com o PA+LNA) é testar a checagem do ack no loop do arduino (para não travar o loop do arduino com outros loops) e penso também na possibilidade de parar de usar o auto ack (percebi que as mensagens são recebidas pelos nodes, mas o ack falha).

HugoPT:
Uma coisa que me deixou de pé a traz com estes módulos é eles trabalharem na frequência 2.4Ghz que já é ocupada com as redes Wireless

Essa é uma desvantagem, ao redor de minha casa tem umas 10 redes wifi! rs

Ainda não testei, mas esse scanner esta na fila

HugoPT:
, num deles fiz o upload do programa do maniacBug e sem ligar o outro modulo já me estava a escrever na serie pacote recebido lol.

Nossa, isso não me aconteceu... qual programa fizeste o upload?

O meu esboço é o abaixo, uso a lib do maniac:

#include <RF24Network.h>
#include <RF24.h>
#include <SPI.h>
#include <Wire.h>

#define PIN_VOLT 0  //A0 - Battery State
#define PIN_THERM 1 //A1 - Temperature State

#define SW_PRESENCE 2 //D2 - Presence Switch
#define RelayOrSpkr 3 //D3 - Master: Speker/Siren (PWM)
                      //D3 - Slave: Light Relay
#define SW_DOOR 4 //D4 - Door Switch
#define JP_1 5    //D5 - JP1 Node Definition
#define JP_2 6    //D6 - JP2 Node Definition
#define JP_3 7    //D7 - JP3 Node Definition
#define LED_ON 8  //D8 - Led ONLINE

//D09 - nRF_CE (P3)
//D10 - nRF_CSN (P4)
//D11 - nRF_MOSI (P6)
//D12 - nRF_MISO (P7)
//D13 - nRF_SCK (P5)

#define TimeCheck 1000UL
#define TimeOut 300UL

#define dlyCheck 0
#define dlyMonit 1

const unsigned long intDelay[] = {100UL, 1000UL};
unsigned long longLastMillis[] = {0UL, 1000UL};

#define Debug_Mode

#define Nodes_Count 6
uint8_t this_node = 0;
int to_node_idx = 0;
unsigned long next_check_time = 0;

enum state {OFF, ON, waiting, error};

struct message_t {
  int Id;
  bool Value;
};

struct nodes_t {
  uint8_t Node;
  char Name[8]; //TODO: change to use progmem http://www.nongnu.org/avr-libc/user-manual/pgmspace.html
  state State;
  unsigned long LastRequest;
  unsigned long LastResponse;
  uint8_t retries;
  bool Light;
  bool Presence;
  bool Door;
} 
Node[Nodes_Count] = {
  {0,"Master", OFF, 0UL, 0UL},
  {1,"Living", OFF, 0UL, 0UL},
  {2,"kitchen", OFF, 0UL, 0UL},
  {3,"F-Room", OFF, 0UL, 0UL},
  {4,"B-Room", OFF, 0UL, 0UL},
  {5,"Hall", OFF, 0UL, 0UL}
};

#if defined(__AVR_ATmega2560__)
RF24 radio(9,53);
#else
RF24 radio(9,10);
#endif

RF24Network network(radio);

//Variable to print
double Temp;
float vBatt;

void handle_State(RF24NetworkHeader& header);
void handle_Response(RF24NetworkHeader& header);
void handle_Notification(RF24NetworkHeader& header);

void setup() {
  //    JP_1    Node
  //(X)	( )	( )	0
  //( )	(X)	( )	1
  //( )	( )	(X)	2
  //(X)	(X)	(X)	3
  //( )	(X)	(X)	4
  //(X)	(X)	( )	5

  //TODO: change to use direct port access
  pinMode(JP_1,INPUT); 
  pinMode(JP_2,INPUT);
  pinMode(JP_3,INPUT);

  // turn on pullup resistors
  digitalWrite(JP_1, HIGH);
  digitalWrite(JP_2, HIGH);
  digitalWrite(JP_3, HIGH);

  delay(20); //wait to stabilize

  bool JP1 = digitalRead(JP_1) == LOW;
  bool JP2 = digitalRead(JP_2) == LOW;
  bool JP3 = digitalRead(JP_3) == LOW;

  if (JP1 && !JP2 && !JP3) this_node = 0u;
  if (!JP1 && JP2 && !JP3) this_node = 1u;
  if (!JP1 && !JP2 && JP3) this_node = 2u;
  if (JP1 && JP2 && JP3) this_node = 3u;
  if (!JP1 && JP2 && JP3) this_node = 4u;
  if (JP1 && JP2 && !JP3) this_node = 5u;

  if(this_node == 0){
    to_node_idx = 1;
  }else{
    pinMode(SW_DOOR, INPUT);     //magnetic will put pin LOW
    digitalWrite(SW_DOOR, HIGH); // turn on pullup resistors

    pinMode(SW_PRESENCE, INPUT); //PIR will put pin HIGH

    pinMode(RelayOrSpkr, OUTPUT); //Light Relay
    digitalWrite(RelayOrSpkr, LOW); //OFF
  }

#if defined (Debug_Mode)
  Serial.begin(115200);
#endif

  radio.begin();

  network.begin(75, this_node);
  
#if defined (Debug_Mode)
  Serial.print(Node[this_node].Name);
  Serial.println(F(" Initialized"));
#endif

  pinMode(LED_ON, OUTPUT);
  digitalWrite(LED_ON, HIGH);
}

void loop() {
  NetCheck();

  if (this_node == 0){
    StatusRequest();
    //NodeTimeoutCheck();
  }
  else {
    /*unsigned long now = millis();
    if (now - longLastMillis[1] >= intDelay[1]) {
      GetTemperature();
      GetVoltage();
      longLastMillis[1] = now;
    }*/
  }
}

void NetCheck(){
  network.update();

  while (network.available()) {
    RF24NetworkHeader header;
    network.peek(header);

    int index = GetNodeIndex(header.from_node);

    if (index != -1){
      Node[index].LastResponse = millis();
      if (Node[index].State != ON){
        Node[index].State = ON;
        //mcp.digitalWrite(n, LOW);
      }
      switch (header.type){
      case 'S':
        handle_State(header);
        break;
      case 'R':
        handle_Response(header);
        break;
      case 'N':
        //handle_Notification(header);
        break;
      default:
#if defined (Debug_Mode)        
        Serial.print(F("WARNING - Unknown message type: "));
        Serial.println(header.type);
        network.read(header,0,0);
        break;
#endif
      }
    }
    else{
      network.read(header,0,0);
    }
  }
}

int GetNodeIndex(uint16_t NodeNum){
  int i = Nodes_Count;
  while (i--) {
    if (Node[i].Node == NodeNum)
      return i;
    else if (i == -1)
      break;
  }
  
  return -1;
}

void StatusRequest(void){
  unsigned long now = millis();

  if ((now - longLastMillis[dlyCheck] >= intDelay[dlyCheck])
    && (Node[to_node_idx].retries < 3)
    && (Node[to_node_idx].State != error) 
    && ((now - Node[to_node_idx].LastRequest) >= TimeCheck)
    ){
      longLastMillis[dlyCheck] = now;

      Node[to_node_idx].State = waiting;
      
      Node[to_node_idx].LastRequest = now;

      RF24NetworkHeader header(/*to node*/ Node[to_node_idx].Node, /*type*/ 'S' /*Status*/);
      
      if (network.write(header, &now, sizeof(now))) {
#if defined (Debug_Mode)
        Serial.print(F("Sent Status Request: "));
        Serial.print(now, 10);
        Serial.print(F(", To Node: "));
        Serial.println(Node[to_node_idx].Name);
#endif
        Node[to_node_idx].retries = 0;
      }
      else {
#if defined (Debug_Mode)
        Serial.print(F("Node: "));
        Serial.print(Node[to_node_idx].Node);
        Serial.print(F(" - "));
        Serial.print(Node[to_node_idx].Name);
        Serial.println(F(" no found"));
#endif
        Node[to_node_idx].retries++;
      }
  }

  if(to_node_idx == Nodes_Count -1)
    to_node_idx = 1;
  else
    to_node_idx++;
}

void handle_State(RF24NetworkHeader& header){
  unsigned long ReceivedMillis;

  network.read(header,&ReceivedMillis,sizeof(ReceivedMillis)); 

#if defined (Debug_Mode)
  Serial.print(F("Received from node: "));
  Serial.print(header.from_node);
  Serial.print(F(" - "));
  Serial.println(ReceivedMillis);
#endif

  RF24NetworkHeader header_response(/*to node*/ header.from_node, /*type*/ 'R' /*Status*/);

  int idx = GetNodeIndex(header.from_node);

  if (network.write(header_response, &ReceivedMillis, sizeof(ReceivedMillis))) {
#if defined (Debug_Mode)
    Serial.print(F(". response at: "));
    Serial.print(millis());
    Serial.print(F(" to "));
    Serial.println(Node[idx].Node);
#endif
  }
  else {
#if defined (Debug_Mode)
    Serial.print(F("Node: "));
    Serial.print(Node[idx].Node);
    Serial.print(F(" - "));
    Serial.print(Node[idx].Name);
    Serial.println(F(" no found"));
#endif
  }
}

void handle_Response(RF24NetworkHeader& header){

  unsigned long message;

  network.read(header,&message,sizeof(message));

  int index = GetNodeIndex(header.from_node);

#if defined (Debug_Mode)
  Serial.print(F("Received: "));
  Serial.print(message);
  Serial.print(F(", from node: "));
  Serial.print(Node[index].Node);
  Serial.print(F(" - "));
  Serial.print(Node[index].Name);
  Serial.print(F(", sent at: "));
  Serial.print(Node[index].LastRequest);
  Serial.print(F(". It took: "));
  Serial.println(millis()-Node[index].LastRequest);
#endif
}

Mortis:
Creio que o máximo que conseguimos foi o rele de estado sólido (em substituição ao rele gorducho) e interruptor touch (para tirar o trambolho do interruptor tradicional). Mas a fonte (e no meu caso as baterias) ainda ocupam muito espaço, o único negócio parece ser quebrar a parede e colocar caixinhas maiores (aquelas 2x) rs

Esse RF não é muito menor que o nordic que a maioria esta usando...

Só uma dúvida: Já pensaram na possibilidade de construir os relés ssr (opto + triac) em um módulo à parte? Penso que, caso haja a necessidade de apenas um relé, terei outros dois inutilizados (são 3 relés nas placas )? Além é claro da segurança em não ter que lidar com 110v/220v naquela caixinha.

Imaginem no banheiro? Aqui em casa é apenas um interruptor...ficariam 2 "inutilizados"?

Bacana seria a confecção de um módulo separado, com apenas um relé ssr, com ligação (Sgn + Gnd) através de fios 20 ~26 awg, até a placa embutida.

Assim teria liberdade de adicionar quantos forem as portas do microcontrolador.

PS: Tô gostando demias do projeto de vcs, pena que sepultaram o RS485.

Opa...

mgomesrr, o RS485 ainda não foi sepultado. Esta de molho :slight_smile:
Meu projeto será com o rs485.
Dei uma pausa pq tive problemas com o touch. Na protoboard funcionou tudo certinho,
depois que fiz a PCI e montei, começaram os problemas com o touch. Fiz vários testes e sempre
o resultado era instabilidade quando usado mais de um sensor com painel de vidro 4mm.
Usando vários sensores (teclas) cobertos apenas com um adesivo (vinil) funciona sem problema.
Em resumo, abandonei o touch do arduino e estou estudando o chip qtouch QT1070.
Esse chip será usado em conjunto com o arduino.
A idéia é ter uma PCI grudada no painel de vidro (espelho do interruptor) e outra PCI com os triacs/opto,
justamente como vc citou. No meu caso seria também para facilitar a ligação dos fios. Dessa forma
a placa fica menor e tenho mais espaço pra acomodar tudo dentro da caixa de interruptores.

Bom te ver de volta, mardden. Terminou a casa? :slight_smile:

A ideia é interessante, de colocar a PCI colada no espelho. Mas daí fica complicado para fazer a iluminação do botão, não?

Sobre o RS485, meus testes não estavam dando muito certo, tive uma experiência melhor com o nRF24L01+, sem contar que fica mais fácil expandir.

Sobre os TRIACs + MOCs em excesso onde não iremos utilizar, é simples: basta não soldar os componentes. Minhas placas de teste mesmo só tenho um TRIAC conectado. E sobre a possibilidade de colocar mais TRIACs, acho difícil precisar de mais de 3 em uma caixa só. Se precisar, coloco outra placa (padronizei todas as caixas no tamanho de 4" x 4" em minha casa).

Estou fazendo uns testes com a touch screen do DSi LL (maior do que a do DS normal), acho que vai ficar legal. Estou apanhando para fazer os cortes em círculos sem furar/manchar o adesivo.

Fui na Eldorado e acabei comprando um adesivo que não gostei (preto fosco). Qual o nome desse adesivo que você utilizou, mardden?

mardden:
Primeiro prototipo montado. Falta testar :smiley:

@LegendBR, o touch funcionou tranquilo na protoboard. No início ficou meio instável mas era a fonte ruim.

@mardden

Resolvestes o problema da alimentação? Qual o range de alimentação da placa? 5v ~12v?

Ao que parece já é possível usá-la com pulsadores. Esta é a versão final da placa?

Senti falta do outro conector do RS485. Em tese seriam 2. Um está proximo MAX485, e o outro? Cadê esse danado.

Por acaso estás a usar topologia diferente?

Também percebi que ainda não caistes na tentação de terceirizar a produção na China. Veja com bons olhos. Lá eles oferecem serviço de conversão de THT para SMT a preços módicos. Acho que facilita na redução do tamanho da placa (o ATMega que o diga), caso ainda precise de espaço.

Ela já está comercializável? Tens noção de preço? Tenho total interesse (não sei soldar componentes...rsrsrsr)

Desculpa o descarrego de perguntas, mas o trabalho tá ficando de parabéns.

mgomesrr:
Senti falta do outro conector do RS485. Em tese seriam 2. Um está proximo MAX485, e o outro? Cadê esse danado.

Por acaso estás a usar topologia diferente?

Você pode utilizar o mesmo conector para fazer a topologia em Daisy Chain. É só utilizar o mesmo conector para os fios de chegada e saída.

Particularmente desisti do RS485 porque percebi um problema "grave" nele. Pelo menos em meus testes, quando a parte de comunicação de um módulo falhava, toda a rede parava de se comunicar. E descobrir qual módulo falhou seria bem trabalhoso (testar todos os módulos individualmente).

Não sei se fiz alguma besteira nos meus testes, mas foi esse o resultado que tive.