2016-04-03 17 views
0

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 
} 

Antwort

1

delay() verwendet Interrupts. Sie zu deaktivieren, stört die Funktion.

+0

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 –