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)

(Я в Бостоне;-)

Другие вопросы по тегам