Сигнализация для холодильника — твой персональный диетолог

Проекты на Arduino и Slot Shield

Похудеть просто — нужно меньше есть. Особенно после 6 вечера и раньше 7 утра. Но что делать, если по ночам из холодильника подозрительным образом исчезают продукты? Как пресечь ночной дожор и выявить лунатика? Поможет устройство на Slot Shield.

Устройство работает по расписанию, ориентируясь на время c модуля RTC. Как только устройство переходит в режим сигнализации, контроллер начинает опрашивать фоторезистор. В закрытом холодильнике света нет, но стоит хотя бы приоткрыть дверцу, сработает противообжорная сирена — запищит баззер и замигает маячок из светодиодной матрицы. Любой лунатик проснётся, любой воришка — устыдится.

Что потребуется

Видеоинструкция

Как собрать

Установите Troyka Slot Shield на Iskra Neo

Переверните датчик освещённости на 180 градусов и вставьте в средний слот нижнего ряда

Вставьте пьезопищалку в правый верхний слот.

Вставьте модуль часов реального времени в левый верхний слот.

Установите цветную LED матрицу 4×4

Скетч

Прошейте контроллер скетчем через Arduino IDE.

firge-alarm-system.ino
// библиотека для работы I²C
#include <Wire.h>
// библиотека для работы с часами реального времени
#include "TroykaRTC.h"
// библиотека для работы с RGB-матрицей
#include <Adafruit_NeoPixel.h>
// библиотека для работы с датчиком освещённости (Troyka-модуль)
#include <TroykaLight.h>
 
// номер пина, к которому подключена RGB-матрица
#define MATRIX_PIN  A2
// пин сенсора освещённости
#define LIGHT_PIN   A1
// пин зуммера
#define BUZZER_PIN  4
// количество светодиодов в матрице
#define LED_COUNT   16
 
// создаём объект для работы с часами реального времени
RTC clock;
// создаём объект класса Adafruit_NeoPixel
Adafruit_NeoPixel matrix = Adafruit_NeoPixel(LED_COUNT, MATRIX_PIN, NEO_GRB + NEO_KHZ800);
 
// создаём объект для работы с датчиком освещённости
// и передаём ему номер пина выходного сигнала
LIGHT sensorLight(LIGHT_PIN);
 
bool state = false;
 
void setup() 
{
  // открываем последовательный порт
  Serial.begin(9600);
  // инициализация RGB-матрицы
  matrix.begin();
}
 
void loop()
{
  // считываем текущее время в часах
  int hour = clock.getHour();
  // если текущий период времени попадает в диапазон с 18:00 до 7:00
  if (hour > 18 && hour < 7) {
    // считываем показания с датчика освещенности в Люксах
    int sensorLightValue = sensorLight.readLight();
    Serial.println(sensorLightValue);
    // если показание более 50 люкс
    if (sensorLightValue > 50) {
      tone(BUZZER_PIN, 1000, 400);
      state = !state;
      if (state) {
      // заполняем RGB-матрицу по сегментам «бегущий огонь» красного цвета
        colorWipe(matrix.Color(255, 0, 0), 10);
      } else {
      // заполняем RGB-матрицу по сегментам «бегущий огонь» синего цвета
      colorWipe(matrix.Color(0, 0, 255), 10);
      }
    } else {
      // гасим RGB-матрицу по сегментам «бегущая тень»
      colorWipe(matrix.Color(0, 0, 0), 10);
    }
  }
  delay(500);
}
 
// функция заполнения каждого сегмента
void colorWipe(uint32_t c, uint8_t wait)
{
  for (uint16_t i = 0; i < matrix.numPixels(); i++) {
    // заполняем текущий сегмент выбранным цветом
    matrix.setPixelColor(i, c);
    matrix.show();
    // ждём
    delay(wait);
  }
}

Часто задаваемые вопросы