Расходомер воды и RGB светодиод

Здравствуйте необходимо к имеющемуся коду добавить свечение RGB светодиода в зависимости при скорости потока воды менее 2,5 л/м горит красным, от 2,5 до 3,5 зеленый, больше 3,5 л/м опять красный. Как это добавить к имеющемуся коду

                                                                //
uint32_t varTime;                                               // Объявляем переменную для хранения времени последнего расчёта.
float    varQ;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV;                                                  // Объявляем переменную для хранения рассчитанного объема воды (л).
volatile uint16_t varF;                                         // Объявляем переменную для хранения частоты импульсов (Гц).
                                                                //
void funCountInt(){varF++;}                                     // Определяем функцию, которая будет приращать частоту импульсов.
                                                                //
void setup(){                                                   //
     Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта.
     pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
     uint8_t intSensor = digitalPinToInterrupt(pinSensor);      // Определяем номер прерывания который использует вывод pinSensor.
     attachInterrupt(intSensor, funCountInt, RISING);           // Назначаем функцию funCountInt как обработчик прерываний intSensor при каждом выполнении условия RISING - переход от 0 к 1.
     if(intSensor<0){Serial.print("Указан вывод без EXT INT");} // Выводим сообщение о том, что датчик подключён к выводу не поддерживающему внешнее прерывание.
     varTime=0; varQ=0; varV=0; varF=0;                         // Обнуляем все переменные.
}                                                               //
                                                                //
void loop(){                                                    //
//   Если прошла 1 секунда:                                     //
     if( (varTime+1000)<millis() || varTime>millis() ){         // Если c момента последнего расчёта прошла 1 секунда, или произошло переполнение millis то ...
     //  Определяем скорость и расход воды:                     //
         varQ    = (float)varF / 450.0f;                        // Определяем скорость потока воды л/с.
         varF    = 0;                                           // Сбрасываем частоту импульсов датчика, значение этой переменной приращается по прерываниям.
         varTime = millis();                                    // Сохраняем  время последних вычислений.
         varV   += varQ;                                        // Определяем объем воды л.
     //  Выводим рассчитанные данные:                           //
         Serial.println((String) "Объем "+varV+"л, скорость "+(varQ*60.0f)+"л/м.");
     }                                                            //
}                                                               //```

Вы ищите кто за вас это сделает??? Если да, то вам в коммерческий раздел “Ищу исполнителя”

1 лайк

Используйте оператор if

Т.е if(varQ < "пороговое значение"){зажигаем нужный диод} И.Т.Д.

Пробую горит только один цвет

#define GRN 12                                                  // присваиваем имя GRN для пина 12
uint8_t  pinSensor = 2;                                         // Определяем номер вывода Arduino, к которому подключён датчик расхода воды.
                                                                //
uint32_t varTime;                                               // Объявляем переменную для хранения времени последнего расчёта.
float    varQ;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV;                                                  // Объявляем переменную для хранения рассчитанного объема воды (л).
volatile uint16_t varF;                                         // Объявляем переменную для хранения частоты импульсов (Гц).
                                                                //
void funCountInt(){varF++;}                                     // Определяем функцию, которая будет приращать частоту импульсов.
                                                                //
void setup(){                                                   //
     Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта.
     pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
     uint8_t intSensor = digitalPinToInterrupt(pinSensor);      // Определяем номер прерывания который использует вывод pinSensor.
     attachInterrupt(intSensor, funCountInt, RISING);           // Назначаем функцию funCountInt как обработчик прерываний intSensor при каждом выполнении условия RISING - переход от 0 к 1.
     if(intSensor<0){Serial.print("Указан вывод без EXT INT");} // Выводим сообщение о том, что датчик подключён к выводу не поддерживающему внешнее прерывание.
     varTime=0; varQ=0; varV=0; varF=0;                         // Обнуляем все переменные.
     pinMode(RED, OUTPUT);                                      // используем Pin11 для вывода
     pinMode(GRN, OUTPUT);                                      // используем Pin12 для вывода
}                                                               //
                                                                //
void loop(){                                                    //
//   Если прошла 1 секунда:                                     //
     if( (varTime+1000)<millis() || varTime>millis() ){         // Если c момента последнего расчёта прошла 1 секунда, или произошло переполнение millis то ...
     //  Определяем скорость и расход воды:                     //
         varQ    = (float)varF / 450.0f;                        // Определяем скорость потока воды л/с.
         varF    = 0;                                           // Сбрасываем частоту импульсов датчика, значение этой переменной приращается по прерываниям.
         varTime = millis();                                    // Сохраняем  время последних вычислений.
         varV   += varQ;                                        // Определяем объем воды л.
     //  Выводим рассчитанные данные:                           //
         Serial.println((String) "Объем "+varV+"л, скорость "+(varQ*60.0f)+"л/м.");
         if( varQ <= 5){digitalWrite(RED, HIGH);              // включаем красный свет
                         digitalWrite(GRN, LOW);
}
         if( varQ >= 5.1){digitalWrite(RED, LOW);              // включаем зеленый свет
                         digitalWrite(GRN, HIGH);
}
         if( varQ <= 14.9){digitalWrite(RED, LOW);              // включаем зеленый свет
                         digitalWrite(GRN, HIGH);
}
         if( varQ >= 15){digitalWrite(RED, HIGH);              // включаем красный свет
                         digitalWrite(GRN, LOW);
}
     }    }                                                          //
//   Тут может выполняться ваш код ...                          //                                                               //```

Один раз попробовать - это очень мало в нашем деле. Приходится пробовать по многу раз, учиться , разбираться…

