и что?
Этот код рабочий, с этим не спорю. Но написан он криво.
эту фигню надо переписать, упростить и исправить
if(millis() - cloopTime >= 1000){
cloopTime = millis();
.... дальше по написанному
При такой замене … дальше по написанному не работает.
Первая строчка скорости потока мерцает, а вторая практически исчезает.
выложи весь код, не может он не работать, накосячил где-то
Сейчас выглядит вот так:
/*
YF‐ S201 Water Flow Sensor
Water Flow Sensor output processed to read in litres/hour
*/
volatile int flow_frequency; // с помощью этой переменной мы будем подсчитывать импульсы от датчика расходы воды
// Расчитанные литры в час
float vol = 0.0, l_minute;
unsigned char flowsensor = 2; // Вход сенсора
unsigned long currentTime;
unsigned long cloopTime;
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Подключение библиотеки
LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой
void flow () // функция обработки прерывания
{
flow_frequency++;
}
void setup()
{
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Настраиваем прерывания
sei(); // активируем прерывания
lcd.init(); // Инициализация дисплея
lcd.backlight(); // Подключение подсветки
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Water Flow Meter");
lcd.setCursor(0,1);
lcd.print("Circuit Digest");
currentTime = millis();
cloopTime = currentTime;
}
void loop ()
{
currentTime = millis();
// каждую секунду рассчитываем и выводим на экран ЖК дисплея скорость потока воды в литрах в минуту
if(currentTime >= (cloopTime + 1000))
{
cloopTime = currentTime; // Обновление cloopTime
if(flow_frequency != 0)
{
// Частота импульсов (Hz) = 7.5Q, Q это расход л/мин.
l_minute = (flow_frequency / 7.5); // Частота / 7.5Q = Расход в л/мин
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Speed: ");
lcd.print(l_minute);
lcd.print(" L/M");
l_minute = l_minute/60;
lcd.setCursor(0,1);
vol = vol +l_minute;
lcd.print("Vol:");
lcd.print(vol);
lcd.print(" L");
flow_frequency = 0; // сбрасываем счетчик
Serial.print(l_minute, DEC); // Отображаем л/мин
Serial.println(" L/Sec");
}
else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Speed: ");
lcd.print( flow_frequency );
lcd.print(" L/M");
lcd.setCursor(0,1);
lcd.print("Total:");
lcd.print(vol);
lcd.print(" L");
}
}
}
выложи код который после правки не работает
/*
YF‐ S201 Water Flow Sensor
Water Flow Sensor output processed to read in litres/hour
*/
volatile int flow_frequency; // с помощью этой переменной мы будем подсчитывать импульсы от датчика расходы воды
// Расчитанные литры в час
float vol = 0.0, l_minute;
unsigned char flowsensor = 2; // Вход сенсора
unsigned long currentTime;
unsigned long cloopTime;
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Подключение библиотеки
LiquidCrystal_I2C lcd(0x27,16,2); // Указываем I2C адрес (наиболее распространенное значение), а также параметры экрана (в случае LCD 1602 - 2 строки по 16 символов в каждой
void flow () // функция обработки прерывания
{
flow_frequency++;
}
void setup()
{
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
Serial.begin(9600);
attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Настраиваем прерывания
sei(); // активируем прерывания
lcd.init(); // Инициализация дисплея
lcd.backlight(); // Подключение подсветки
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Water Flow Meter");
lcd.setCursor(0,1);
lcd.print("Circuit Digest");
currentTime = millis();
cloopTime = currentTime;
}
void loop ()
{
if(millis() - cloopTime >= 1000){
cloopTime = millis();
}
{
cloopTime = currentTime; // Обновление cloopTime
if(flow_frequency != 0)
{
// Частота импульсов (Hz) = 7.5Q, Q это расход л/мин.
l_minute = (flow_frequency / 7.5); // Частота / 7.5Q = Расход в л/мин
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Speed: ");
lcd.print(l_minute);
lcd.print(" L/M");
l_minute = l_minute/60;
lcd.setCursor(0,1);
vol = vol +l_minute;
lcd.print("Vol:");
lcd.print(vol);
lcd.print(" L");
flow_frequency = 0; // сбрасываем счетчик
Serial.print(l_minute, DEC); // Отображаем л/мин
Serial.println(" L/Sec");
}
else {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Speed: ");
lcd.print( flow_frequency );
lcd.print(" L/M");
lcd.setCursor(0,1);
lcd.print("Total:");
lcd.print(vol);
lcd.print(" L");
}
}
}
для начала удали строки 41,42 и 43
Да, так корректно работает, спасибо, а можно в двух словах как эта замена улучшила код?
хорошо улучшила… да, неиспользуемую переменную теперь можно выкинуть
PS ищите - великое переполнение миллис
Еще раз спасибо.
Питание счетчика сделаю через бп 5 вольт и аккумулятора.
Счетчик должен работать годами и как я понимаю записывать постоянно в память показания расхода проблематично.
А вот дописать код, чтобы при отсутствии сигнала с датчика отключался дисплей…
Хотелось бы услышать совета.
тут не совет нужен а код написать, так как нельзя ничего советовать начинающему не знающему даже азов, всё можно сделать, только определится какие потери накопленных значений считаются приемлемыми минута, час, полдня, день?
А по теме:
Создать структуру данных и скидывать её в EEPROM с этой периодичностью
После последнего получения данных со счётчика, в некую переменную записываем millis, постоянно считаем время…как прошло например 5 секунд - отключаем дисплей.
Это совершенно не рационально - городить ИБП . Сколько воды израсходуете при отсутствии электричества? Стоит ли это учитывать в общем балансе? Логичнее сохранять в EEPROM, это совсем не сложно. Один из способов вам предложили:
У меня в одной поделке по другому. Датчик наличия напряжения сети на оптопаре + импульсная зарядка для питания устройства.
Нет импульсов - пишем в EEPROM, энергии конденсаторов ЗУ хватает с запасом.
По поводу экрана - надо включать его “по требованию”, смысла в постоянном отображении показаний нет.
короткое нажатие кнопки засветить экран, длинное нажатие кнопки оставить для процедуры смены фильтра, я как-то делал разную тональность на зуммер, что это именно тот режим, оказывается 99% народа не различают тональности, увы
текущий скетч может быть полезен при настройке, но тут над общей логикой поработать не мешало бы.
По датчику 1 литр это примерно 465 импульсов, при скорости потока 2-12 л/мин,
писать в память можно с интервалом 10л. с одной стороны погрешности небольшие для тонны и выше, с другой, только целочисленная математика.
Но первоначально требуется знать, в каких режимах обычно функционирует
етот фильтр. измерить скорости потоков, прикинуть расходы.
Конечно можно все оставить в куче, проц не переломится от подобного объема вычислений, не знаю как ТС.
щас, по моему, расход там считается через зад.
в бытовых мембрана приблизительно на 300 кубов, так что прибора при такой записи на три мембраны хватит (10 лет)
так примерно и прикинул
непонятно только зачем вообще это нужно, перестал удовлетворять напор, обычные фильтра поменял, не помогло - меняем мембрану )))
это да,
но так же частенько бывает,
хз зачем, хз почему… че-то там в заднице засвербило …
Вполне уважительная причина