Оформи код соответствующим тэгом
здравствуйте. помогите тоже с минусом . в порту правильно показывает отрицательную температуру а вывод фигню на ws2812
#include <Wire.h> // Базовая библиотека шины I2C (используется для связи модуля часов реального времени)
#include <iarduino_RTC.h> // Библиотека часов реального времени
#include <Adafruit_NeoPixel.h> // Библиотека для управления адресными светодиодами
#include <OneWire.h> // Бибиотека шины 1-Wire для работы температурных датчиков
#include <DallasTemperature.h> // Библиотека температурного сенсора DS18B20
#include <EEPROMex.h> // Библиотека доступа к энергонезависимой памяти
#define PIN 6 // управление адресными светодиодами по этому пину
#define ONE_WIRE_BUS 10 // датчик температуры DS18B20 подключен к этому пину
#define TEMPERATURE_PRECISION 12 // точность измерений 9-бит низкая, 12-бит высокая
iarduino_RTC time(RTC_DS3231); // подключаем RTC модуль на базе чипа DS3231, используется аппаратная шина I2C
Adafruit_NeoPixel strip = Adafruit_NeoPixel(86, PIN, NEO_GRB + NEO_KHZ800); //Подключаем ленту на адресных светодиодах
OneWire oneWire(ONE_WIRE_BUS); // подключаем шину 1-Wire, для передачи данных с сенсоров температуры
DallasTemperature sensors(&oneWire); // подключаем температурные сенсоры
byte Mode = 0; //режимы: по умолчанию 0 - отображение времени с заданными настройкамиbyte NumColor = 0;
//----------- переменные настроек, которые так же хранятся в ПЗУ контроллера и считываются при включении устройсва-------------
byte NowBrigtness = 180; // текущая яркость элементов (начальное значение должно быть кратным 15)
byte ColorMode = 13; // текущий цветовой режим (13 режим - цвет меняется каждый час, полный цикл за 12 частов)
byte TempTime = 8; // длительность отображения температуры
//------------------------------------------------------
int temp10; // перомежуточная переменная температуры (используем множитель 10, что бы использовать тип integer
long int KeyPressed; // время в милисекундах, для сравнения с текущими милисекундами (используется для возврата в основной режим)
unsigned long eeprom_timer; // таймер зашивки в энергонезависимую память параметров настройки часов
byte degree = 25 ; // процент яркости разделительных точек (исходя из геометрии яркость разделительных точек нужно уменьшать
boolean eeprom_flag;
//OneWire oneWire(ONE_WIRE_BUS);
//DallasTemperature sensors(&oneWire);
//void setup(){
//Serial.begin(9600);
//sensors.begin();
//}
//void loop(){
//отправляем запрос на измерение температуры
//sensors.requestTemperatures();
//покажем температуру в мониторе Serial порта
// Serial.print("Temp C: ");
//Serial.println(sensors.getTempCByIndex(0));
//}
void setup() {
Serial.begin(9600); // подключаем сериал порт для вывода отладочной информации (отключено в целях экономии памяти)
sensors.begin();
sensors.requestTemperatures();
Serial.print("Temp C: ");
Serial.println(sensors.getTempCByIndex(0));
pinMode(2, INPUT_PULLUP); // подключаем кнопку 1 к пину и подтягиваем её к питанию
pinMode(3, INPUT_PULLUP); // подключаем кнопку 2 к пину и подтягиваем её к питанию
pinMode(4, INPUT_PULLUP); // подключаем кнопку 3 к пину и подтягиваем её к питанию
time.begin(); // запускаем часы реального времени
sensors.begin(); // запускаем сенсоры температуры
strip.begin(); // запускаем адресные светодиоды
strip.setBrightness(NowBrigtness); // устанавливаем яркость светодиодной ленты
strip.show();
//KeyPressed = millis();
// освещаем ленту (по умолчанию нули-ничего не светится)
// Отладочный способ установки времени через скетч
//time.settime(0,02,18,31,10,19,4); // _ сек, _ мин, _ час, _ день месяца, _ месяц, _ год, день недели 0-вск 6-суб
// updateEEPROM; // при первой прошивке раскоментировать для записи настроек в ПЗУ контроллера
readEEPROM(); // чтениt настроек из ПЗУ контроллера
}
void loop() {
BrightnessCheck(); //фоторезистор функция настройки яркости в соответствии с освещенностью
//if(millis()%1000==0){ // если прошла 1 секунда
//Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
//delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
// }
if ((millis() - KeyPressed) > 10000) Mode = 0; //если спустя 10 секунды кнопок не нажималось часы переходят в нормальный режим
int key = get_key(); // опрашиваем нажатие кнопки
if (key) {
delay(330); // после нажатия на любую кнопку делаем небольшую паузу, что бы успеть отпустить кнопку
KeyPressed = millis(); // сбрасываем таймер последнего нажатия кнопки (для того что бы спустя 3 сек часы перешли в режим 0)
eeprom_flag = true;
}
if (key == 2) { // если нажата кнопка 2, то гоняем меню по кругу (выбора режима цвета, яркость, установка времени и даты
if (Mode == 9) Mode = 0; else Mode++;
}
switch ( Mode ) {
case 0: { //---------------------- Нормальный режим "0": отображение времени и температуры ----------------------
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
if (( time.seconds) == ( 30 - TempTime)) { // раз в минуту проверяем наличие датчика
sensors.requestTemperatures(); // Отправляем запрос на значение температуры
temp10 = 10 * sensors.getTempCByIndex(0);
}
if ((( time.seconds) <= 60 - TempTime) or (temp10<-500)) { // отображаем время в том числе если датчик не подключен
digitout (0, time.Hours / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.Hours % 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (44, time.minutes / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.minutes % 10 ); // отрисовываем цифры (выставляем черные точки)
if (( time.seconds) % 2 == 0) { // по четным секундам разделительные точки не светятся (можно сделать затухание)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
}
}
//ТЕМПЕРАТУРА
if ((key == 1) || (key == 3) || ((( time.seconds) > 60 - TempTime) and (temp10>-500))) { // если нажали кнопку "1" или пришло время отображать температуру и датчик подключен
sensors.requestTemperatures(); // Отправляем запрос на значение температуры
temp10 = 10 * sensors.getTempCByIndex(0); //подстройка температуры 10
Serial.print("Temp C: ");
if(sensors.getTempCByIndex(0)<0)
// Serial.println(sensors.getTempCByIndex(0)*(-1));
//else
Serial.println(sensors.getTempCByIndex(0));
for (int i = 0; i < 86; i++) {strip.setPixelColor(i, WheelRGB((40 - temp10 / 10) * 255 / 60 & 255)); // цвет зависит от температуры датчика
// if (i == 42 or i == 43) strip.setPixelColor(i, WheelRBG((40 - temp10 / 10) * 255 / 60 & 255)); // для разделительных точек применяем модифицированное цветовое колесо
}
if (temp10 < -500) { // если датчик отключен, то выводим "---с"
digitout (0, 13 ); // отрисовываем "-" (выставляем черные точки)
digitout (21, 13 ); // отрисовываем "-" (выставляем черные точки)
digitout (44, 13 ); // отрисовываем "-" (выставляем черные точки)
strip.setPixelColor(18, (0, 0, 0)); // знак "_" не рисуем
strip.setPixelColor(19, (0, 0, 0));
strip.setPixelColor(20, (0, 0, 0));
}
else
{
digitout (21, temp10 / 100 ); // отрисовываем цифры (выставляем черные точки) десятки градуса
digitout (44, ((temp10) % 100) / 10 ); // отрисовываем цифры (выставляем черные точки) единицы градуса
// digitout (44, (temp10) % 10 ); // отрисовываем цифры (выставляем черные точки) десятые доли градуса
}
strip.setPixelColor(42, 0, 0, 0); // затеняем верхнюю точку
strip.setPixelColor(43, 0, 0, 0); // затеняем нижнюю точку
digitout (65, 11 ); //симвод градуса Цельсия
digitout (0, 13 ); //симвод "-" в первом семисегментном индикаторе --------------------
if (temp10 >=0) { // если температура выше нуля, то знак "-" не отображаем
strip.setPixelColor(18, (0, 0, 0));
strip.setPixelColor(19, (0, 0, 0)); // знак "-" в первом семисегментном индикаторе убираем при плюсовой температуре
strip.setPixelColor(20, (0, 0, 0));
}
// if (key == 3) {
// - зарезервированно либо для вывода даты, либо для вывода температуры с второго датчика
// }
}
strip.show(); //освещаем режим 0
break;
} //---------------------- конец отработки условия нормального режима "0" ------------------
case 1: { // Если режим "1" - установка цветовой схемы
if (key == 1) { //Установка цвета
if (ColorMode == 0) ColorMode = 26; else ColorMode--;
}
if (key == 3) { //Гоняем цвет по кругу
if (ColorMode == 26) ColorMode = 0; else ColorMode++;
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// - отображаем на экране номер цветового режима
digitout (0, 12 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 13); // отрисовываем цифры (выставляем черные точки)
digitout (44, ColorMode / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, ColorMode % 10); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
case 2: { // Если режим "2" - установка яркости
if (key == 1) {
NowBrigtness = NowBrigtness - 15; //меняем яркость от 0 до 255 с шагом 5
}
if (key == 3) {
NowBrigtness = NowBrigtness + 15;
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
if (NowBrigtness == 0)strip.setBrightness(1);
else strip.setBrightness(NowBrigtness); ; // устанавливаем яркость светодиодной ленты
// - отображаем на экране величину яркости
digitout (0, 14 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 13); // отрисовываем цифры (выставляем черные точки)
digitout (44, (NowBrigtness / 15) / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, (NowBrigtness / 15) % 10); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
case 3: { // Если режим "3" - Установка времени отображения температуры
if (key == 1) { // Устанавливаем время показа температуры на -1 сек
if (TempTime == 0) TempTime = 60; else TempTime = TempTime - 1 ;
}
if (key == 3) { //Устанавливаем время показа температуры на +1 сек
if (TempTime == 60) TempTime = 0; else TempTime = TempTime + 1;
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
digitout (0, 17); // отрисовываем цифры (выставляем черные точки)
digitout (21, 17); // отрисовываем цифры (выставляем черные точки)
digitout (44, TempTime / 10); // отрисовываем цифры (выставляем черные точки)
digitout (65, TempTime % 10); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
case 4: { // Если режим "4" - установка времени (час)
if (key == 1) { //уменьшаем часы
if ((time.Hours) == 0) time.settime(-1, -1, 23); else time.settime(-1, -1, (time.Hours) - 1); //установит времени (час)
}
if (key == 3) { //увеличиваем часы
if ((time.Hours) == 23) time.settime(-1, -1, 0); else time.settime(-1, -1, (time.Hours) + 1); //установит времени (час)
}
// задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 0; i < 14; i++) { // задаём цвет часов серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500)) {
digitout (0, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (0, time.Hours / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.Hours % 10 ); // отрисовываем цифры (выставляем черные точки)
}
digitout (44, time.minutes / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.minutes % 10 ); // отрисовываем цифры (выставляем черные точки)
// if (( time.seconds) % 2 == 0) { // по четным секундам разделительные точки не светятся (можно сделать затухание)
// strip.setPixelColor(14, 0, 0, 0); strip.setPixelColor(15, 0, 0, 0);
// }
strip.show(); //освещаем режим
break;
}
case 5: { // Если режим "5" - установка времени (мин). При изменении минут секунды обнуляются
if (key == 1) { //уменьшаем минуты
if ((time.minutes) == 0) time.settime(0, 59); else time.settime(0, (time.minutes) - 1); //установит времени (мин)
}
if (key == 3) { //увеличиваем минуты
if ((time.minutes) == 59) time.settime(0, 0); else time.settime(0, (time.minutes) + 1); //установит времени (мин)
}
// задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 16; i < 30; i++) { // задаём цвет минут серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500)) {
digitout (44, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (44, time.minutes / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.minutes % 10 ); // отрисовываем цифры (выставляем черные точки)
}
digitout (0, time.Hours / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.Hours % 10 ); // отрисовываем цифры (выставляем черные точки)
// if (( time.seconds) % 2 == 0) { // по четным секундам разделительные точки не светятся (можно сделать затухание)
// strip.setPixelColor(14, 0, 0, 0); strip.setPixelColor(15, 0, 0, 0);
// }
strip.show(); //освещаем режим
break;
}
case 6: { // Если режим "6" - Установка дня
if (key == 1) { //уменьшаем времени (мин)
if ((time.day) == 1) time.settime(-1, -1, -1, 31); else time.settime(-1, -1, -1, (time.day) - 1); //установит дата)
}
if (key == 3) { //увеличиваем часы
if ((time.day) == 31) time.settime(-1, -1, -1, 1); else time.settime(-1, -1, -1, (time.day) + 1); //установит дата
}
// задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 0; i < 14; i++) { // задаём цвет часов серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500)) {
digitout (0, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (0, time.day / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.day % 10 ); // отрисовываем цифры (выставляем черные точки)
}
digitout (44, time.month / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.month % 10 ); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); // Оставляем светиться нижнюю точку - разделитель дня и месяца
strip.show(); //освещаем режим
break;
}
case 7: { // Если режим "7" - Установка месяца
if (key == 1) { //уменьшаем времени (мин)
if ((time.month) == 1) time.settime(-1, -1, -1, -1, 12); else time.settime(-1, -1, -1, -1, (time.month) - 1); //установит дата)
}
if (key == 3) { //увеличиваем часы
if ((time.month) == 12) time.settime(-1, -1, -1, -1, 1); else time.settime(-1, -1, -1, -1, (time.month) + 1); //установит дата)
}
// задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 16; i < 30; i++) { // задаём цвет минут серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500)) {
digitout (44, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (44, time.month / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.month % 10 ); // отрисовываем цифры (выставляем черные точки)
}
digitout (0, time.day / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.day % 10 ); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); // Оставляем светиться нижнюю точку - разделитель дня и месяца
strip.show(); //освещаем режим
break;
}
case 8: { // Если режим "8"-установка года
if (key == 1) { //уменьшаем год
time.settime(-1, -1, -1, -1, -1, (time.year) - 1); //установит дата)
}
if (key == 3) { //увеличиваем год
time.settime(-1, -1, -1, -1, -1, (time.year) + 1); //установит дата)
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 0; i < 30; i++) { // задаём цвет минут серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500))
{
digitout (0, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 15 );
digitout (44, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (0, 2); // отрисовываем цифры (выставляем черные точки)
digitout (21, 0); // отрисовываем цифры (выставляем черные точки)
digitout (44, (time.year) / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, (time.year) % 10); // отрисовываем цифры (выставляем черные точки)
}
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
case 9: { // Если режим "9" - Установка дня недели
if (key == 1) { //уменьшаем времени (мин)
if ((time.weekday) == 0) time.settime(-1, -1, -1, -1, -1, 1 - 1, 6); else time.settime(-1, -1, -1, -1, -1, -1, (time.weekday) - 1); //установит дата)
}
if (key == 3) { //увеличиваем часы
if ((time.weekday) == 6) time.settime(-1, -1, -1, -1, -1, 1 - 1, 0); else time.settime(-1, -1, -1, -1, -1, -1, (time.weekday) + 1); //установит дата)
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 0; i < 86; i++) { // задаём цвет минут серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500))
{
digitout (65, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (65, (time.weekday)); // отрисовываем цифры (выставляем черные точки)
}
digitout (0, 16 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 15 );
digitout (44, 15); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
} // Конец обработки всех режимов
eepromTick(); // проверка не пора ли сохранить настройки
} // Конец основного цикла
/* Проверьте датчик освещенности (фоторезистр)и установите яркость соответственно */
void BrightnessCheck(){ // функция настройки яркости в соответствии с освещенностью
const byte sensorPin = A0; // пин датчика освещенности
const byte brightnessLow = 5; // низкий уровень яркости
const byte brightnessHigh = 250; // высокий уровень яркости
int sensorValue = digitalRead(sensorPin); // запрос с датчика
if (sensorValue == 0) {strip.setBrightness(brightnessLow);}
else {strip.setBrightness(brightnessHigh);}
};
void setcolor (byte ColorMode) { // процедура, которая задаёт цвет всех элементов в зависимости от указанного цветового режима
uint16_t i;
if (ColorMode < 24) { //12 цветов по цветовому колесу
for (i = 0; i < 86; i++) {
strip.setPixelColor(i, WheelRGB((ColorMode * 255 / 24) & 255));
if (i == 42 or i == 43) strip.setPixelColor(i, WheelRBG((ColorMode * 256 / 24) & 255)); // для разделительных точек применяем модифицированное цветовое колесо
}
}
if (ColorMode == 24) { // цвет -белый
for (i = 0; i < 86; i++) {
strip.setPixelColor(i, 255, 255, 255);
}
}
if (ColorMode == 25) { // цветовой режим -радуга с периодом 12 часов
time.gettime();
for (i = 0; i < 86; i++) {
strip.setPixelColor(i, WheelRGB((time.hours) * 255 / 12 & 255)); // в этом режиме часы меняются от 1-12
if (i == 42 or i == 43) strip.setPixelColor(i, WheelRBG((time.hours) * 255 / 12 & 255)); // для разделительных точек применяем модифицированное цветовое колесо
}
}
if (ColorMode == 26) { // цветовой режим -радуга с периодом 24 часа
time.gettime();
for (i = 0; i < 86; i++) {
strip.setPixelColor(i, WheelRGB((time.hours) * 255 / 24 & 255)); // в этом режиме часы меняются от 1-12
if (i == 42 or i == 43) strip.setPixelColor(i, WheelRBG((time.hours) * 255 / 24 & 255)); // для разделительных точек применяем модифицированное цветовое колесо
}
}
} //- конец процедуры установки цвета
int get_key() //Вывод нажатой клавиши
{
if (digitalRead(2) == 0) return 1;
if (digitalRead(3) == 0) return 2;
if (digitalRead(4) == 0) return 3;
return 0;
}
void tempout() { //процедура отображения температуры
}
#include <Wire.h> // Базовая библиотека шины I2C (используется для связи модуля часов реального времени)
#include <iarduino_RTC.h> // Библиотека часов реального времени
#include <Adafruit_NeoPixel.h> // Библиотека для управления адресными светодиодами
#include <OneWire.h> // Бибиотека шины 1-Wire для работы температурных датчиков
#include <DallasTemperature.h> // Библиотека температурного сенсора DS18B20
#include <EEPROMex.h> // Библиотека доступа к энергонезависимой памяти
#define PIN 6 // управление адресными светодиодами по этому пину
#define ONE_WIRE_BUS 10 // датчик температуры DS18B20 подключен к этому пину
#define TEMPERATURE_PRECISION 12 // точность измерений 9-бит низкая, 12-бит высокая
iarduino_RTC time(RTC_DS3231); // подключаем RTC модуль на базе чипа DS3231, используется аппаратная шина I2C
Adafruit_NeoPixel strip = Adafruit_NeoPixel(86, PIN, NEO_GRB + NEO_KHZ800); //Подключаем ленту на адресных светодиодах
OneWire oneWire(ONE_WIRE_BUS); // подключаем шину 1-Wire, для передачи данных с сенсоров температуры
DallasTemperature sensors(&oneWire); // подключаем температурные сенсоры
byte Mode = 0; //режимы: по умолчанию 0 - отображение времени с заданными настройкамиbyte NumColor = 0;
//----------- переменные настроек, которые так же хранятся в ПЗУ контроллера и считываются при включении устройсва-------------
byte NowBrigtness = 180; // текущая яркость элементов (начальное значение должно быть кратным 15)
byte ColorMode = 13; // текущий цветовой режим (13 режим - цвет меняется каждый час, полный цикл за 12 частов)
byte TempTime = 8; // длительность отображения температуры
//------------------------------------------------------
int temp10; // перомежуточная переменная температуры (используем множитель 10, что бы использовать тип integer
long int KeyPressed; // время в милисекундах, для сравнения с текущими милисекундами (используется для возврата в основной режим)
unsigned long eeprom_timer; // таймер зашивки в энергонезависимую память параметров настройки часов
byte degree = 25 ; // процент яркости разделительных точек (исходя из геометрии яркость разделительных точек нужно уменьшать
boolean eeprom_flag;
//OneWire oneWire(ONE_WIRE_BUS);
//DallasTemperature sensors(&oneWire);
//void setup(){
//Serial.begin(9600);
//sensors.begin();
//}
//void loop(){
//отправляем запрос на измерение температуры
//sensors.requestTemperatures();
//покажем температуру в мониторе Serial порта
// Serial.print("Temp C: ");
//Serial.println(sensors.getTempCByIndex(0));
//}
void setup() {
Serial.begin(9600); // подключаем сериал порт для вывода отладочной информации (отключено в целях экономии памяти)
sensors.begin();
sensors.requestTemperatures();
Serial.print("Temp C: ");
Serial.println(sensors.getTempCByIndex(0));
pinMode(2, INPUT_PULLUP); // подключаем кнопку 1 к пину и подтягиваем её к питанию
pinMode(3, INPUT_PULLUP); // подключаем кнопку 2 к пину и подтягиваем её к питанию
pinMode(4, INPUT_PULLUP); // подключаем кнопку 3 к пину и подтягиваем её к питанию
time.begin(); // запускаем часы реального времени
sensors.begin(); // запускаем сенсоры температуры
strip.begin(); // запускаем адресные светодиоды
strip.setBrightness(NowBrigtness); // устанавливаем яркость светодиодной ленты
strip.show();
//KeyPressed = millis();
// освещаем ленту (по умолчанию нули-ничего не светится)
// Отладочный способ установки времени через скетч
//time.settime(0,02,18,31,10,19,4); // _ сек, _ мин, _ час, _ день месяца, _ месяц, _ год, день недели 0-вск 6-суб
// updateEEPROM; // при первой прошивке раскоментировать для записи настроек в ПЗУ контроллера
readEEPROM(); // чтениt настроек из ПЗУ контроллера
}
void loop() {
BrightnessCheck(); //фоторезистор функция настройки яркости в соответствии с освещенностью
//if(millis()%1000==0){ // если прошла 1 секунда
//Serial.println(time.gettime("d-m-Y, H:i:s, D")); // выводим время
//delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
// }
if ((millis() - KeyPressed) > 10000) Mode = 0; //если спустя 10 секунды кнопок не нажималось часы переходят в нормальный режим
int key = get_key(); // опрашиваем нажатие кнопки
if (key) {
delay(330); // после нажатия на любую кнопку делаем небольшую паузу, что бы успеть отпустить кнопку
KeyPressed = millis(); // сбрасываем таймер последнего нажатия кнопки (для того что бы спустя 3 сек часы перешли в режим 0)
eeprom_flag = true;
}
if (key == 2) { // если нажата кнопка 2, то гоняем меню по кругу (выбора режима цвета, яркость, установка времени и даты
if (Mode == 9) Mode = 0; else Mode++;
}
switch ( Mode ) {
case 0: { //---------------------- Нормальный режим "0": отображение времени и температуры ----------------------
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
if (( time.seconds) == ( 30 - TempTime)) { // раз в минуту проверяем наличие датчика
sensors.requestTemperatures(); // Отправляем запрос на значение температуры
temp10 = 10 * sensors.getTempCByIndex(0);
}
if ((( time.seconds) <= 60 - TempTime) or (temp10<-500)) { // отображаем время в том числе если датчик не подключен
digitout (0, time.Hours / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.Hours % 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (44, time.minutes / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.minutes % 10 ); // отрисовываем цифры (выставляем черные точки)
if (( time.seconds) % 2 == 0) { // по четным секундам разделительные точки не светятся (можно сделать затухание)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
}
}
//ТЕМПЕРАТУРА
if ((key == 1) || (key == 3) || ((( time.seconds) > 60 - TempTime) and (temp10>-500))) { // если нажали кнопку "1" или пришло время отображать температуру и датчик подключен
sensors.requestTemperatures(); // Отправляем запрос на значение температуры
temp10 = 10 * sensors.getTempCByIndex(0); //подстройка температуры 10
Serial.print("Temp C: ");
if(sensors.getTempCByIndex(0)<0)
// Serial.println(sensors.getTempCByIndex(0)*(-1));
//else
Serial.println(sensors.getTempCByIndex(0));
for (int i = 0; i < 86; i++) {strip.setPixelColor(i, WheelRGB((40 - temp10 / 10) * 255 / 60 & 255)); // цвет зависит от температуры датчика
// if (i == 42 or i == 43) strip.setPixelColor(i, WheelRBG((40 - temp10 / 10) * 255 / 60 & 255)); // для разделительных точек применяем модифицированное цветовое колесо
}
if (temp10 < -500) { // если датчик отключен, то выводим "---с"
digitout (0, 13 ); // отрисовываем "-" (выставляем черные точки)
digitout (21, 13 ); // отрисовываем "-" (выставляем черные точки)
digitout (44, 13 ); // отрисовываем "-" (выставляем черные точки)
strip.setPixelColor(18, (0, 0, 0)); // знак "_" не рисуем
strip.setPixelColor(19, (0, 0, 0));
strip.setPixelColor(20, (0, 0, 0));
}
else
{
digitout (21, temp10 / 100 ); // отрисовываем цифры (выставляем черные точки) десятки градуса
digitout (44, ((temp10) % 100) / 10 ); // отрисовываем цифры (выставляем черные точки) единицы градуса
// digitout (44, (temp10) % 10 ); // отрисовываем цифры (выставляем черные точки) десятые доли градуса
}
strip.setPixelColor(42, 0, 0, 0); // затеняем верхнюю точку
strip.setPixelColor(43, 0, 0, 0); // затеняем нижнюю точку
digitout (65, 11 ); //симвод градуса Цельсия
digitout (0, 13 ); //симвод "-" в первом семисегментном индикаторе --------------------
if (temp10 >=0) { // если температура выше нуля, то знак "-" не отображаем
strip.setPixelColor(18, (0, 0, 0));
strip.setPixelColor(19, (0, 0, 0)); // знак "-" в первом семисегментном индикаторе убираем при плюсовой температуре
strip.setPixelColor(20, (0, 0, 0));
}
// if (key == 3) {
// - зарезервированно либо для вывода даты, либо для вывода температуры с второго датчика
// }
}
strip.show(); //освещаем режим 0
break;
} //---------------------- конец отработки условия нормального режима "0" ------------------
case 1: { // Если режим "1" - установка цветовой схемы
if (key == 1) { //Установка цвета
if (ColorMode == 0) ColorMode = 26; else ColorMode--;
}
if (key == 3) { //Гоняем цвет по кругу
if (ColorMode == 26) ColorMode = 0; else ColorMode++;
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// - отображаем на экране номер цветового режима
digitout (0, 12 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 13); // отрисовываем цифры (выставляем черные точки)
digitout (44, ColorMode / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, ColorMode % 10); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
case 2: { // Если режим "2" - установка яркости
if (key == 1) {
NowBrigtness = NowBrigtness - 15; //меняем яркость от 0 до 255 с шагом 5
}
if (key == 3) {
NowBrigtness = NowBrigtness + 15;
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
if (NowBrigtness == 0)strip.setBrightness(1);
else strip.setBrightness(NowBrigtness); ; // устанавливаем яркость светодиодной ленты
// - отображаем на экране величину яркости
digitout (0, 14 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 13); // отрисовываем цифры (выставляем черные точки)
digitout (44, (NowBrigtness / 15) / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, (NowBrigtness / 15) % 10); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
case 3: { // Если режим "3" - Установка времени отображения температуры
if (key == 1) { // Устанавливаем время показа температуры на -1 сек
if (TempTime == 0) TempTime = 60; else TempTime = TempTime - 1 ;
}
if (key == 3) { //Устанавливаем время показа температуры на +1 сек
if (TempTime == 60) TempTime = 0; else TempTime = TempTime + 1;
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
digitout (0, 17); // отрисовываем цифры (выставляем черные точки)
digitout (21, 17); // отрисовываем цифры (выставляем черные точки)
digitout (44, TempTime / 10); // отрисовываем цифры (выставляем черные точки)
digitout (65, TempTime % 10); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
case 4: { // Если режим "4" - установка времени (час)
if (key == 1) { //уменьшаем часы
if ((time.Hours) == 0) time.settime(-1, -1, 23); else time.settime(-1, -1, (time.Hours) - 1); //установит времени (час)
}
if (key == 3) { //увеличиваем часы
if ((time.Hours) == 23) time.settime(-1, -1, 0); else time.settime(-1, -1, (time.Hours) + 1); //установит времени (час)
}
// задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 0; i < 14; i++) { // задаём цвет часов серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500)) {
digitout (0, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (0, time.Hours / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.Hours % 10 ); // отрисовываем цифры (выставляем черные точки)
}
digitout (44, time.minutes / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.minutes % 10 ); // отрисовываем цифры (выставляем черные точки)
// if (( time.seconds) % 2 == 0) { // по четным секундам разделительные точки не светятся (можно сделать затухание)
// strip.setPixelColor(14, 0, 0, 0); strip.setPixelColor(15, 0, 0, 0);
// }
strip.show(); //освещаем режим
break;
}
case 5: { // Если режим "5" - установка времени (мин). При изменении минут секунды обнуляются
if (key == 1) { //уменьшаем минуты
if ((time.minutes) == 0) time.settime(0, 59); else time.settime(0, (time.minutes) - 1); //установит времени (мин)
}
if (key == 3) { //увеличиваем минуты
if ((time.minutes) == 59) time.settime(0, 0); else time.settime(0, (time.minutes) + 1); //установит времени (мин)
}
// задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 16; i < 30; i++) { // задаём цвет минут серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500)) {
digitout (44, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (44, time.minutes / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.minutes % 10 ); // отрисовываем цифры (выставляем черные точки)
}
digitout (0, time.Hours / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.Hours % 10 ); // отрисовываем цифры (выставляем черные точки)
// if (( time.seconds) % 2 == 0) { // по четным секундам разделительные точки не светятся (можно сделать затухание)
// strip.setPixelColor(14, 0, 0, 0); strip.setPixelColor(15, 0, 0, 0);
// }
strip.show(); //освещаем режим
break;
}
case 6: { // Если режим "6" - Установка дня
if (key == 1) { //уменьшаем времени (мин)
if ((time.day) == 1) time.settime(-1, -1, -1, 31); else time.settime(-1, -1, -1, (time.day) - 1); //установит дата)
}
if (key == 3) { //увеличиваем часы
if ((time.day) == 31) time.settime(-1, -1, -1, 1); else time.settime(-1, -1, -1, (time.day) + 1); //установит дата
}
// задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 0; i < 14; i++) { // задаём цвет часов серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500)) {
digitout (0, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (0, time.day / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.day % 10 ); // отрисовываем цифры (выставляем черные точки)
}
digitout (44, time.month / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.month % 10 ); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); // Оставляем светиться нижнюю точку - разделитель дня и месяца
strip.show(); //освещаем режим
break;
}
case 7: { // Если режим "7" - Установка месяца
if (key == 1) { //уменьшаем времени (мин)
if ((time.month) == 1) time.settime(-1, -1, -1, -1, 12); else time.settime(-1, -1, -1, -1, (time.month) - 1); //установит дата)
}
if (key == 3) { //увеличиваем часы
if ((time.month) == 12) time.settime(-1, -1, -1, -1, 1); else time.settime(-1, -1, -1, -1, (time.month) + 1); //установит дата)
}
// задаём цвет всех элементов в зависимости от цветового режима
time.gettime(); // запрашиваем у модуля реального времени теущее время
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 16; i < 30; i++) { // задаём цвет минут серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500)) {
digitout (44, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (44, time.month / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, time.month % 10 ); // отрисовываем цифры (выставляем черные точки)
}
digitout (0, time.day / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, time.day % 10 ); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); // Оставляем светиться нижнюю точку - разделитель дня и месяца
strip.show(); //освещаем режим
break;
}
case 8: { // Если режим "8"-установка года
if (key == 1) { //уменьшаем год
time.settime(-1, -1, -1, -1, -1, (time.year) - 1); //установит дата)
}
if (key == 3) { //увеличиваем год
time.settime(-1, -1, -1, -1, -1, (time.year) + 1); //установит дата)
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 0; i < 30; i++) { // задаём цвет минут серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500))
{
digitout (0, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 15 );
digitout (44, 15 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (0, 2); // отрисовываем цифры (выставляем черные точки)
digitout (21, 0); // отрисовываем цифры (выставляем черные точки)
digitout (44, (time.year) / 10 ); // отрисовываем цифры (выставляем черные точки)
digitout (65, (time.year) % 10); // отрисовываем цифры (выставляем черные точки)
}
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
case 9: { // Если режим "9" - Установка дня недели
if (key == 1) { //уменьшаем времени (мин)
if ((time.weekday) == 0) time.settime(-1, -1, -1, -1, -1, 1 - 1, 6); else time.settime(-1, -1, -1, -1, -1, -1, (time.weekday) - 1); //установит дата)
}
if (key == 3) { //увеличиваем часы
if ((time.weekday) == 6) time.settime(-1, -1, -1, -1, -1, 1 - 1, 0); else time.settime(-1, -1, -1, -1, -1, -1, (time.weekday) + 1); //установит дата)
}
setcolor (ColorMode); // задаём цвет всех элементов в зависимости от цветового режима
// for (int i = 0; i < 86; i++) { // задаём цвет минут серым
// strip.setPixelColor(i, 127, 127, 127);
// }
if (( millis() % 1000 > 500))
{
digitout (65, 15 ); // отрисовываем цифры (выставляем черные точки)
} else
{
digitout (65, (time.weekday)); // отрисовываем цифры (выставляем черные точки)
}
digitout (0, 16 ); // отрисовываем цифры (выставляем черные точки)
digitout (21, 15 );
digitout (44, 15); // отрисовываем цифры (выставляем черные точки)
strip.setPixelColor(42, 0, 0, 0); strip.setPixelColor(43, 0, 0, 0);
strip.show(); //освещаем режим
break;
}
} // Конец обработки всех режимов
eepromTick(); // проверка не пора ли сохранить настройки
} // Конец основного цикла
/* Проверьте датчик освещенности (фоторезистр)и установите яркость соответственно */
void BrightnessCheck(){ // функция настройки яркости в соответствии с освещенностью
const byte sensorPin = A0; // пин датчика освещенности
const byte brightnessLow = 5; // низкий уровень яркости
const byte brightnessHigh = 250; // высокий уровень яркости
int sensorValue = digitalRead(sensorPin); // запрос с датчика
if (sensorValue == 0) {strip.setBrightness(brightnessLow);}
else {strip.setBrightness(brightnessHigh);}
};
void setcolor (byte ColorMode) { // процедура, которая задаёт цвет всех элементов в зависимости от указанного цветового режима
uint16_t i;
if (ColorMode < 24) { //12 цветов по цветовому колесу
for (i = 0; i < 86; i++) {
strip.setPixelColor(i, WheelRGB((ColorMode * 255 / 24) & 255));
if (i == 42 or i == 43) strip.setPixelColor(i, WheelRBG((ColorMode * 256 / 24) & 255)); // для разделительных точек применяем модифицированное цветовое колесо
}
}
if (ColorMode == 24) { // цвет -белый
for (i = 0; i < 86; i++) {
strip.setPixelColor(i, 255, 255, 255);
}
}
if (ColorMode == 25) { // цветовой режим -радуга с периодом 12 часов
time.gettime();
for (i = 0; i < 86; i++) {
strip.setPixelColor(i, WheelRGB((time.hours) * 255 / 12 & 255)); // в этом режиме часы меняются от 1-12
if (i == 42 or i == 43) strip.setPixelColor(i, WheelRBG((time.hours) * 255 / 12 & 255)); // для разделительных точек применяем модифицированное цветовое колесо
}
}
if (ColorMode == 26) { // цветовой режим -радуга с периодом 24 часа
time.gettime();
for (i = 0; i < 86; i++) {
strip.setPixelColor(i, WheelRGB((time.hours) * 255 / 24 & 255)); // в этом режиме часы меняются от 1-12
if (i == 42 or i == 43) strip.setPixelColor(i, WheelRBG((time.hours) * 255 / 24 & 255)); // для разделительных точек применяем модифицированное цветовое колесо
}
}
} //- конец процедуры установки цвета
int get_key() //Вывод нажатой клавиши
{
if (digitalRead(2) == 0) return 1;
if (digitalRead(3) == 0) return 2;
if (digitalRead(4) == 0) return 3;
return 0;
}
void tempout() { //процедура отображения температуры
}
Изменено: