Задача этого проекта – визуализация уровня воды в тестовом резервуаре (пластиковый стакан), посредством изменения цвета свечения 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); // задержка
}