Einladen einer Bibliothek blockiert ganzen Sketch

Hallo,

ich bin sehr neu in der Welt der Microcontroller und habe eine Frage. Eventuell kann mir hier jemand weiterhelfen. Es tritt etwas auf, was ich mir selber einfach nicht erklären kann und für mich persönlich als Anfänger nicht wirklich logisch ist. Ich habe einen Deep Sleep mithilfe der RTCZero library für meinen MKR WAN 1300 realisiert und habe erstmal ein Spielzeugbeispiel anhand eigener Internetrecherche geschrieben, um daran zu üben. Dem Skript habe ich noch Bibliotheken hinzugefügt, die ich für das Einlesen von Temperaturen durch einen DS18B20 Temperatursensor benötige.

Wenn ich sensors.begin() auskommentiere, wird der Sketch wie erwartet verarbeitet. Im void.setup() habe ich definiert, dass nach dem Hochladen des Sketches ein delay bzw. Blockade von 10 Sekunden erfolgen soll. Danach schalte ich die Board LED aus und setze das Board in einen Schlaf von 10 Sekunden, da ich einen Alarm nach 10 Sekunden vom Ausgangstermin definiert habe. Dieser Alarm (alarmMatch) weckt das Board auf und wir arbeiten danach im void loop() weiter, indem minütlich die Board LED zweimal anfängt zu blinken. In dem Zeitraum, indem es nicht blinkt, schläft es.

Wenn ich jetzt aber sensors.begin() nicht mehr auskommentiere im void setup() wird der ganze Sketch ab sensors.begin() blockiert. Der Delay von 10 Sekunden erfolgt. Die Board LED flimmert eine ms, da ich ja die Board LED ursprünglich ausschalte im Sketch und dann leuchtet sie unbehelligt weiter. Ich weiß einfach nicht, was der Grund hierfür ist und wollte fragen, ob eventuell jemand eine Idee hat? Ich wäre für jeden Tipp und Hinweis sehr dankbar.

Mein Sketch:

#include <RTCZero.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
#define ONE_WIRE_BUS 6
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

/* Create an rtc object */
RTCZero rtc;

// global variables
int alarmMinutes = 0 ;  // start minute
const int alarmInterval = 1 ;  //fixed intervalls to do something in the void loop() 

/* Set up of the real time clock
/* Change these values to set the current initial time */
const byte seconds = 0;
const byte minutes = 00;
const byte hours = 00;

/* Change these values to set the current initial date */
const byte day = 24;
const byte month = 9;
const byte year = 16;

bool alarmTriggered = false;  // variable which gets switched to true for every alarm trigger

void setup() 
{
  delay(10000); //delay so we can see normal current draw for a timespan e.g. 10 seconds
  pinMode(LED_BUILTIN, OUTPUT); //set LED pin to output
  digitalWrite(LED_BUILTIN, LOW); //turn LED off

  Serial.begin(9600);
  //sensors.begin();  // Start Temperature measurement library
  
  rtc.begin(); //Start RTC library, this is where the clock source is initialized

  rtc.setTime(hours, minutes, seconds); //set time
  rtc.setDate(day, month, year); //set date

  rtc.setAlarmTime(00, 00, 10); //set alarm time to go off in 10 seconds
  // delay 10 seconds  + set alarm 10 seconds vergehen insgesamt, wegen delay und setAlarmtime
  
  //following two lines enable alarm
  rtc.enableAlarm(rtc.MATCH_HHMMSS); //set alarm
  // When the alarm triggers, alarmMatch will be called:
  rtc.attachInterrupt(alarmMatch); //creates an interrupt that wakes the SAMD21 which is triggered by a FTC alarm
  //puts SAMD21 to sleep
  rtc.standbyMode(); //library call --> _WFI() is defined inside; Microcontroller waits for interrupt to wake up
}

void loop() {
  if (alarmTriggered) {
    alarmTriggered = false;
    digitalWrite(LED_BUILTIN, HIGH);
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);
    delay(500);

    digitalWrite(LED_BUILTIN, HIGH);
    delay(500);
    digitalWrite(LED_BUILTIN, LOW);
    delay(500);
    
    alarmMinutes = (alarmMinutes + alarmInterval) % 60;  // Manages to put minutes always between 1 and 60 Minutes; 61 % 60 = 1
    rtc.setAlarmTime(rtc.getHours(), alarmMinutes, rtc.getSeconds());
    rtc.standbyMode();    // Sleep until next alarm match
  }
}

void alarmMatch() {
  // This function is called when the alarm values match
  // and the alarm is triggered.
  alarmTriggered = true;  // Set the global triggered flag
}

Es könnte sein, dass die DallasTemperature-Lib nicht kompatibel mit Deinem Prozessor ist.

Gruß Tommy

Tommy56:
Es könnte sein, dass die DallasTemperature-Lib nicht kompatibel mit Deinem Prozessor ist.

Gruß Tommy

Hey Tommy,

danke für deinen Hinweis! Tatsächlich ist es so, dass die Library für meinem MKR WAN 1300 funktioniert. Ich habe einen Sketch, mit dem ich tatsächlich Temperaturen messen kann. Ich nutze diesen Sketch und poste ihn hier, falls jemand mal ein Spielzeugbeispiel für den MKR WAN 1300 für Temperaturmessungen mit einem DS18B20 benötigt:

/********************************************************************/
// First we include the libraries
#include <OneWire.h> 
#include <DallasTemperature.h>
/********************************************************************/
// Data wire is plugged into pin 6 on the Arduino 
#define ONE_WIRE_BUS 6
/********************************************************************/
// Setup a oneWire instance to communicate with any OneWire devices  
// (not just Maxim/Dallas temperature ICs) 
OneWire oneWire(ONE_WIRE_BUS); 
/********************************************************************/
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
/********************************************************************/ 
void setup(void) 
{ 
 // start serial port 
 Serial.begin(9600); 
 Serial.println("Dallas Temperature IC Control Library Demo"); 
 // Start up the library 
 sensors.begin(); 
} 

void loop(void) 
{ 
 // call sensors.requestTemperatures() to issue a global temperature 
 // request to all devices on the bus 
/********************************************************************/
 Serial.print(" Requesting temperatures..."); 
 sensors.requestTemperatures(); // Send the command to get temperature readings 
 Serial.println("DONE"); 
/********************************************************************/
 Serial.print("Temperature is: "); 
 Serial.print(sensors.getTempCByIndex(0)); // Why "byIndex"?  
   // You can have more than one DS18B20 on the same bus.  
   // 0 refers to the first IC on the wire 
   delay(1000); 
}

Daß eine Bibliothek funktioniert und auch die andere heißt noch nicht daß beide gleichzeitig funktionieren.

Ich kenne die MKR nicht und weiß auch nicht welche Timer die RTCZero Bibliothek verwendet. Könnte aber leicht sein das diese den gleichen Timer verwendet und darum nicht miteinander funktionieren.

Im englichen Teil des Forums ist ein Unterforum für den MKR1300 ( https://forum.arduino.cc/index.php?board=116.0 ) Schau dort mal nach oder frag da mal in englich nach. Grüße Uwe

Danke für den Hinweis! Ich frage da noch einmal speziell nach.