Go Down

Topic: Automação residencial em módulos (Read 80278 times) previous topic - next topic

mgomesrr

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: http://fritzing.org/projects/think_rf-v1

O que vocês acham?

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

LegendBR


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.

Mortis

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á =)

LegendBR

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

Mortis


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...  :(

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  :smiley-sad-blue:

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

Mortis

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.


Mortis


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.

LegendBR

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.

HugoPT

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 :(
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.
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B

LegendBR

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.

Mortis


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


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


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




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


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


, 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?

Mortis

O meu esboço é o abaixo, uso a lib do maniac:
Code: [Select]

#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
}

mgomesrr


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.

Go Up