Pages: [1]   Go Down
Author Topic: Acionar, via arduino, pino 9 Xbee (Hibernação)  (Read 2173 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Senhores,

Boa noite!

Qual o comando que devo colocar na rotina do meu arduino para eu acionar/desacionar o pino 9 do Xbee preso a ele para que eu possa usar a função hibernação.

Abraço,
Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Em qual pino do arduino esta conctado o pino 9 do xbee, se nao me engano basta "levar" pra um o pino 9 pra entrar em hibernacao!

void setup() {                
  // inicializa o pino digital pra saida
  pinMode(pino do ARDUINO ligado ao xbee, OUTPUT);    
}

void loop() {
  digitalWrite(pino do  ARDUINO ligado ao xbee, HIGH);   // XBEE EM HIBERNACAO
  digitalWrite(pino do  ARDUINO ligado ao xbee, LOW);    // XBEE ATIVO
 }

ERA ISTO?

 smiley-cool
« Last Edit: January 03, 2012, 06:46:22 pm by Kotch » Logged

????????????????????

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Então,

o Pino 9 é no Xbee, mas qual pino do arduino que representa o 9 do xbee estou procurando agora....

Devo colocar isso ao final da rotina, para, enviar e dormir, enviar e dormir e assim infinitamente...

OK?
Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Normalmente voce usa hibernacao pra reduzir o consumo de energia do seu xbee, por exemplo se ele esta monitorando o fluxo de agua numa tubulacao e transmitido pra rede, se nao tem fluxo de agua fica em hibernacao, poupando baterias, assim que huver o fluxo de agua voce "acorda" o danadinho e poe ele pra trabalhar a pleno vapor!

Quanto onde colocar, vai depender do seu programa, onde voce quer que ele "durma" ou ele "acorde", esta informacao é voce que tem que descobrir!

 
 smiley-cool

Logged

????????????????????

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Na verdade irá monitorar constantemente a temperatura, corrente de um motor elétrico de 15cv, além do nível de tensão de bateria que alimenta o "kit".

Na verdade, queria mesmo que ele acordasse a cada 10s, enviasse e voltasse a dormir, simples, sem muita embolação, mais mesmo para economia de energia e prolongamento da vida útil, visto que terei um painel solar para apoio.

Diante dos fatos, a programação seria exatamente aquela que você passou acima?
Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

pode postar o seu codigo, aqui?

olhe onde esta o pino 9:



 smiley-cool


* XBEE PRO.jpg (32.42 KB, 418x450 - viewed 13 times.)

* XBEE SHIELD.jpg (41.13 KB, 528x389 - viewed 13 times.)
Logged

????????????????????

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

É este o shield que voce usa?

 smiley-cool
Logged

????????????????????

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Eita amigo... não é esse shield não. Uso o stalker V2 (http://www.seeedstudio.com/wiki/Seeeduino_Stalker_v2.1)

Abaixo, segue o código que estou usando. Agradeço sua colaboração!!!
Veja se pode me ajudar.

#include <math.h>

#define TEMPERATURA_ADC 1
#define CORRENTE_ADC    0
#define BAT_ADC         7

#define blinkLed 8

#define BAUDRATE 9600

void sendXbeeTxAPI(byte address64bits[], byte divisor, int valor, int latency_ms, boolean typeTransmission);


   float pad = 9805;                       //valor resistencia do divisor de tensão
                                       
   float thermr = 10000;   float Temp;
   
   long previousMillis = 0;
   long previousMillis2 = 0;
   
   long interval = 1000;
   
   //For analog read
   double value;

   //Constants to convert ADC divisions into mains current values.
   double ADCvoltsperdiv = 0.0032;
   double VDoffset = 1.25; //Initial value (corrected as program runs)

   //Equation of the line calibration values
   double factorA = 15.2; //factorA = CT reduction factor / rsens
   double Ioffset = -0.08;
     
   //Constants set voltage waveform amplitude.
   double SetV = 127;

   //Counter
   int i=0;

   int samplenumber = 1000;
 
   //Used for calculating real, apparent power, Irms and Vrms.
   double sumI=0.0;
 
   int sum1i=0;
   double sumVadc=0.0;

   double Vadc,Vsens,Isens,Imains,sqI,Irms;
   double apparentPower;
   
void setup()
{
  pinMode(blinkLed, OUTPUT);
  Serial.begin(BAUDRATE); 
}

void loop()
{
   unsigned long currentMillis = millis();
   if(currentMillis - previousMillis > interval) {
     
      previousMillis = currentMillis;
     
      //SUPERVISORIO#########################################################
      byte address64bits[] = {0x00, 0x13, 0xA2, 0x00, 0x40, 0x6C, 0xBC, 0xC5};
      int latency_ms = 50;
     
      //trata dado temperatura e envia pacote API para coordenador
      byte divisor = 'Q';
      int valor = Temp;
      sendXbeeTxAPI(address64bits, divisor, valor, latency_ms, true);
     
      //trata dado corrente e envia pacote API para coordenador
      divisor = 'W';
      valor = Irms;
      sendXbeeTxAPI(address64bits, divisor, valor, latency_ms, true);
     
      //trata dado tensão bateria e envia pacote API para coordenador
      divisor = 'U';
      analogReference(DEFAULT);//referencia de tensão interna 1.1v no Atmega328
      int valorADC = analogRead(7);
      valor = valorADC*3;       
      sendXbeeTxAPI(address64bits, divisor, valor, latency_ms, true);
     
     
      //ETHERNET#############################################################
      address64bits[0] = 0x00; address64bits[1] = 0x13; address64bits[2] = 0xA2; address64bits[3] = 0x00;
      address64bits[4] = 0x40; address64bits[5] = 0x6F; address64bits[6] = 0x21; address64bits[7] = 0x68;
      latency_ms = 50;
     
      //trata dado temperatura e envia pacote API para ethernet
      divisor = 'Q';
      valor = Temp;
      sendXbeeTxAPI(address64bits, divisor, valor, latency_ms, true);
     
      //trata dado corrente e envia pacote API para ethernet
      divisor = 'W';
      valor = Irms;
      sendXbeeTxAPI(address64bits, divisor, valor, latency_ms, true);
     
      //trata dado tensão bateria e envia pacote API para ethernet
      divisor = 'U';
      analogReference(DEFAULT);//referencia de tensão interna 1.1v no Atmega328
      valorADC = analogRead(7);
      valor = valorADC + valorADC + valorADC;   
      sendXbeeTxAPI(address64bits, divisor, valor, latency_ms, true);
     
      }
     
   corrente();
   temperatura();
 
}

void temperatura(){
  analogReference(DEFAULT); 
  value = analogRead(TEMPERATURA_ADC);
 
  long Resistance;   
 
  Resistance=((1024 * pad / value) - pad);
  Temp = log(Resistance);
  Temp = 1 / (0.001129148 + (0.000234125 * Temp) + (0.0000000876741 * Temp * Temp * Temp));
  Temp = Temp - 273.15;     
}

void corrente(){
   analogReference(DEFAULT);
   value = analogRead(CORRENTE_ADC);
   //Summing counter
   i++;
   //Voltage at ADC
   Vadc = value * ADCvoltsperdiv;
   //Remove voltage divider offset
   Vsens = Vadc-VDoffset;
   //Current transformer scale to find Imains
   Imains = Vsens;                 
   //Calculates Voltage divider offset.
   sum1i++; sumVadc = sumVadc + Vadc;
   if (sum1i>=1000) {VDoffset = sumVadc/sum1i; sum1i = 0; sumVadc=0.0;}
   //Root-mean-square method current
   //1) square current values
   sqI = Imains*Imains;
   //2) sum
   sumI=sumI+sqI;
   if (i>=samplenumber)
   { 
      i=0;
      //Corrente em mA
      Irms = 100*factorA*sqrt(sumI/samplenumber)+Ioffset;
                   
      apparentPower = Irms * SetV;
       
      sumI=0.0;
 
   }
}

void sendXbeeTxAPI(byte address64bits[], byte divisor, int value, int latency_ms, boolean typeTransmission)
{
  if(value > 9999)
  return;
 
  if (typeTransmission)
  {
      byte unidade = value%10+0x30;
      value /= 10;     
      byte dezena = value%10+0x30;
      value /= 10;
      byte centena = value%10+0x30;
      value /= 10;     
      byte milhar = value%10+0x30;
     
      //Inicializa pacote API
      //0x7E inicia pacote
      Serial.print(0x7E ,BYTE);
      //Tamanho pacote MSB
      Serial.print(0x00 ,BYTE);
      //Tamanho pacote LSB
      Serial.print(0x16 ,BYTE);
      //Frame ID (0x10: transmissão mensagem)
      Serial.print(0x10 ,BYTE);
      //Sem retorno de resposta
      Serial.print(0x00 ,BYTE);
      //64 bits address
      Serial.print(address64bits[0] ,BYTE);
      Serial.print(address64bits[1] ,BYTE);
      Serial.print(address64bits[2] ,BYTE);
      Serial.print(address64bits[3] ,BYTE);
      Serial.print(address64bits[4] ,BYTE);
      Serial.print(address64bits[5] ,BYTE);
      Serial.print(address64bits[6] ,BYTE);
      Serial.print(address64bits[7] ,BYTE);
      //16 bit MY
      //Se desconhecido, MY: 0xFFFE
      Serial.print(0xFF ,BYTE);
      Serial.print(0xFE ,BYTE);
      //Opcções de envio
      Serial.print(0x00 ,BYTE);
      Serial.print(0x00 ,BYTE);
      //Pacote de mensagem
      Serial.print('[' ,BYTE);
      Serial.print(divisor ,BYTE);
      Serial.print(':' ,BYTE);
      Serial.print(milhar ,BYTE);
      Serial.print(centena ,BYTE);
      Serial.print(dezena ,BYTE);
      Serial.print(unidade ,BYTE);
      Serial.print(']' ,BYTE);
      //Soma do checksum
      long sum = 0x10 +
                 address64bits[0] +
                 address64bits[1] +
                 address64bits[2] +
                 address64bits[3] +
                 address64bits[4] +
                 address64bits[5] +
                 address64bits[6] +
                 address64bits[7] +
                 0xFF + 0xFE +
                 '[' + divisor + ':' +
                 milhar + centena + dezena + unidade + ']';
                 
      Serial.print(0xFF - (sum & 0xFF) ,BYTE);
  }
 
  if (!typeTransmission)
  {
      byte valueHighBit = value >> 8 & 0xFF;
      byte valueLowBit  = value & 0xFF;
     
      //Inicializa pacote API
      //0x7E inicia pacote
      Serial.print(0x7E ,BYTE);
      //Tamanho pacote MSB
      Serial.print(0x00 ,BYTE);
      //Tamanho pacote LSB
      Serial.print(0x14 ,BYTE);
      //Frame ID (0x10: transmissão informação)
      Serial.print(0x10 ,BYTE);
      //Sem retorno de resposta
      Serial.print(0x00 ,BYTE);
      //64 bits address
      Serial.print(address64bits[0] ,BYTE);
      Serial.print(address64bits[1] ,BYTE);
      Serial.print(address64bits[2] ,BYTE);
      Serial.print(address64bits[3] ,BYTE);
      Serial.print(address64bits[4] ,BYTE);
      Serial.print(address64bits[5] ,BYTE);
      Serial.print(address64bits[6] ,BYTE);
      Serial.print(address64bits[7] ,BYTE);
      //16 bit MY
      //Se desconhecido, MY: 0xFFFE
      Serial.print(0xFF ,BYTE);
      Serial.print(0xFE ,BYTE);
      //Opcções de envio
      Serial.print(0x00 ,BYTE);
      Serial.print(0x00 ,BYTE);
      //Pacote de mensagem
      Serial.print('[' ,BYTE);
      Serial.print(divisor ,BYTE);
      Serial.print(':' ,BYTE);
      Serial.print(valueHighBit ,BYTE);
      Serial.print(valueLowBit ,BYTE);

      Serial.print(']' ,BYTE);
      //Soma do checksum
      long sum = 0x10 +
                 address64bits[0] +
                 address64bits[1] +
                 address64bits[2] +
                 address64bits[3] +
                 address64bits[4] +
                 address64bits[5] +
                 address64bits[6] +
                 address64bits[7] +
                 0xFF + 0xFE +
                 '[' + divisor + ':' +
                 valueHighBit + valueLowBit + ']';
                 
      Serial.print(0xFF - (sum & 0xFF) ,BYTE);     
  }
 
      //digitalWrite(8, HIGH);
      //delay(latency_ms);
      //digitalWrite(8, LOW);
Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bele, preciso ir, amanha tenho que "pular" cedo, depois do serviço dou uma olhada no seu codigo e a noite posto alguma cosia aki!
[]'s

kotch

 smiley-cool
Logged

????????????????????

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fechado!
Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A primeira vista acho que deve mandar acordar nesta sub rotina:

void sendXbeeTxAPI(byte address64bits[], byte divisor, int value, int latency_ms, boolean typeTransmission)
{
logo apos esta linha voce manda ele acordar  pra tansmitir os dados

e antes do fim da rotina ou seja antes do }

ou seja depois desta linha:
Serial.print(0xFF - (sum & 0xFF) ,BYTE);   
 
manda ele durmir

mas deixa eu olhar com calma!

 smiley-cool
« Last Edit: January 03, 2012, 07:42:44 pm by Kotch » Logged

????????????????????

Offline Offline
Newbie
*
Karma: 0
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fechado!
Coloque lá que vou tentar descobrir o pino! Amanhã a gente testa!!!!
Abraço,
Logged

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Opz!

Tem um esquema na pagina do stalker, mas nao consegui identificar onde o pino nove do xbee se conecta no atmega!
Quem sabe voce consegue achar!
 smiley-cool

http://www.seeedstudio.com/wiki/images/thumb/d/da/Seeeduino_Stalker_v2.1_Schematic.png/600px-Seeeduino_Stalker_v2.1_Schematic.png
Logged

????????????????????

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Fechado!
Coloque lá que vou tentar descobrir o pino! Amanhã a gente testa!!!!
Abraço,

E dae? Bele?
achou o pino 9?

 smiley-cool
Logged

????????????????????

Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 381
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sumiu?
 smiley-cool
Logged

????????????????????

Pages: [1]   Go Up
Jump to: