Ich habe und Arduino Skizze, die mehrere Operationen auf einen Zeitplan mit der TimeAlarms.h Bibliothek zu tun. Einer der Vorgänge, bei dem ein Hall-Sensor über Interrupts gelesen wird, scheint jedoch schlecht mit der TimeAlarms-Bibliothek zu interagieren. Ich verwende die TimeAlarms Bibliothek von hier: http://www.pjrc.com/teensy/td_libs_TimeAlarms.html und haben die Hall-Sensor-Skript von hier angepasst: http://www.seeedstudio.com/wiki/G3/4_Water_Flow_sensorArduino Interrupts interferieren mit TimeAlarms.h
Ich kann den Hall-Sensor-Code auf eigene gut laufen. Wenn ich jedoch versuche, den Hall-Sensor-Code zusammen mit auszuführen, hängt es nach Eingabe der check_flow
-Funktion.
Ausführen des Codes unter den Ausgaben nur enter CF
und dann hängt. Dasselbe tritt auf, wenn Sie stattdessen die check_flow_alarm_delay
-Funktion versuchen, die die TimeAlarm-Version von Delay verwendet.
Wenn Sie jedoch Alarm.timerRepeat(10, showseconds);
in Setup und Alarm.delay(0);
in Schleife auskommentieren, funktioniert der Hall-Sensor einwandfrei.
Seltsamerweise, wenn Sie sei();
und cli();
in der check_flow
Funktion kommentieren funktioniert das Skript gut und scheint korrekt mit dem Hall-Sensor zu zählen. Warum sollte das funktionieren? Und sollte ich besorgt sein, dass ich nicht aktiv die Zeit zwischen sei()
und cli()
einstelle, was zu Zuverlässigkeitsproblemen im Sensor führt?
Hinweis: Sie sollten in der Lage sein, den Code auszuführen, ohne tatsächlich einen Hall-Sensor zu haben, der Ausgang wird nur 0 L/h sein.
// reading liquid flow rate using Seeeduino and Water Flow Sensor from Seeedstudio.com
// Code adapted by Charles Gantt from PC Fan RPM code written by Crenn @thebestcasescenario.com
// http:/themakersworkbench.com http://thebestcasescenario.com http://seeedstudio.com
#include <Time.h>
#include <TimeAlarms.h>
#include <Wire.h>
volatile int NbTopsFan; //measuring the rising edges of the signal
int Calc;
int hallsensor = 2; //The pin location of the sensor
void rpm() //This is the function that the interupt calls
{
NbTopsFan++; //This function measures the rising and falling edge of the hall effect sensors signal
}
void setup() //
{
Serial.begin(9600); //This is the setup function where the serial port is initialised,
pinMode(hallsensor, INPUT); //initializes digital pin 2 as an input
attachInterrupt(0, rpm, RISING); //and the interrupt is attached
Alarm.timerRepeat(10, showseconds);
}
void loop()
{
// Serial.println(second());
// stalls at enter CF
// check_flow();
// stalls at enter CF
check_flow_alarm_delay();
Alarm.delay(0);
}
void showseconds()
{
Serial.println(second());
}
void check_flow()
{
Serial.println("enter CF");
int Calc;
NbTopsFan = 0; //Set NbTops to 0 ready for calculations
// sei(); //Enables interrupts
delay(1000); //Wait 1 second
// cli(); //Disable interrupts
Calc = (NbTopsFan * 60/5.5); //(Pulse frequency x 60)/5.5Q, = flow rate in L/hour
Serial.print (Calc, DEC); //Prints the number calculated above
Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a new line
}
void check_flow_alarm_delay()
{
Serial.println("enter CFAD");
int Calc;
NbTopsFan = 0; //Set NbTops to 0 ready for calculations
// sei(); //Enables interrupts
Alarm.delay(1000); //Wait 1 second
// cli(); //Disable interrupts
Calc = (NbTopsFan * 60/5.5); //(Pulse frequency x 60)/5.5Q, = flow rate in L/hour
Serial.print (Calc, DEC); //Prints the number calculated above
Serial.print (" L/hour\r\n"); //Prints "L/hour" and returns a new line
}
Dies scheint Ihr Problem zu sein. Wahrscheinlich müssen Sie Ihren Code ohne Interrupts neu schreiben. Siehe meine Antwort (mit Beispielcode) auf eine ähnliche Frage unter http://stackoverflow.com/questions/36382676/arduino-uno-r3-input-pins-with-gsm-shield/36392173 –