Доброго времени уважаемые друзья есть очень интересный проект в котором нужна помощь (не бесплатная конечно), часть кода написана, нужно его доработать и дополнить. Пример того что должно получиться прикреплю на картинке.
помогите разобраться, не выводит данные с датчика в реальном времени, а при переключении показывает конечную информацию Код (C++): //Подключите красный провод к +5V, //Черный провод на массу //Желтый провод датчика к контакту #2 #include <LiquidCrystal_I2C.h> #include "TM1637.h" LiquidCrystal_I2C lcd(0x3F,16,2); // пины под LCD shield #define FLOWSENSORPIN 2 // пин для датчика расхода #define BUTTON_PIN 5 // пин Arduino подключенный к кнопке #define CLK 9 #define DIO 8 TM1637 tm1637(CLK,DIO); int clicks = 0; // текущее кол-во нажатий boolean ready = false; boolean buttonWasUp = true; volatile uint16_t pulses = 0; // считает сколько импульсов volatile uint8_t lastflowpinstate; // отслеживает состояние пина FLOWSENSORPIN volatile uint32_t lastflowratetimer = 0; // отсчитывает время между импульсами volatile float flowrate; // и использует это, чтобы вычислить скорость потока SIGNAL(TIMER0_COMPA_vect) { uint8_t x = digitalRead(FLOWSENSORPIN); if (x == lastflowpinstate) { lastflowratetimer++; return; // nothing changed! } if (x == HIGH) { //low to high transition! pulses++; } lastflowpinstate = x; flowrate = 1000.0; flowrate /= lastflowratetimer; // в герцах lastflowratetimer = 0; } void useInterrupt(boolean v) { if (v) { // Timer0 уже используется для millis() - просто прерываем // в середине и вызываю "Compare A" функция выше OCR0A = 0xAF; TIMSK0 |= _BV(OCIE0A); } else { // не вызывать функцию прерывания больше TIMSK0 &= ~_BV(OCIE0A); } } int flag=0; void setup() { { // инициализация дисплея tm1637.init(); tm1637.set(7); } lcd.init(); lcd.begin(16, 2); pinMode(BUTTON_PIN, INPUT_PULLUP); // начальное сообщение lcd.setCursor(0, 0); lcd.print("TEST CONTROLLERS"); lcd.setCursor(0, 1); lcd.print("-"); delay(100); lcd.setCursor(1, 1); lcd.print("-"); delay(100); lcd.setCursor(2, 1); lcd.print("-"); delay(100); lcd.setCursor(3, 1); lcd.print("-"); delay(100); lcd.setCursor(4, 1); lcd.print("-"); delay(100); lcd.setCursor(5, 1); lcd.print("-"); delay(100); lcd.setCursor(6, 1); lcd.print("-"); delay(100); lcd.setCursor(7, 1); lcd.print("-"); delay(100); lcd.setCursor(8, 1); lcd.print("-"); delay(100); lcd.setCursor(9, 1); lcd.print("-"); delay(100); lcd.setCursor(10, 1); lcd.print("-"); delay(100); lcd.setCursor(11, 1); lcd.print("-"); delay(100); lcd.setCursor(12, 1); lcd.print("-"); delay(100); lcd.setCursor(13, 1); lcd.print("-"); delay(100); lcd.setCursor(14, 1); lcd.print("-"); delay(100); lcd.setCursor(15, 1); lcd.print("-"); delay(1500); lcd.clear(); lcd.setCursor(1, 0); lcd.print("Bettary 100 %"); delay(3000); // Время на прочтение начального сообщения 5сек pinMode(FLOWSENSORPIN, INPUT); digitalWrite(FLOWSENSORPIN, HIGH); lastflowpinstate = digitalRead(FLOWSENSORPIN); useInterrupt(true); } void loop() { if(digitalRead(3)==HIGH&&flag==0)//если кнопка нажата // и перемення flag равна 0 , то ... { flag=1; //это нужно для того что бы с каждым нажатием кнопки //происходило только одно действие // плюс защита от "дребезга" 100% } if(digitalRead(3)==LOW&&flag==1)//если кнопка НЕ нажата //и переменная flag равна - 1 ,то ... { digitalWrite(4,!digitalRead(4)); flag=0;//обнуляем переменную flag } // счетчик нажатий, до 5 раз, потом снова по кругу, каждый раз значение нажатия записывается в переменную boolean buttonRead = digitalRead(BUTTON_PIN); if (buttonWasUp && !buttonRead) { delay(10); if (!digitalRead(BUTTON_PIN)) { clicks = (clicks + 1) % 13; ready = true; // флаг, что надо обновить экран } } if(ready) { lcd.clear(); // очистим экран ready = false; //сбрасываем флаг switch(clicks) { case 1: lcd.backlight(); lcd.setCursor(1, 0); lcd.print("Bettary 100 %"); lcd.setCursor(1, 1); lcd.print("DATA CLOCK"); tone (11, 2200, 1400); // включаем на пьезодинамик 600 Гц delay(2000); // ждем 1 секунду tone(11, 2200, 1400); delay(500); break; case 2: { lcd.backlight(); Serial.begin(9600); lcd.setCursor(4, 0); lcd.print("RASHOD"); lcd.setCursor(0, 1); lcd.print("+"); float liters = pulses; liters /= 7.5; liters /= 60.0; Serial.print(liters); Serial.println(" Liters"); lcd.setCursor(1, 1); lcd.print(liters); lcd.print(" litrov"); tm1637.display(flowrate); delay(3000);} break; case 3: {lcd.backlight(); float liters = pulses; liters /= 7.5; liters /= 60.0; lcd.setCursor(3, 0); lcd.print(pulses, DEC); lcd.setCursor(7, 0); lcd.print(" m1"); tm1637.display(liters); delay(3000);} break; } } buttonWasUp = buttonRead; }