//Скетч использует 23928 байт (77%) памяти устройства. Всего доступно 30720 байт.
//Глобальные переменные используют 1574 байт (76%) динамической памяти, оставляя 474 байт для локальных переменных. Максимум: 2048 байт.
//=>microLED
//Скетч использует 22342 байт (72%) памяти устройства. Всего доступно 30720 байт.
//Глобальные переменные используют 1558 байт (76%) динамической памяти, оставляя 490 байт для локальных переменных. Максимум: 2048 байт.
#define REPLACE_FASTLED
#define COLOR_DEBTH 3
#include <microLED.h>
//#include <DS3232RTC.h>
//#include <TimeLib.h>
//#include <Time.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
//#include <FastLED.h>
#include <iarduino_RTC.h>
//iarduino_RTC time(RTC_DS1302,12,10,11);
iarduino_RTC time(RTC_DS3231);
#include <iarduino_Pressure_BMP.h>
iarduino_Pressure_BMP sensor(0x76);
#define NUM_LEDS 114 // 4*7*4 +2 Кол-во светодиодов
#define COLOR_ORDER GRB // Тип ленты
#define LED_PIN 6 // Пин дата от ленты
//#define DST_PIN 2 // Define DST adjust button pin
#define MIN_PIN 5 // Пин минутной кнопки
#define HUR_PIN 4 // Пин часовой кнопки
// сигнальный провод подключен к 2 пину на Arduino
#define ONE_WIRE_BUS_2 2
// настроим библиотеку 1-Wire для связи с датчиком
OneWire oneWire_out(ONE_WIRE_BUS_2);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire_out);
//CRGB leds[NUM_LEDS]; // Define LEDs strip
LEDdata leds[NUM_LEDS];
microLED strip(leds, NUM_LEDS, LED_PIN);
#define FastLED strip
#define LEDS strip
// 0,0,0,0
// 1,1,1,1
// 1 2 3 4 5 6 7 8 9 10111213141516171819202122232425262728
byte digits[14][28] = {{0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 0
{0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 1
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, // Digit 2
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 3
{1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 4
{1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 5
{1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 6
{0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1}, // Digit 7
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 8
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Digit 9 | 2D Array for numbers on 7 segment
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Digit *0
{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0}, // Digit C
{1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // Digit -
{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
}; // Digit
bool Dot = true; //переменная для точек
//bool DST = false; //DST state
bool TempShow = true; //переменная для температуры
bool PressShow = true; //переменная для давления
//bool DateShow = true;//переменная для даты
int last_digit = 0;
//управление цветом
//int ledColor = 0x00FFFF; // Color used (in hex)
//long ledColor = CRGB::Aqua; // Color used (in hex)
LEDdata ledColor = mHEX(AQUA);
//long ledColor = CRGB::MediumVioletRed;
//Random colors i picked up
//массив цветов, для рандом при включенном режиме cylon(); ledColor = ColorTable[random(16)];
/*
long ColorTable[16] = {
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
};*/
LEDdata ColorTable[17] = {
mHEX(WHITE),
mHEX(AQUA),
mHEX(GRAY),
mHEX(BLACK),
mHEX(RED),
mHEX(MAROON),
mHEX(ORANGE),
mHEX(YELLOW),
mHEX(OLIVE),
mHEX(LIME),
mHEX(GREEN),
mHEX(SILVER),
mHEX(TEAL),
mHEX(BLUE),
mHEX(NAVY),
mHEX(MAGENTA),
mHEX(PURPLE)
};
void setup() {
Serial.begin(9600);
time.begin();
// запуск датчиков
sensor.begin(); //датчики
sensors.begin();//датчик уличной температуры
Wire.begin();
// FastLED.addLeds<WS2812B, LED_PIN, RGB>(leds, NUM_LEDS);
LEDS.setBrightness(75); // Установка яркости
// pinMode(DST_PIN, INPUT_PULLUP); // Define DST adjust button pin
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(8, OUTPUT); //контакт GND датчика осв
pinMode(9, OUTPUT); //контакт VCC датчика осв
// digitalWrite(8, LOW);//подача земли на датчик осв
digitalWrite(9, HIGH);//подача питания на датчик осв
// pinMode(A2, OUTPUT); //контакт GND часов
// pinMode(A1, OUTPUT); //контакт VCC часов
// digitalWrite(A2, LOW);//подача земли на часы
// digitalWrite(A1, HIGH);//подача питания на часы
// pinMode(A6, OUTPUT); //контакт GND уличного термометра, на общей земле сейчас
// pinMode(A7, OUTPUT); //контакт VCC уличного термометра, на дополнительном питании на ножке резистора
// digitalWrite(A6, LOW);//подача земли на уличный термометр
// digitalWrite(A7, HIGH);//подача питания на уличный термометр
}
// Get time in a single number, if hours will be a single digit then time will be displayed 155 instead of 0155
int GetTime() {
time.gettime();
// tmElements_t Now;
// RTC.read(Now);
//time_t Now = RTC.Now();// Getting the current Time and storing it into a DateTime object
int hour = time.Hours;
int minute = time.minutes;
int second = time.seconds;
Serial.print(hour); Serial.print(":"); // Вывод часов
Serial.print(minute); Serial.print(":"); // Вывод минут
Serial.print(second); Serial.println(""); // Вывод секунд
// if (second % 2==0) {Dot = false;}
// else {Dot = true;};
Dot = second % 2;
return (hour * 100 + minute);
};
int GetSecond() { //функция запроса текущей секунды, результат в переменной "second"
time.gettime();
int second = time.seconds;
return (second);
};
// Выбор яркости по данным датчика освещенности
void BrightnessCheck() {
int hour = time.Hours;
const byte sensorPin = A0; // контакт датчика осв
const byte brightnessLow = 5; // низкая яркость
const byte brightnessMid = 10; // низкая яркость
const byte brightnessHigh = 40; // высокая яркость
const byte brightnessDay = 60; // высокая яркость
int sensorValue = analogRead(sensorPin); // Считывание датчика
// int sensorValue = digitalRead(sensorPin); // Считывание датчика
// Serial.print("Датчик: ");Serial.println(sensorValue);
sensorValue = map(sensorValue, 0, 1023, 0, 255);//перевод диапазона измерения
LEDS.setBrightness(sensorValue);
//Serial.println(hour);
//эксперименты освещенности в зависимости от времени
// if (hour=23||hour>=0 && hour<=7) {LEDS.setBrightness(5);}
// else
// if (sensorValue == 0) {LEDS.setBrightness(brightnessHigh);}
// else {LEDS.setBrightness(brightnessLow);
// }
//если в комнате светло, то светит ярче, если мало света, то тусклее, в ночном режиме светит тускло
if (sensorValue >= 221 && sensorValue <= 240) {
LEDS.setBrightness(brightnessHigh);
delay(1000);
}
else if (sensorValue >= 241 && sensorValue <= 252) {
LEDS.setBrightness(brightnessMid);
delay(1000);
}
else if (sensorValue >= 253) {
LEDS.setBrightness(brightnessLow);
delay(1000);
}
else if (sensorValue <= 220) {
LEDS.setBrightness(brightnessDay);
delay(1000);
}
// Serial.println("Датчик: ");
// Serial.println(sensorValue);
};
// Конвертация времени в массив, для отображения на дисплее
void TimeToArray() {
// time.gettime();
int Now = GetTime(); // Get time
int cursor = 114; // last led number
//Serial.print("Time is: ");Serial.println(Now);
/* if (DST){ // if DST is true then add one hour
Now+=100;
// Serial.print("DST is ON, time set to : ");Serial.println(Now);
}; */
//мигание светодиодов для секунд, горит цветом из установок, либо гаснет
if (Dot) {
leds[57] = ledColor;
leds[56] = ledColor;
}
else {
leds[57] = 0x000000;
leds[56] = 0x000000;
};
for (int i = 1; i <= 4; i++) {
int digit = Now % 10; // get last digit in time
if (i == 1) {
// Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor = 86;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
if (digit != last_digit)
{
// cylon();
//ledColor = ColorTable[random(16)];
ledColor = ColorTable[2];
}
last_digit = digit;
}
else if (i == 2) {
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor = 58;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 3) {
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor = 28;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 4) {
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor = 0;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
Now /= 10;
};
};
// Функция вывода температуры с датчика барометра
void TempToArray() {
sensor.begin();
int celsius = sensor.temperature - 1;
Serial.print(celsius);
Serial.print(" | ");
Serial.println(sensor.temperature);
int cursor = 114; // last led number
//отключение секундных точек
leds[57] = 0x000000;
leds[56] = 0x000000;
for (int i = 1; i <= 4; i++) {
int digit = celsius % 10; // get last digit in time
if (i == 3) {
// Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor = 86;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[11][k]);
if (digits[11][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[11][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 4) {
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor = 58;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[10][k]);
if (digits[10][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[10][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 1) {
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor = 28;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 2) {
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor = 0;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
celsius /= 10;
};
};
// Функция вывода температуры с уличного датчика
void TempStreetToArray() {
sensors.begin();
// delay(1000);
sensors.requestTemperatures();
if (sensors.getTempCByIndex(0) < 0) {
int celsius = (sensors.getTempCByIndex(0) * (-1));
Serial.print(celsius);
Serial.print(" | ");
Serial.println(sensors.getTempCByIndex(0));
int cursor = 114; // last led number
//отключение секундных точек
leds[57] = 0x000000;
leds[56] = 0x000000;
for (int i = 1; i <= 4; i++) {
int digit = celsius % 10; // get last digit in time
if (i == 3) {
// Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor = 86;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[10][k]);
if (digits[10][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[10][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 1) {
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor = 58;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 2) {
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor = 28;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 4) {
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor = 0;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[12][k]);
if (digits[12][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[12][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
celsius /= 10;
};
}
else
{
int celsius = (sensors.getTempCByIndex(0));
Serial.println(celsius);
int cursor = 114; // last led number
//отключение секундных точек и точек от минуса, не помню нужны ли они и для чего делал))
leds[0] = 0x000000;
leds[1] = 0x000000;
leds[2] = 0x000000;
leds[3] = 0x000000;
leds[57] = 0x000000;
leds[56] = 0x000000;
for (int i = 1; i <= 4; i++) {
int digit = celsius % 10; // get last digit in time
if (i == 3) {
// Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");
cursor = 86;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[10][k]);
if (digits[10][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[10][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 1) {
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor = 58;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 2) {
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor = 28;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
else if (i == 4) {
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor = 0;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[13][k]);
if (digits[13][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[13][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
celsius /= 10;
};
};
};
// Функция вывода давление с барометра
void PressToArray() {
sensor.begin();
int davlenie = sensor.pressure;
Serial.print(davlenie);
Serial.print(" | ");
Serial.println(sensor.pressure);
int cursor = 85; // last led number
for (int i = 86; i <= 114; i++)
{
leds[i] = 0x000000;
}
//отключение секундных точек
leds[56] = 0x000000;
leds[57] = 0x000000;
for (int i = 1; i <= 3; i++) {
int digit = davlenie % 10; // get last digit in time
if (i == 1) {
// Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");
cursor = 58;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
last_digit = digit;
}
else if (i == 2) {
// Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
cursor = 28;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
last_digit = digit;
}
else if (i == 3) {
// Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor = 0;
for (int k = 0; k <= 27; k++) {
// Serial.print(digits[digit][k]);
if (digits[digit][k] == 1) {
leds[cursor] = ledColor;
}
else if (digits[digit][k] == 0) {
leds[cursor] = 0x000000;
};
cursor ++;
};
// Serial.println();
}
//отключил первый символ и сдвинул регистр вправо
/* else if (i==2){
Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
cursor =0;
for(int k=0; k<=27;k++){
Serial.print(digits[digit][k]);
if (digits[digit][k]== 1){leds[cursor]=ledColor;}
else if (digits[digit][k]==0){leds[cursor]=0x000000;};
cursor ++;
};
Serial.println();
}*/
davlenie /= 10;
};
};
//настройка времени
void TimeAdjust() {
int buttonH = digitalRead(HUR_PIN);
int buttonM = digitalRead(MIN_PIN);
if (buttonH == LOW || buttonM == LOW) {
delay(50);
time.gettime();
// tmElements_t Now;
// RTC.read(Now);
int hour = time.Hours;
int minutes = time.minutes;
int second = time.seconds;
if (buttonH == LOW) {
if (hour == 23) {
hour = 0;
}
else {
hour += 1;
};
} else {
if (minutes == 59) {
minutes = 0;
}
else {
minutes += 1;
};
};
// RTC.write(Now);
time.settime(0, minutes, hour);
}
}
void loop() // Main loop
{
// DSTcheck(); // Check DST
BrightnessCheck();
TimeAdjust(); // Check to se if time is geting modified
//очередность вывода показаний с датчиков и задержка отображения
TimeToArray();
FastLED.show();
delay(1000);
TimeToArray();
FastLED.show();
delay(1000);
TimeToArray();
FastLED.show();
delay(1000);
TimeToArray();
FastLED.show();
delay(1000);
TimeToArray();
FastLED.show();
delay(1000);
TempToArray();
FastLED.show();
delay(2000);
TempStreetToArray();
FastLED.show();
delay(2000);
PressToArray();
FastLED.show();
delay(2000);
/*
// if (GetSecond()>=0 && GetSecond() <= 10 || (GetSecond()>=17 &&GetSecond()<=27) )
// {TimeToArray();} //вызов функции отображения времени 1
if (GetSecond()>=16 && GetSecond()<=20 || (GetSecond()>=41 &&GetSecond()<=45))
{TempStreetToArray();} //вызов функции отображения уличной температуры
else if (GetSecond()>=8 && GetSecond()<=15 || (GetSecond()>=34 &&GetSecond()<=40))
{TempToArray();} //вызов функции отображения температуры
else if (GetSecond()>=21&& GetSecond()<=25 || (GetSecond()>=46 && GetSecond()<=50))
{PressToArray();}//вызов функции отображения давления
else {TimeToArray();} //вызов функции отображения времени
*/
// FastLED.show(); // Display leds array
}