Помогите разобраться с переменными
- Войдите на сайт для отправки комментариев
Вс, 29/05/2016 - 17:26
здравствуйте! пишу код для датчиков расхода воды. Количество импульсов за секунду определил. Но мне нужен конечный результат в литрах/час. Нашел подобный код, но не могу разобраться что находиться внутри переменных 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"); } }
Спасибо, что не ответили) Это заставило меня сесть и разобраться с функцией 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); } }Одно время, помню в разных библиотеках была проблема с очисткой полей на лсд, скажем если 3-х значное число, и печатать одну цифру, то слева может оставаться какая-нить лабуда в 2-х разрядах, т.е. нужно принудительно печатать в позицию соток и десяток нули. Или пробел, чтоб затереть.
вот и у меня лабуда остается. я пробовал нули печатать принудительно, но получается не лучше. почему-то все при запуске нормально, а при выводе все начинает сьезжать непонятно куда...дак и пробел как печатать то, если переменная изменяется раз в секунду. выходит, что нужно написать условие для переменной (когда ноль, то печатать нули в нужной пизиции), так?
Одно время, помню в разных библиотеках была проблема с очисткой полей на лсд, скажем если 3-х значное число, и печатать одну цифру, то слева может оставаться какая-нить лабуда в 2-х разрядах, т.е. нужно принудительно печатать в позицию соток и десяток нули. Или пробел, чтоб затереть.
я все-таки принудительно напечатал нули, все работает. но это не очень удобный метод. неплохо было бы узнать почему так происходит, и исправлять проблему еще до ее возникновения :D
Можно без условия, сначала пишем 3-ри пробела, а потом цифры, поверх. Всякие буквы лучше перенести в сетап(), а то чё время терять - каждый раз печатать
Можно без условия, сначала пишем 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"); }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);Спасибо большое) все работает)