Шкальный индикатор

Используем линейку адресных светодиодов в качестве индикатора уровня чего-либо. Для примера, сделаем индикатор уровня освещенности. Нам понадобится самый простой фоторезистор и обычный резистор на 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. Но если внешнее освещение изменится, или у нас будут фоторезистор и резистор других номиналов — придётся отредактировать эту формулу.

А вот и результат:


Изменено:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.