Шкальный индикатор
Используем линейку адресных светодиодов в качестве индикатора уровня чего-либо. Для примера, сделаем индикатор уровня освещенности. Нам понадобится самый простой фоторезистор и обычный резистор на 10 кОм в пару к нему. Схему подключения фоторезистора возьмем из урока.
В суперцикле loop будем считывать значение с ноги A0, нормировать его в диапазон 0..8 и зажигать соответствующие светодиоды.
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUMPIXELS 8
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
const int photoPin = A0;
// палитра
byte pallete[4][3] = {
{0,0,0},
{128,0,0},
{128,64,0},
{0,128,0}
};
void setup() {
pinMode(photoPin, INPUT);
pixels.begin();
Serial.begin(9600);
// немного помигаем первым светодиодом
// чтобы проверить работоспособность
for(byte i=0; i<5; i++){
pixels.setPixelColor(0, 128,0,0);
pixels.show();
delay(100);
pixels.setPixelColor(0, 0,0,0);
pixels.show();
delay(100);
}
}
void loop() {
// считываем значения с аналогового входа
int v = analogRead(photoPin);
// нормируем значения в диапазон от 0 до 7
v = v/128;
for(byte i=0; i<NUMPIXELS; i++){
// всё что выше v-го светодиода окрашиваем в чёрный
// что означает - выключаем светодиод
if (i>v){
pixels.setPixelColor(i, pallete[0][0], pallete[0][1], pallete[0][2]);
// остальные светодиоды делим на группы
// каждая группа горит своим цветом
} else {
// сначала три красных
if (i<3)
pixels.setPixelColor(i, pallete[1][0], pallete[1][1], pallete[1][2]);
// затем три оранжевых
else if (i<6)
pixels.setPixelColor(i, pallete[2][0], pallete[2][1], pallete[2][2]);
// в конце два зелёных
else if (i<8)
pixels.setPixelColor(i, pallete[3][0], pallete[3][1], pallete[3][2]);
}
}
pixels.show();
delay(10);
}
Здесь нужно пояснить, почему мы поделили v на 128. Предположим, что значения, которые приходят с фоторезистора на аналоговый вход A0 могут изменяться от 0 до 1024. В таком случае, чтобы отображать на нашей шкале изменения пропорционально изменению значения на A0, нам придется поделить v как раз на 128, ведь 1024 — это 8 раз по 128. Но если внешнее освещение изменится, или у нас будут фоторезистор и резистор других номиналов — придётся отредактировать эту формулу.
А вот и результат: