LusoRobótica - Robótica em Português
Software => Software e Programação => Tópico iniciado por: m2snd em 29 de Novembro de 2011, 22:50
-
Olá !!
Alguém me pode dar uma ajuda com o código abaixo? Quando chamo a função MorningAlarm(), // functions to be called when an alarm triggers:
void MorningAlarm(){
Serial.println("Alarm: - sob estores");
setRegisterPin(0, HIGH);
writeRegisters();
digitalWrite(Pin3, HIGH);
}
o setRegisterPin(0, HIGH), não entra em high enquanto que o digitalWrite(Pin3, HIGH); entra?
o código:
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
setTime(8,29,0,1,1,11); // set time to Saturday 8:29:00am Jan 1 2011
// create the alarms
Alarm.alarmRepeat(8,29,2, MorningAlarm); // 8:30am every day
Alarm.alarmRepeat(8,29,7, EveningAlarm); // 5:45pm every day
Alarm.alarmRepeat(dowSaturday,8,30,30,WeeklyAlarm); // 8:30:30 every Saturday
Alarm.timerRepeat(15, Repeats); // timer for every 15 seconds
Alarm.timerOnce(10, OnceOnly);
//reset all register pins
clearRegisters();
writeRegisters();
}
//set all register pins to LOW
void clearRegisters(){
for(int i = numOfRegisterPins - 1; i >= 0; i--){
registers[i] = LOW;
}
}
//Set and display registers
//Only call AFTER all values are set how you would like (slow otherwise)
void writeRegisters(){
digitalWrite(RCLK_Pin, LOW);
for(int i = numOfRegisterPins - 1; i >= 0; i--){
digitalWrite(SRCLK_Pin, LOW);
int val = registers[i];
digitalWrite(SER_Pin, val);
digitalWrite(SRCLK_Pin, HIGH);
}
digitalWrite(RCLK_Pin, HIGH);
}
//set an individual pin HIGH or LOW
void setRegisterPin(int index, int value){
registers[index] = value;
}
void loop(){
//le codigo infrared
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);
irrecv.resume(); // Receive the next value
}
digitalClockDisplay();
Alarm.delay(1000); // wait one second between clock display
//-----------------------------------------------------------------cozinha-----------------------------------------------------------
//inicio do código COZINHA subir
if ((results.value) == 0xE0E020DF){
setRegisterPin(1, LOW); //desliga descida
setRegisterPin(0, HIGH); //<<<<<<activa subida
writeRegisters();
fimTempoRele0 = millis() + 15000;
}
if ((millis ()> fimTempoRele0) || ((results.value) == 0xE0E0D12E))
{
setRegisterPin(0, LOW); //<<<<<<<desliga subida
writeRegisters();
}
//descer------ cozinha
if ((results.value) == 0xE0E010EF){
setRegisterPin(0, LOW); //<<<<<<<desliga rele de subir
setRegisterPin(1, HIGH); // liga relé de descer<--------
writeRegisters();
fimTempoRele1 = millis() + 15000;
}
if (( millis () > fimTempoRele1) || ((results.value) == 0xE0E0D12E))
{
setRegisterPin(1, LOW);
writeRegisters();
}
//-------------------------------------------------------------sala de jantar
//subir
if ((results.value) == 0xE0E0A05F){
setRegisterPin(3, LOW); //desliga descida
setRegisterPin(2, HIGH); //<<<<<<activa subida
writeRegisters();
fimTempoRele2 = millis() + 28000;
}
if ((millis ()> fimTempoRele2) || ((results.value) == 0xE0E0D12E))
{
setRegisterPin(2, LOW); //<<<<<<<desliga subida
writeRegisters();
}
//descer------ jantar
if ((results.value) == 0xE0E0906F){
setRegisterPin(2, LOW); //<<<<<<<desliga rele de subir
setRegisterPin(3, HIGH); // liga relé de descer
writeRegisters();
fimTempoRele3 = millis() + 28000;
}
if ((millis () > fimTempoRele3) || ((results.value) == 0xE0E0D12E))
{
setRegisterPin(3, LOW);
writeRegisters();
}
//-------------------------------------------------------------sala de estar
//subir
if ((results.value) == 0xE0E0609F){
setRegisterPin(5, LOW); //desliga descida
setRegisterPin(4, HIGH); //<<<<<<activa subida
writeRegisters();
fimTempoRele4 = millis() + 28000;
}
if ((millis ()> fimTempoRele4) || ((results.value) == 0xE0E0D12E))
{
setRegisterPin(4, LOW); //<<<<<<<desliga subida
writeRegisters();
}
//descer------
if ((results.value) == 0xE0E050AF){
setRegisterPin(4, LOW); //<<<<<<<desliga rele de subir
setRegisterPin(5, HIGH); // liga relé de descer
writeRegisters();
fimTempoRele5 = millis() + 28000;
}
if ((millis () > fimTempoRele5) || ((results.value) == 0xE0E0D12E))
{
setRegisterPin(5, LOW);
writeRegisters();
}
//-------------------------------inicio quarto-Q1
//subir
if ((results.value) == 0xE0E030CF){
setRegisterPin(7, LOW); //desliga descida
setRegisterPin(6, HIGH); //<<<<<<activa subida
writeRegisters();
fimTempoRele6 = millis() + 28000;
}
if ((millis ()> fimTempoRele6) || ((results.value) == 0xE0E0D12E))
{
setRegisterPin(6, LOW); //<<<<<<<desliga subida
writeRegisters();
}
//descer------ Q1
if ((results.value) == 0xE0E0D629){
setRegisterPin(6, LOW); //<<<<<<<desliga rele de subir
setRegisterPin(7, HIGH); // liga relé de descer<----------------------
writeRegisters();
fimTempoRele7 = millis() + 28000;
}
if ((millis () > fimTempoRele7) || ((results.value) == 0xE0E0D12E))
{
setRegisterPin(7, LOW);
writeRegisters();
}
//----------------------------------------------------------------------------------inicio quato 2
//subir
if ((results.value) == 0xE0E0B04F){
digitalWrite(Pin7, LOW); //desliga descida
digitalWrite(Pin6, HIGH); //<<<<<<activa subida
fimTempoRele8 = millis() + 28000;
}
if ((millis ()> fimTempoRele8) || ((results.value) == 0xE0E0D12E))
{
digitalWrite(Pin6, LOW); //desliga descida
}
//descer------ Q1
if ((results.value) == 0xE0E08877){
digitalWrite(Pin6,LOW);
digitalWrite(Pin7, HIGH); // liga relé de descer<----------------------
fimTempoRele9 = millis() + 28000;
}
if ((millis () > fimTempoRele9) || ((results.value) == 0xE0E0D12E))
{
digitalWrite(Pin7, LOW);
}
//----------------------------------------------------------inicio quarto 3
//subir
if ((results.value) == 0xE0E0708F){
digitalWrite(Pin4, LOW); //desliga descida
digitalWrite(Pin5, HIGH); //<<<<<<activa subida
fimTempoRele10 = millis() + 28000;
}
if ((millis ()> fimTempoRele10) || ((results.value) == 0xE0E0D12E))
{
digitalWrite(Pin5, LOW); //desliga descida
}
//descer------ Q3
if ((results.value) == 0xE0E0807F){
digitalWrite(Pin5,LOW);
digitalWrite(Pin4, HIGH); // liga relé de descer<----------------------
fimTempoRele11 = millis() + 28000;
}
if ((millis () > fimTempoRele11) || ((results.value) == 0xE0E0D12E))
{
digitalWrite(Pin4, LOW);
}
}//end do loop
// functions to be called when an alarm triggers:
void MorningAlarm(){
Serial.println("Alarm: - sob estores");
setRegisterPin(0, HIGH);
writeRegisters();
digitalWrite(Pin3, HIGH);
}
void EveningAlarm(){
Serial.println("Alarm: - desce estores");
}
void WeeklyAlarm(){
Serial.println("Alarm: - its Monday Morning");
}
void ExplicitAlarm(){
Serial.println("Alarm: - this triggers only at the given date and time");
}
void Repeats(){
Serial.println("15 second timer");
}
void OnceOnly(){
Serial.println("This timer only triggers once");
}
void digitalClockDisplay()
{
// digital clock display of the time
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.println();
}
void printDigits(int digits)
{
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
-
E só acontece nesse caso especifico?
-
Sim só...quando chamo o setRegisterPin(0,HIGH) noutros partes do código, por exemplo ao inicio, ele responde.
-
Tens que explicar melhor isso, remover as partes de código que não interessam para o problema e colocar aí as que faltam (como a configuração dos pinos ou onde é que está definido o numOfRegisterPins). O que é que o digitalWrite(Pin3, HIGH) tem a ver com o SetRegisterPin()?? Um é um pino do Arduino e o outro é um pino no registo.
...
Ok, já percebi o teu problema. Mas assim à partida não vejo nada de mal, assumindo que está tudo bem ligado com o hw e que as definições e configuração dos pinos que não mostras também estão bem. Faz um teste simples, um sketch só com um teste para escrever valores para o registo.
-
OK, a parte do código que falta é esta.
//infrared
#include <IRremote.h>
#include <Time.h>
#include <TimeAlarms.h>
int SER_Pin = 8; //pin 14 on the 75HC595
int RCLK_Pin = 9; //pin 12 on the 75HC595
int SRCLK_Pin = 10; //pin 11 on the 75HC595
int Pin7 = 7;
int Pin6 = 6;
int Pin5 = 5;
int Pin4 = 4;
int Pin3 = 3;
int Pin13 = 13;
int Pin2 = 2;
//infrared
int RECV_PIN = 11; //ligacao do INFRARED [1ºOUT pin11] 2ºGND 3ºVCC
//comando metronico código 5064(samsung TNT)
IRrecv irrecv(RECV_PIN);
decode_results results;
long fimTempoRele0;
long fimTempoRele1;
long fimTempoRele2;
long fimTempoRele3;
long fimTempoRele4;
long fimTempoRele5;
long fimTempoRele6;
long fimTempoRele7;
long fimTempoRele8;
long fimTempoRele9;
long fimTempoRele10;
long fimTempoRele11;
long fimTempoRele12;
long fimTempoRele13;
//CREDITOS http://bildr.org/2011/02/74hc595
//How many of the shift registers - change this
#define number_of_74hc595s 1
//do not touch
#define numOfRegisterPins number_of_74hc595s * 8
boolean registers[numOfRegisterPins];
void setup(){
pinMode(SER_Pin, OUTPUT);
pinMode(RCLK_Pin, OUTPUT);
pinMode(SRCLK_Pin, OUTPUT);
pinMode(Pin7, OUTPUT);
pinMode(Pin6, OUTPUT);
pinMode(Pin5, OUTPUT);
pinMode(Pin4, OUTPUT);
pinMode(Pin13, OUTPUT);
pinMode(Pin2, OUTPUT);
pinMode(Pin3, OUTPUT);
pinMode(Pin4, OUTPUT);
Serial.begin(9600);
Isto é parte de um código que tirei daqui http://bildr.org/2011/02/74hc595 (http://bildr.org/2011/02/74hc595), para controlar os estores com comando remoto. Até aqui tudo bem porque tenho estado a utilizar com o remoto e funciona perfeitamente. Chamo qualquer um dos registo com o comando, eles todos funcionam, inclusivamente aqui nesta parte:
//inicio do código COZINHA subir
if ((results.value) == 0xE0E020DF){
setRegisterPin(1, LOW); //desliga descida
setRegisterPin(0, HIGH); //<<<<<<activa subida
writeRegisters();
fimTempoRele0 = millis() + 15000;
}
Mais tarde lembrei-me de automatizar de forma a que a determinadas horas, os estores subam ou desçam. Para isso introduzi o TimeAlarme library para o efeito.
Acontece que na parte do código do TimeAlarme library, quando chamo a função para activar os pinos,
// functions to be called when an alarm triggers:
void MorningAlarm(){
Serial.println("Alarm: - sob estores");
setRegisterPin(0, HIGH);
writeRegisters();
digitalWrite(Pin3, HIGH);
}
qualquer um dos pinos do registo dentro desta função não funcionam. Apenas piscam uma vez e permanecem desligados. o digitalWritePin3() é apenas para despiste. Este funciona e permanece ligado até ao final do millis().
-
Isso é uma interrupção?
Experimenta declarar o array onde guardas o estado das saidas como volatile e tenta outra vez, quase de certeza que é isso.