Помогите разобраться с переменными

viktorstep50
Offline
Зарегистрирован: 22.02.2015

 

здравствуйте! пишу код для датчиков расхода воды. Количество импульсов за секунду определил. Но мне нужен конечный результат в литрах/час. Нашел подобный код, но не могу разобраться что находиться внутри переменных currentTime и cloopTime. Помогите, пожалуйста, разобраться как работает даный код.

/*
YF‐ S201 Water Flow Sensor
Water Flow Sensor output processed to read in litres/hour
Adaptation Courtesy: www.hobbytronics.co.uk
*/
volatile int flow_frequency; // Measures flow sensor pulses
unsigned int l_hour; // Calculated litres/hour
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
void flow () // Interrupt function
{
   flow_frequency++;
}
void setup()
{
   pinMode(flowsensor, INPUT);
   digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
   Serial.begin(9600);
   attachInterrupt(0, flow, RISING); // Setup Interrupt
   sei(); // Enable interrupts
   currentTime = millis();
   cloopTime = currentTime;
}
void loop ()
{
   currentTime = millis();
   // Every second, calculate and print litres/hour
   if(currentTime >= (cloopTime + 1000))
   {
      cloopTime = currentTime; // Updates cloopTime
      // Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
      l_hour = (flow_frequency * 60 / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
      flow_frequency = 0; // Reset Counter
      Serial.print(l_hour, DEC); // Print litres/hour
      Serial.println(" L/hour");
   }
}

 

viktorstep50
Offline
Зарегистрирован: 22.02.2015

Спасибо, что не ответили) Это заставило меня сесть и разобраться с функцией millis() :) Но теперь есть другая проблемка. в программе есть переменная, в которую записывается количество импульсов за секунду, и эта переменная обнуляется каждую секунду. в мониторе порта все нормально - если импульсов нет, то печатает ноль. а вот с дисплеем все не так. после того как датчик расхода воды перестает работать на дисплее значение количества импульсов в секунду не обнуляется. Оно падает, но не до нуля. Я уже голову сломал, но так и не понял в чем проблема.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
volatile int pulses1=0;
volatile int pulses2=0;
unsigned int l_hour1;
unsigned int l_hour2;
unsigned long currentTime;
unsigned long cloopTime;
int sens1 = 2;
int sens2 = 4;

void fun1 ()
{
  pulses1++;
}
void fun2 ()
{
  pulses2++;
} 

void setup()
{
   pinMode(sens1, INPUT);
   pinMode(sens2, INPUT);
   
   digitalWrite(sens1, HIGH);
   digitalWrite(sens2, HIGH);
   
   Serial.begin(9600);
   attachInterrupt(0, fun1, RISING);
   attachInterrupt(1, fun2, RISING);
    sei(); 

     lcd.init();                                     
      lcd.backlight();
       lcd.clear();
        lcd.print("Hello!");
        delay(3000);
        lcd.clear();
  }
  void loop ()   
{
currentTime = millis();

   if(currentTime >= (cloopTime + 1000))
   {
      cloopTime = currentTime;
        l_hour1 = (pulses1 * 60 / 7.5);
        l_hour2 = (pulses2 * 60 / 7.5);
      pulses1 = 0;
      pulses2 = 0; 
//Serial.println(pulses1);
//Serial.println(pulses2);

 lcd.setCursor(2, 0);
  lcd.print("Q1=");
   lcd.print (l_hour1);
 
 lcd.setCursor(10, 0);
  lcd.print("Q2=");
   lcd.print (l_hour2); 
       
   }
  
}

 

MagicianT
Offline
Зарегистрирован: 03.10.2015

Одно время, помню в разных библиотеках была проблема с очисткой полей на лсд, скажем если 3-х значное число, и печатать одну цифру, то слева может оставаться какая-нить лабуда в 2-х разрядах, т.е. нужно принудительно печатать в позицию соток и десяток нули.  Или пробел, чтоб затереть.

viktorstep50
Offline
Зарегистрирован: 22.02.2015

вот и у меня лабуда остается. я пробовал нули печатать принудительно, но получается не лучше. почему-то все при запуске нормально, а при выводе все начинает сьезжать непонятно куда...дак и пробел как печатать то, если переменная изменяется раз в секунду. выходит, что нужно написать условие для переменной (когда ноль, то печатать нули в нужной пизиции), так?

viktorstep50
Offline
Зарегистрирован: 22.02.2015

MagicianT пишет:

Одно время, помню в разных библиотеках была проблема с очисткой полей на лсд, скажем если 3-х значное число, и печатать одну цифру, то слева может оставаться какая-нить лабуда в 2-х разрядах, т.е. нужно принудительно печатать в позицию соток и десяток нули.  Или пробел, чтоб затереть.

я все-таки принудительно напечатал нули, все работает. но это не очень удобный метод. неплохо было бы узнать почему так происходит, и исправлять проблему еще до ее возникновения :D

MagicianT
Offline
Зарегистрирован: 03.10.2015

Можно без условия, сначала пишем 3-ри пробела, а потом цифры, поверх. Всякие буквы лучше перенести в сетап(), а то чё время терять - каждый раз печатать

viktorstep50
Offline
Зарегистрирован: 22.02.2015
MagicianT пишет:

Можно без условия, сначала пишем 3-ри пробела, а потом цифры, поверх. Всякие буквы лучше перенести в сетап(), а то чё время терять - каждый раз печатать

с буквами понял, все перенес. а с цифрами не очень...это вот так? тогда все куда-то "едет") мне же нули или пробелы нужно печатать только когда переменные равняются нулю... причем на место циферок...

 lcd.setCursor(5, 0);
  lcd.print("   ");
   lcd.print (l_hour1);
 
 lcd.setCursor(13, 0);
   lcd.print("   ");
   lcd.print (l_hour2);

вот так с условием работает, но каждый раз проверять не вариант...

 lcd.setCursor(5, 0);
   lcd.print (l_hour1);
 lcd.setCursor(13, 0);
   lcd.print (l_hour2);        
   }
 if (pulses1==0 && pulses2==0)
   {
    lcd.setCursor(5, 0);
   lcd.print ("000");
 
 lcd.setCursor(13, 0);
   lcd.print ("000");
   }  
MagicianT
Offline
Зарегистрирован: 03.10.2015
lcd.setCursor(5, 0);
 lcd.print("   ");
lcd.setCursor(5, 0); 
 lcd.print (l_hour1);

lcd.setCursor(13, 0);
  lcd.print("   ");
lcd.setCursor(13, 0);
  lcd.print (l_hour2);

 

viktorstep50
Offline
Зарегистрирован: 22.02.2015

Спасибо большое) все работает)