Определение уровня воды 2

Задача этого проекта – визуализация уровня воды в тестовом резервуаре (пластиковый стакан), посредством изменения цвета свечения RGB светодиода.

Связь цвета свечения и уровня воды

Ниже привожу код c комментариями.

Инициализация портов осуществляется вызовом функции pinMode().

В цикле loop мы определяем диапазон в котором находится значение переменной water.

В диапазонах 0 – A, B – C, D – …. мы задаем фиксированный режим свечения светодиодов, используя функцию digitalWrite().

В диапазонах A – B и C – D мы рассчитываем скважность импульсов ШИМ используя функцию map().

Вывод расчётного значения ШИМ осуществляется вызовом функции analogWrite().

#define RED 9            //выбрали пины
#define GREEN 10
#define BLUE 11
#define LEVEL_A 20       //определяем уровни переходов
#define LEVEL_B 100
#define LEVEL_C 120
#define LEVEL_D 160
#define LEVEL_MAX 180    //значение этой переменной может зависит от
                         // напряжения питания и датчика

int water = 0;
int arPins[] = {RED, GREEN, BLUE};
int dL = 0; //отклонение уровня от фиксированных точек A,B или C,D. Используем для расчета скважности ШИМ.
//******************************
void setup() {
  // инициализация портов. Номера подключаемых пинов заданы в массиве, а определены через define
  for (int i = 0; i < sizeof(arPins); i++) {
    pinMode(arPins[i], OUTPUT);
  }
  pinMode(A0, INPUT);  // к входу A0 подключим датчик уровня
  Serial.begin(9600);  // подключаем монитор порта для отладки
}
//*****************************
void loop() {
 //в начале цикла получаем значение уровня воды
  water = analogRead(A0); // значение переменной "water" находится в интервале от 0 до 1023

  if (water < LEVEL_B) {  //определяем в каком режиме должны находиться режимы светодиодов 
    if(water < LEVEL_A){  //в зависимости от того, в какой интервал попадает значение переменной water
      digitalWrite(RED,LOW);  //интервал от 0 до A
      digitalWrite(GREEN,LOW);
      digitalWrite(BLUE, HIGH);
    } else {
      digitalWrite(RED,LOW);  //интервал от A до B
      dL = map(water, LEVEL_A, LEVEL_B, 1, 256);
      Serial.print("Green = "); // выводим значение датчика на монитор
      Serial.println(dL); // выводим значение датчика на монитор
      analogWrite(GREEN, dL);
      dL = 256 - dL;
       Serial.print("Blue = "); // выводим значение датчика на монитор
      Serial.println(dL); // выводим значение датчика на монитор
     analogWrite(BLUE, dL);
      }
  } else {  //больше уровны B
      digitalWrite(BLUE, LOW);  
      if(water < LEVEL_C){ // уровень между B и C
        digitalWrite(RED,LOW);
        digitalWrite(GREEN,HIGH);
      } else {
        if(water < LEVEL_D){  // уровень между С и D
          dL = map(water - LEVEL_C, LEVEL_C, LEVEL_D, 1, 256);
          Serial.print("Green = "); // выводим значение датчика на монитор
          Serial.println(dL); // выводим значение датчика на монитор
          analogWrite(RED, dL);
          dL = 256 - dL;
          Serial.print("Red = "); // выводим значение датчика на монитор
          Serial.println(dL); // выводим значение датчика на монитор
          analogWrite(GREEN, dL);
        } else { //уровень больше D
          digitalWrite(RED,HIGH);
          digitalWrite(GREEN,LOW);
        }
      }
  }

  Serial.println(water); // выводим значение датчика на монитор
  delay(50);           // задержка
}