Arduino 2 Датчики расхода для Кегератора
Всем доброго дня. Работая смиренно над своим кегератором, я вышел на перекресток, где я должен запускать прерывания, когда наливают каждый кег. Спасибо милым людям на https://www.carriots.com/, у меня есть этот код, с которым я работаю. Однако, пытаясь получить показания датчиков от 2 разных датчиков потока, он не может прочитать данные из Keg1. Функция checkKeg1() никогда не вызывается.
Моей следующей мыслью было то, что я ошибся, но если поменять местами входные контакты, другой датчик сработает, доказав, что это предположение неверно. Любой, кто может помочь мне решить эту проблему, и кто достиг совершеннолетия и находится в районе Бостона, пожалуйста, не стесняйтесь пройтись, чтобы попробовать образец готового проекта.
/*
Carriots.com
Created: January 13, 2014
Suggested Modifications from another approach: RMHayes Dec 27, 2013
*/
int flowPin = 2; // Arduino flowmeter pin number
int flowPin2 = 4;
// Declare variables
float pulsesCounter; // Main pulses counter
float pulsesCounter2;
float pulsesAux; // Auxiliary counter
float pulsesAux2;
float pulsesPrev; // Auxiliary counter to track pulses activity between loops
float pulsesPrev2;
/**
* Interrupt Service Routine for interrupt 0 (ISR0)
* ISR0 services an interrupt condition on Pin 2 - whenever voltage on that pin rises.
*/
void rpm ()
{
pulsesCounter++; // Every RISING pulse causes pulsesCounter to increase by one.
}
void rpm2 () {
pulsesCounter2++;
}
void setup()
{
pinMode(flowPin, INPUT); // Initialize the digital pin as an input
pinMode(flowPin2, INPUT);
Serial.begin(9600); // Start serial port
attachInterrupt(0, rpm, RISING); // Interrupt is attached to rpm function
attachInterrupt(0, rpm2, RISING);
sei(); // Enable interrupt 0 on Pin 2 for a RISING signal.
}
void checkKeg1()
{
cli(); // Disable interrupts to check the counter
pulsesAux = pulsesCounter; // Copy the ISR variable (main counter). Don't corrupt the counting process
sei(); // Enable interrupts
// If pulses are non-zero and doesn't change during a loop (delay time: ~1sec),
// send the data to the Serial port
if ( (pulsesAux != 0) && (pulsesPrev == pulsesAux) ) {
//Check Keg1 Level
Serial.print("Keg1:"); // Sending the string
Serial.println (pulsesAux, DEC); // Sending the pulses counter
cli(); // Disable interrupts
pulsesCounter = 0; // Reset main counter
sei(); // Enable interrupts
pulsesPrev = 0; // Reset previous counter
pulsesAux = 0; // Reset auxiliary counter
}
cli(); // Disable interrupts to copy the pulses count
pulsesPrev = pulsesAux;
sei(); // Enable interrupts
}
void checkKeg2()
{
cli(); // Disable interrupts to check the counter
pulsesAux2 = pulsesCounter2; // Copy the ISR variable (main counter). Don't corrupt the counting process
sei();
if ( (pulsesAux2 != 0) && (pulsesPrev2 == pulsesAux2) ) {
//Check Keg 2 Level
Serial.print("Keg2:");
Serial.println ( pulsesAux2, DEC); // Sending the pulses counter
cli(); // Disable interrupts
pulsesCounter2 = 0; // Reset main counter
sei(); // Enable interrupts
pulsesPrev2 = 0; // Reset previous counter
pulsesAux2 = 0; // Reset auxiliary counter
}
cli(); // Disable interrupts to copy the pulses count
pulsesPrev2 = pulsesAux2;
sei(); // Enable interrupts
}
void loop ()
{
Serial.print(myPin);
//checkKeg1();
// checkKeg2();
delay(800); // Delay time between loops 1sec
}
1 ответ
Вы пытаетесь вызвать два прерывания от одного контакта:
attachInterrupt(0, rpm, RISING); // Interrupt is attached to rpm function
attachInterrupt(0, rpm2, RISING);
rpm
никогда не будет вызван, потому что вы заменяете его rpm2
Поэтому измените одно из назначений контактов на 1 и подключите датчик к контакту 3 (см. Здесь варианты для платы Arduino)
(Я в Бостоне;-)