По вопросу скажу, что если можно, лучше избегать сравнивать тип float, и перевести значения в целые числа.

Так же иногда к месту применить оператор else if

Работает в точности так, как написали.
Чувствуется, Вы пока не очень уверенно чувствуете себя в Си.
Напишите все необходимые условия подробно по-русски и внимательно просмотрите, как при разных значениях будут работать светодиоды. Когда убедитесь, что все написано правильно, переписывайте с русского на Си.

Чувствуется верно. Это первый проект на Ардуино, первый код на Си. Так что все очень сложно.

Ну я ж написал: трудно на Си - пишите по-русски.
Вот сами смотрите, как выполняется Ваш код.
Пусть varQ = 3.0.

  1. срабатывает условие в стр. 32.
  2. условие стр. 35 не срабатывает.
  3. срабатывает условие в стр. 38.
  4. условие стр. 41 не срабатывает.

Это то, чего Вы хотели?

При значении varQ = 3.0.

  1. срабатывает условие в стр. 32.
  2. условие стр. 35 не срабатывает.
  3. условие стр. 38 не срабатывает.
  4. условие стр. 41 не срабатывает.

При значении varQ = 8.0.

  1. условие стр. 32 не срабатывает.
  2. срабатывает условие в стр. 35
  3. срабатывает условие в стр. 38
  4. условие стр. 41 не срабатывает.

При значении varQ = 16.0.

  1. условие стр. 32 не срабатывает.
  2. условие стр. 35 не срабатывает.
  3. условие стр. 38 не срабатывает.
  4. срабатывает условие в стр. 41.

Вот такой алгоритм работы я вижу

А чейта при 3.0 условие в 38 не срабатывает?

Я понимаю что здесь загвоздка в строках 35 и 38, но как объяснить на Си что при больше 5,1 но меньше 14,9 должен гореть зеленый цвет

if( varQ >= 5.1 && varQ <= 14,9)
                         

попробовал, горит только красный, зеленый не хочет

#define RED 11                                                  // присваиваем имя RED для пина 11
#define GRN 12                                                  // присваиваем имя GRN для пина 12
uint8_t  pinSensor = 2;                                         // Определяем номер вывода Arduino, к которому подключён датчик расхода воды.
                                                                //
uint32_t varTime;                                               // Объявляем переменную для хранения времени последнего расчёта.
float    varQ;                                                  // Объявляем переменную для хранения рассчитанной скорости потока воды (л/с).
float    varV;                                                  // Объявляем переменную для хранения рассчитанного объема воды (л).
volatile uint16_t varF;                                         // Объявляем переменную для хранения частоты импульсов (Гц).
                                                                //
void funCountInt(){varF++;}                                     // Определяем функцию, которая будет приращать частоту импульсов.
                                                                //
void setup(){                                                   //
     Serial.begin(9600);                                        // Инициируем передачу данных в монитор последовательного порта.
     pinMode(pinSensor, INPUT);                                 // Конфигурируем вывод к которому подключён датчик, как вход.
     uint8_t intSensor = digitalPinToInterrupt(pinSensor);      // Определяем номер прерывания который использует вывод pinSensor.
     attachInterrupt(intSensor, funCountInt, RISING);           // Назначаем функцию funCountInt как обработчик прерываний intSensor при каждом выполнении условия RISING - переход от 0 к 1.
     if(intSensor<0){Serial.print("Указан вывод без EXT INT");} // Выводим сообщение о том, что датчик подключён к выводу не поддерживающему внешнее прерывание.
     varTime=0; varQ=0; varV=0; varF=0;                         // Обнуляем все переменные.
     pinMode(RED, OUTPUT);                                      // используем Pin11 для вывода
     pinMode(GRN, OUTPUT);                                      // используем Pin12 для вывода
}                                                               //
                                                                //
void loop(){                                                    //
//   Если прошла 1 секунда:                                     //
     if( (varTime+1000)<millis() || varTime>millis() ){         // Если c момента последнего расчёта прошла 1 секунда, или произошло переполнение millis то ...
     //  Определяем скорость и расход воды:                     //
         varQ    = (float)varF / 450.0f;                        // Определяем скорость потока воды л/с.
         varF    = 0;                                           // Сбрасываем частоту импульсов датчика, значение этой переменной приращается по прерываниям.
         varTime = millis();                                    // Сохраняем  время последних вычислений.
         varV   += varQ;                                        // Определяем объем воды л.
     //  Выводим рассчитанные данные:                           //
         Serial.println((String) "Объем "+varV+"л, скорость "+(varQ*60.0f)+"л/м.");
         if( varQ <= 5.0){digitalWrite(RED, HIGH);              // включаем красный свет
                         digitalWrite(GRN, LOW);
}
         else if( varQ >= 5.1 && varQ <= 14,9){digitalWrite(RED, LOW);              // включаем зеленый свет
                                             digitalWrite(GRN, HIGH);
}
         else if( varQ >= 15.0){digitalWrite(RED, HIGH);              // включаем красный свет
                           digitalWrite(GRN, LOW);
}
}  }                                                        //

Правильно, логика у вас нарушена, два else убирите, получится индуский код, но работать должно,

Для меня сейчас было бы победой даже если получится индуский код,

Попробовал, убрал, else продолжает гореть только красный.

Да, это я уже талый, втавляйте в if вывод в сериал, что бы понять в какие вы эаходите, а в какие нет.

И varQ заодно выводите.

 if( varQ >= 5.1 && varQ <= 14,9) {
     Зелёный 
 } else { 
     Красный
 }