Pages: [1]   Go Down
Author Topic: Comunicación Serial + Sleep Power Mode  (Read 327 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas tardes, somos nuevos en el lenguaje arduino, y estamos tratando de comunicar por medio de Serial dos arduinos, uno receptor y uno emisor, cada uno con un display de 7 segmentos cuyo valor aumenta cada que se presiona un botón (0-9) la función del receptor, es señalar con un led si los dos arduinos tienen el mismo valor.
 Mientras no se active un tercer interruptor,  el emisor debe irse al estado SLEEP_POWER_MODE, y cada que no reciba una señal por 10 segundos, el receptor debe entrar en ese modo de sleep.

Nuestro problema es básicamente

La interrupción que despierta al arduino emisor, se activa derrepente sin que sea activada por el control externo, y además agrega de manera no secuencial valores a la cuenta de los displays, se brinca de dos en dos o tres en tres. Quisiera ver si pudieran ver algún error en nuestro código así como consejos para manejar mejor la comunicación serial.

Saludos y gracias
Aquí les dejo el código.

Código del receptor:

//

#include <avr/sleep.h>
#include <avr/power.h>
#include "TimerOne.h"

int a0 = 8;
int a1 = 9;
int a2 = 10;
int a3 = 11;
int b1 = 2;
int b2 = 3;
int ind = 7;
//int timer = 0;
int Rx = 0;
int inByte = 0;
byte count = 48;
boolean ba0 = false;
boolean ba1 = false;
boolean ba2 = false;
boolean ba3 = false;

void setup()
{
  pinMode(a0, OUTPUT);
  pinMode(a1, OUTPUT);
  pinMode(a2, OUTPUT);
  pinMode(a3, OUTPUT);
  pinMode(ind, OUTPUT);
  pinMode(Rx, INPUT);
  pinMode(b1, INPUT);
  pinMode(b2, INPUT); 
  attachInterrupt(0, countup, RISING);
  Serial.begin(9600);
}

void wakeup()
{
}

void sleepnow()
{
  Serial.println("Sleep Now");
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  delay(500);
  attachInterrupt(1,wakeup, RISING);
  sleep_mode();
  sleep_disable();
  detachInterrupt(1);
  Serial.print(" Sleep Off ");
  delay(2000);
}
 
  void loop()
{
  delay (1000);
  ba0 = bitRead(count, 0);
  ba1 = bitRead(count, 1);
  ba2 = bitRead(count, 2);
  ba3 = bitRead(count, 3);
  digitalWrite(a0, ba0);   
  digitalWrite(a1, ba1);
  digitalWrite(a2, ba2); 
  digitalWrite(a3, ba3);
  if (Serial.available ()> 0)
{
 
  inByte = Serial.read(); // Lee el byte enviado por comunicación serial
}
  if (count == inByte)
  {
    digitalWrite(ind, 1);
    Serial.print("Cuenta ");
 
  }
  else
  {
    digitalWrite(ind, 0);
    Serial.print("No datos ");
  }
  Serial.print (count);
  Serial.print ("-");
  Serial.print (inByte);
  delay (1000);
  sleepnow();
}

void countup()
{
  sleep_disable();
  if (count == 57)
  {
    count = 48;
  }
  else
  {
    count++;
   
  }
}


Código del Emisor
//

#include <avr/sleep.h>
#include <avr/power.h>
#include "TimerOne.h"

int a0 = 8;
int a1 = 9;
int a2 = 10;
int a3 = 11;
int b1 = 2;
int b2 = 3;
int ind = 7;
int timer = 0;
int Tx = 1;
byte count = 0;
boolean ba0 = false;
boolean ba1 = false;
boolean ba2 = false;
boolean ba3 = false;

void setup()
{
  pinMode(a0, OUTPUT);
  pinMode(a1, OUTPUT);
  pinMode(a2, OUTPUT);
  pinMode(a3, OUTPUT);
  pinMode(ind, OUTPUT);
  pinMode(Tx, OUTPUT);
  pinMode(b1, INPUT);
  pinMode(b2, INPUT); 
  attachInterrupt(0, countup, RISING);
  Serial.begin(9600);
}

void wakeup()
{
}

void sleepnow()
{
  digitalWrite(ind, LOW);
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  delay(500);
  attachInterrupt(1,wakeup, RISING);
  sleep_mode();
  sleep_disable();
  detachInterrupt(1);
  delay(2000)
}
 
  void loop()
{
  delay (1000);
  digitalWrite(ind, HIGH);
  ba0 = bitRead(count, 0);
  ba1 = bitRead(count, 1);
  ba2 = bitRead(count, 2);
  ba3 = bitRead(count, 3);
  digitalWrite(a0, ba0);   
  digitalWrite(a1, ba1);
  digitalWrite(a2, ba2); 
  digitalWrite(a3, ba3);
  Serial.print(count);
  delay (500);
  Serial.print(count);
  delay (500);
  Serial.print(count);
  timer++;
  if(timer==3)
  {
    timer == 0;
    sleepnow();
  }
}

void countup()
{
  sleep_disable();
  if (count == 9)
  {
    count = 0;
  }
  else
  {
    count++;
  }
}
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 76
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola GrupoSaid

 Disculpad, pero no veo los antirrebotes por ningún sitio, deberíais contemplar ese punto, para evitar que las cuentas se alteren por ese motivo.

 Espero ser de ayuda en ese proyecto.

 Saludos.
Logged

Pages: [1]   Go Up
Jump to: