Problem mit TimerAlarm

Hi

also ich hab seid gut 2 Wochen meinen Freeduino und bin auch ganz begeistert davon. Habe schon alle möglichen Sachen probiert und es hat auch immer alles geklappt.

Jetzt sitze ich an dem eigentlichen Projekt weswegen ich mir eine Arduino Plattform geholt habe. Ich möchte gern meine Terrarienanlage Automatisieren.

Jetzt habe ich ein Problem mit der TimeAlarms lib. Die Alarme(ist das richtig?) werden nur ausgeführt wenn ich ein Alarm.delay(1); in meine loop() Funktion packe. Ist das normal so? Im Exemples steht auch ein Alarm.delay, das soll aber fürs Display sein.

Der Code ist nicht der beste, programmiere noch nicht alzulang :sweat_smile:

Vielen dank schon einmal fürs rüber gucken.

edit: hab mir grad nochmal die readme angeguckt. Da steht

“Note that the loop code calls Alarm.delay(1000) - Alarm.delay must be used
instead of the usual arduino delay function because the alarms are serviced in the Alarm.delay method.
Failing to regularly call Alarm.delay will result in the alarms not being triggered
so always use Alarm.delay instead of delay in sketches that use the Alarms library.”

Failing to regularly call Alarm.delay will result in the alarms not being triggered ← Heißt das das ich Alarm.delay aufrufen muss? Habs so verstanden das ich nur nicht mehr das normale delay verwenden darf.

#include <Time.h>  
#include <TimeAlarms.h>  

#define TIME_MSG_LEN  11   // time sync to PC is HEADER followed by unix time_t as ten ascii digits
#define TIME_HEADER  'T'   // Header tag for serial time sync message
#define TIME_REQUEST  7    // ASCII bell character requests a time sync message 

const float A = 0.003354016;
const float B = 0.000251911;
const float C = 0.00000351094;
const float D = 0.000000110518;
int red =3, yellow=4, green=5, blue=6;  //led´s on the output pins, later relay´s
const int analogInPin = A5; //Spanungsmessung
long sensorValue = 0;  //variable for analogin
int incomingByte;      // a variable to read incoming serial data into
float temp = 0;

void setup() {
  Alarm.alarmRepeat(22,00,0, LampOn);  // 22:00 every day
  Alarm.alarmRepeat(10,00,0, LampOff);  // 10:00 every day 
  Alarm.timerRepeat(2, Fan);

  // pinMode(buttonRead, INPUT);
  // pinMode(buttonWrite, INPUT);

  //outputpins
  for (int thisPin = 3; thisPin < 7; thisPin++)  {
    pinMode(thisPin, OUTPUT);      
  }
 pinMode(blue, OUTPUT);
  Serial.begin(9600); // initialize serial communications at 9600 bps:
  setSyncProvider( requestSync);  //for time over serial
  setSyncInterval(86400);//set function to call when sync required
  Serial.println("Waiting for sync message");
  Alarm.delay(100);
  if(Serial.available() > 0) 
  {
    processSyncMessage();
  }
  if(timeStatus()!= timeNotSet)   
  {
    digitalWrite(13,timeStatus() == timeSet); // on if synced, off if needs refresh   
  }
}

void loop() {
  Alarm.delay(1);  // <- ohne das geht kein alarm!?
  statusChange();
}

// functions to be called when an alarm triggers:
void LampOn(){
  Serial.println("Alarm: - turn lights on");  
  if(digitalRead(red) == HIGH){
    digitalWrite(red,LOW);
  }
  else{
    digitalWrite(red,HIGH);
  } 

}

void LampOff(){
  Serial.println("Alarm: - turn lights off");  
  if(digitalRead(red) == HIGH){
    digitalWrite(red,LOW);
  }
  else{
    digitalWrite(red,HIGH);
  } 
}

