#include <DS3232RTC.h>
#include <FastLED.h>
#include <microDS18B20.h>
MicroDS18B20 sensors(2);
#include <iarduino_Pressure_BMP.h>
iarduino_Pressure_BMP sensor(0x76); //Барометр
#define LEDS_IN_SEGMENT 4 // Задаём сколько у нас светодиодов в сегменте
#define DOTS_NUM 2 // Задаём сколько у нас разделительных точек
#define NUM_LEDS (LEDS_IN_SEGMENT * 28 + DOTS_NUM) // Вычисляем кол-во светодиодов
#define NUM_COLORS 16 // Количество цветов
#define COLOR_CHANGE 0 // Смена цвета ( 0 - никогда, 1 - раз в минуту, 2 - каждые десять минут, 3 - каждый час, 4 - каждые десять часов)
#define max_bright 200 // максимальная яркость (0 - 255)
#define min_bright 10 // минимальная яркость (0 - 255)
#define bright_constant 1000 // константа усиления от внешнего света (0 - 1023), чем МЕНЬШЕ константа, тем "резче" будет прибавляться яркость
#define coef 0.4 // коэффициент фильтра (0.0 - 1.0), чем больше - тем медленнее меняется яркость
int new_bright, new_bright_f;
#define auto_bright 1 // автоматическая подстройка яркости от уровня внешнего освещения (1 - включить, 0 - выключить)
unsigned long bright_timer, off_timer;
#define COLOR_ORDER GRB // Тип ленты
#define LED_PIN 6 // Пин дата от ленты
#define MIN_PIN 5 // Пин минутной кнопки
#define HUR_PIN 4 // Пин часовой кнопки
#define BRI_PIN A0 // PIN фоторезистора
CRGB leds[NUM_LEDS]; // Define LEDs strip
uint8_t digits[] = {
0b00111111, // Digit 0
0b00100001, // Digit 1
0b01110110, // Digit 2
0b01110011, // Digit 3
0b01101001, // Digit 4
0b01011011, // Digit 5
0b01011111, // Digit 6
0b00110001, // Digit 7
0b01111111, // Digit 8
0b01111011, // Digit 9
0b01111000, // Digit * градус 10
0b00011110, // Digit C 11
0b01111100, // Digit P 12
0b00000000, // Blank 13
0b01000000 // Digit - 14
};
bool Dot = true; //переменная для точек
//bool TempShow = true; //переменная для температуры
//bool PressShow = true; //переменная для давления
int last_digit = 0;
byte set_light;
byte brightness;
unsigned long Timer;
//управление цветом
//int ledColor = 0x00FFFF; // Color used (in hex)
long ledColor = CRGB::Blue; // Color used (in hex)
//массив цветов, для рандом при включенном режиме cylon(); ledColor = ColorTable[random(16)];
long ColorTable[NUM_COLORS] = {
CRGB::Amethyst,
CRGB::Aqua,
CRGB::Blue,
CRGB::Chartreuse,
CRGB::DarkGreen,
CRGB::DarkMagenta,
CRGB::DarkOrange,
CRGB::DeepPink,
CRGB::Fuchsia,
CRGB::Gold,
CRGB::GreenYellow,
CRGB::LightCoral,
CRGB::Tomato,
CRGB::Salmon,
CRGB::Red,
CRGB::Orchid
};
void setup() {
Serial.begin(9600);
FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
pinMode(MIN_PIN, INPUT_PULLUP); // Define Minutes adjust button pin
pinMode(HUR_PIN, INPUT_PULLUP); // Define Hours adjust button pin
pinMode(A3, OUTPUT); //контакт GND барометра
digitalWrite(A3, LOW);//подача земли на барометр
pinMode(9, OUTPUT); //контакт VCC датчика осв
digitalWrite(9, HIGH);//подача питания на датчик осв
}
int GetTime() {
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minute = Now.Minute;
int second = Now.Second;
Serial.print(hour); Serial.print(":"); // Вывод часов
Serial.print(minute); Serial.print(":"); // Вывод минут
Serial.print(second); Serial.println(""); // Вывод секунд
Dot = second % 2;
return (hour * 100 + minute);
};
void BrightnessCheck() {
if (auto_bright) { // если включена адаптивная яркость
if (millis() - bright_timer > 100) { // каждые 100 мс
bright_timer = millis(); // сброить таймер
new_bright = map(analogRead(BRI_PIN), 0, bright_constant, max_bright, min_bright); // считать показания с фоторезистора, перевести диапазон
new_bright = constrain(new_bright, min_bright, max_bright);
new_bright_f = new_bright_f * coef + new_bright * (1 - coef);
LEDS.setBrightness(new_bright_f); // установить новую яркость
}
}
};
void TimeToArray(){
int Now = GetTime(); // Получаем время
Dots(Dot);
for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // Получаем последнюю цифру в времени
int cursor = NUM_LEDS - i * LEDS_IN_SEGMENT * 7;
if (i > 2) {
cursor -= DOTS_NUM;
}
if ( i == 4 & digit == 0)Digit(digits[13], cursor); //Если впереди ноль, то выключаем его
else
Digit(digits[digit], cursor); //Иначе показываем символ
if ( i == COLOR_CHANGE) { //Как часто менять цвет
if (digit != last_digit) {
ledColor = ColorTable[random(NUM_COLORS)]; // Случайный цвет из таблицы
}
last_digit = digit;
}
Now /= 10;
};
};
void Dots (boolean Dot_On) {
leds[56] = (Dot_On) ? ledColor : 0;
leds[57] = (Dot_On) ? ledColor : 0;
}
void TempStreetToArray() {
sensors.requestTemp();
int celsius = sensors.getTemp();
Serial.println (celsius);
Dots(0);
Digit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
int digit = abs (celsius % 10);
Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
digit = celsius / 10;
if (digit == 0)Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //Если впереди ноль, то выключаем его
else
Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - 2));
if (sensors.getTemp() <= -1)Digit(digits[14], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM));//если < или = -1, то показываем -
else
Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //иначе выключаем
};
void TempToArray() {
sensor.begin();
int celsius = sensor.temperature - 1; // датчик за часами, часы на стене, там температура чуть выше
Serial.println (celsius);
Dots(0);
Digit(digits[10], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
int digit = abs (celsius % 10);
Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
digit = celsius / 10;
if (digit == 0)Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM)); //Если впереди ноль, то выключаем его
else
Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));
Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //отключаем
};
void PressToArray() {
sensor.begin();
int davlenie = sensor.pressure;
Serial.println (davlenie);
Dots(0);
int digit = davlenie % 10;
Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 7));
digit = davlenie % 100 / 10;
Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 14));
digit = davlenie / 100;
Digit(digits[digit], (NUM_LEDS - LEDS_IN_SEGMENT * 21 - DOTS_NUM));
Digit(digits[13], (NUM_LEDS - LEDS_IN_SEGMENT * 28 - DOTS_NUM)); //отключаем
};
void TimeAdjust() {
int buttonH = digitalRead(HUR_PIN);
int buttonM = digitalRead(MIN_PIN);
if (buttonH == LOW || buttonM == LOW) {
delay(200);
tmElements_t Now;
RTC.read(Now);
int hour = Now.Hour;
int minutes = Now.Minute;
int second = Now.Second;
if (buttonH == LOW) {
if (Now.Hour == 23) {
Now.Hour = 0;
}
else {
Now.Hour += 1;
};
} else {
if (Now.Minute == 59) {
Now.Minute = 0;
}
else {
Now.Minute += 1;
};
};
RTC.write(Now);
}
}
void Digit (uint8_t digit, uint8_t cursor) {
for (uint8_t mask = 0b01000000; mask > 0; mask = mask >> 1) {
for (uint8_t i = 0; i < LEDS_IN_SEGMENT; i++) {
leds[cursor] = (digit & mask) ? ledColor : 0;
cursor ++;
}
}
}
void loop(){
static byte key =0;
BrightnessCheck();
TimeAdjust();
if ((millis() - Timer <= 5000) && (key ==0))
TimeToArray();FastLED.show();key++;
if ((millis() - Timer <= 7000) && (millis() - Timer > 5000)&& (key ==1))
TempToArray();FastLED.show();key++;
if ((millis() - Timer <= 9000) && (millis() - Timer > 7000)&& (key ==2))
TempStreetToArray();FastLED.show();key++;
if ((millis() - Timer <= 11000) && (millis() - Timer > 9000)&& (key ==3))
PressToArray();FastLED.show();key++;
if ((millis() - Timer <= 13000) && (millis() - Timer > 11000)&& (key ==4))
Timer = millis();key==0;
}