In meinem Programm verwende ich sowohl einen timerInterrupt, der alle 1 Sekunde ausgelöst wird, um den Wasserdurchfluss während dieses Zeitintervalls zu berechnen, als auch zwei Interrupts, die, wenn sie aktiv sind, die Variablen Pulscount und Pulscount1 inkrementieren, die später für die Berechnung des Wasserdurchflusses verwendet werden. Ich verwende den arduino mega 2560 für diesen Zweck. Laut Datenblatt befinden sich die InterruptPins an Pin 2, 3, 18, 19, 20 und 21. Wenn ich Pin 18 und 19 benutze, funktioniert mein Programm ohne Probleme. Aber wenn ich die Pins 2, 3, 20 und 21 verwende, sind die auf dem LCD angezeigten Werte seltsam und manchmal nimmt die Helligkeit des LCD ab. Hat jemand eine Idee, woher das Problem kommt?
Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
float cfactor1 = 7;
byte interrupt1 = 18;
byte sensorPin1 = 6;
volatile byte pulseCount1;
float flowRate1;
unsigned int f_ml1;
unsigned long t_ml1;
unsigned long oldTime1;
float cfactor = 7;
int interrupt = 19;
byte sensorPin = 5;
volatile byte pulseCount;
float flowRate;
unsigned int f_ml;
unsigned long t_ml;
unsigned long oldTime;
int semic;
int semic1;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void setup()
{
lcd.init();
lcd.backlight();
Serial.begin(9600);
pinMode(sensorPin, INPUT);
digitalWrite(sensorPin, HIGH);
pinMode(sensorPin1, INPUT);
digitalWrite(sensorPin1, HIGH);
cli(); // disable interrupts
// reset
TCCR1A = 0; //set TCCR1A register to 0000
TCCR1B = 0; //set TCCR1B register to 0
TCNT1 = 0; // reset counter value
OCR1A = 15624; //compare match register für 1 Sekunde (15624pulse vorher)
// set prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
TCCR1B |= (1 << WGM12); //turn on CTC mode
TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt
sei(); //allow interrupts
attachInterrupt(digitalPinToInterrupt(interrupt), pulseCounter, RISING);
attachInterrupt(digitalPinToInterrupt(interrupt1), pulseCounter1, RISING);
}
void loop()
{
lcd.setCursor(0, 0);
lcd.print("a:");
lcd.print(int(flowRate));
lcd.print(".");
semic = (flowRate - int(flowRate)) * 10;
lcd.print(semic, DEC) ;
lcd.print("L/min");
lcd.setCursor(0, 2);
lcd.print("b:");
lcd.print(int(flowRate1));
lcd.print(".");
semic1 = (flowRate1 - int(flowRate1)) * 10;
lcd.print(semic1, DEC) ;
lcd.print("L/min");
}
ISR(TIMER1_COMPA_vect) { // function which will be called when an interrupt occure at timer 1
if ((millis() - oldTime) > 1000)
{
//flowRate = ((1000.0 / (millis() - oldTime)) * pulseCount) / cfactor;
flowRate = ((1000.0 / 1000) * pulseCount) / cfactor;
oldTime = millis();
f_ml = (flowRate / 60) * 1000;
t_ml += f_ml;
Serial.print("Current flow: ");
Serial.print(int(flowRate));
Serial.print(".");
semic = (flowRate - int(flowRate)) * 10;
Serial.print(semic, DEC) ;
Serial.print("L/min");
Serial.print(" Total: ");
Serial.print(t_ml);
Serial.println("mL");
pulseCount = 0;
attachInterrupt(interrupt, pulseCounter, RISING);
//flowRate1 = ((1000.0 / (millis() - oldTime1)) * pulseCount1) / cfactor1;
flowRate1 = ((1000.0 / 1000) * pulseCount1) / cfactor1;
oldTime1 = millis();
f_ml1 = (flowRate1 / 60) * 1000;
t_ml1 += f_ml1;
Serial.print("Current flow1: ");
Serial.print(int(flowRate1));
Serial.print(".");
semic1 = (flowRate1 - int(flowRate1)) * 10;
Serial.print(semic1, DEC) ;
Serial.print("L/min1");
Serial.print(" Total: ");
Serial.print(t_ml1);
Serial.println("mL1");
pulseCount1 = 0;
attachInterrupt(interrupt1, pulseCounter1, RISING);
}
}
void pulseCounter()
{
pulseCount++;
}
void pulseCounter1()
{
pulseCount1++;
}