void Fan() {
  if(digitalRead(6) == HIGH){
    digitalWrite(6,LOW);
  }
  else{
    digitalWrite(6,HIGH);
  } 
}

float readTemp() {

  // read the analog in value:
  sensorValue = analogRead(analogInPin);            
  // calculate the volts on the NTC
  float volts = (sensorValue * (5000.0/1024.0)) / 1000;
  // calculate the actual resistans
  float res = (10000.0/(5.0 - volts)) * volts;        
  // calculate the tempreture
  float temp1 = A + B*log(res/4700) + C*log(pow((res/4700),2)) + D*log(pow((res/4700),3));
  temp1 = 1/temp1 - 273.15; // -273,15 for conversion from kelvin to celsius
  serialFloatPrint(temp1);
  return temp;
}

void serialFloatPrint(float f) {
  byte * b = (byte *) &f;
  Serial.write("f:");
  for(int i=0; i<4; i++) {

    byte b1 = (b[i] >> 4) & 0x0f;
    byte b2 = (b[i] & 0x0f);

    char c1 = (b1 < 10) ? ('0' + b1) : 'A' + b1 - 10;
    char c2 = (b2 < 10) ? ('0' + b2) : 'A' + b2 - 10;

    Serial.write(c1);
    Serial.write(c2);

  }
  Serial.println();
}

void statusChange() {
  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    //WElche led soll geschaltet werden?
    switch (incomingByte) {
    case 'R':
      if(digitalRead(red) == HIGH){
        digitalWrite(red,LOW);
      }
      else {
        digitalWrite(red,HIGH);
      }
      break;
    case 'Y':
      if(digitalRead(yellow)== HIGH){
        digitalWrite(yellow,LOW);
      } 
      else{
        digitalWrite(yellow,HIGH);
      }      
      break;
    case 'G':
      if(digitalRead(green) == HIGH) {
        digitalWrite(green,LOW);
      }
      else {
        digitalWrite(green,HIGH);
      }
      break;
    case 'B':
      if(digitalRead(blue) == HIGH){
        digitalWrite(blue,LOW);
      }
      else{
        digitalWrite(blue,HIGH);
      }
      break;   
    case 't':
      readTemp();
      break;

    }
  }
}

void processSyncMessage() {
  // if time sync available from serial port, update time and return true
  while(Serial.available() >=  TIME_MSG_LEN ){  // time message consists of a header and ten ascii digits
    char c = Serial.read() ; 
    Serial.print(c); 
   Serial.println(); 
    if( c == TIME_HEADER ) {       
      time_t pctime = 0;
      for(int i=0; i < TIME_MSG_LEN -1; i++){   
        c = Serial.read();          
        if( c >= '0' && c <= '9'){   
          pctime = (10 * pctime) + (c - '0') ; // convert digits to a number    
        }
      }   
      setTime(pctime);   // Sync Arduino clock to the time received on the serial port
    }  
  }
}

time_t requestSync()
{
  Serial.write(TIME_REQUEST);  
  return 0; // the time will be sent later in response to serial mesg
}

void digitalClockDisplay(){
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year()); 
  Serial.println(); 
}

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

Guten Abend funkedelic, ja, richtig erkannt. Du mußt Alarm.delay(...) verwenden ansonsten funktioniert der Alarm nicht. Gruß AgeBee

Du kannst auch Alarm.delay(0) machen. So läuft es bei mir.

Für kurze Delays kannst du auch das normale delay() verwenden. Dann wird der Alarm halt erst überprüft wenn das nächste mal Alarm.delay() in loop() gemacht wird.

Grund für die Verwendung von Alarm.delay(...) ist, daß die Alarme ja auch von Deinem gewünschten Delay mitbekommen müssen. Und das ist nur dann gewährleistet, wenn Du den Delay der Alarm-Klasse bekannt gibst. Letztlich wird das durch iterierten Aufruf der serviceAlarms-Methode in der Klasse TimeAlarms gemacht.