Часы на max7219 + DS1307 + DS18B20 + BMP180

Аватара
Ildar

Сообщение #21 Ildar » 22 апреля 2018, 0:26

Ну если у тебя много времени не отнимет то скетч.

! ! !


Аватара
Toropyizhka
Сообщения: 1
Репутация: 0
С нами: 1 месяц 22 дня

Сообщение #22 Toropyizhka » 19 октября 2018, 10:22

Доброго времени суток!
Поигравшись с 7-сегментниками и матрицами собрал несколько вариантов своей погодной станции. Интересным показался и Ваш пример. Не сильно вдаваясь в теорию, на просторах Интернета пересмотрел могучую кучу различных проектов и переработал Ваш скетч на свой лад. Меня устраивает, но пока не всё. И так ...
Светодиодные матрицы MAX7219 8х8 в линейке 8 шт., плата Arduino UNO R3 (в своё время удачно прикупил оригинальную), модуль часов RTC 1307, датчики температуры/влажности DHT22, "пищалка", пара резисторов 10кОм, перемычки и макетка, зарядка от планшета 5V 2A (мне просто удобно питать Ардуинку через USB-кабель от принтера). Ко всему этому голова и руки из нужного места :wink:
Время: отображаются часы, минуты и секунды. Двоеточие постоянно, секунды отсчитываются. При показе времени горит значок часиков. Добавил "пищалку" и теперь каждый час с 07:00 до 22:00 звучит сигнал (5 раз по 0,5 сек.). С "пищалкой" отдельная история. Перепробовал всяко-разно: и компьютерные. и кукольные (Лапочка-дочка любезно "выдрала" пару штук), и из музыкальных открыток. В режиме молчания все они сильно "фонили", резистор на 100Ом фоновый шум снижали. но и снижали громкость. В итоге выпаял "пищалку" из китайского набора для сборки часов, которая оказалась наилучшим вариантом  :dance:
Датчики: подключил пока две штуки DHT22. Уличный висит за балконом, провод телефонный 4-х жильный. Комнатный на макетке (впрочем как и вся конструкция) :roll:
Бегущая строка: их две. Одна выводит показания температуры/влажности на улице и в комнате каждые 5 минут на 42-й секунде. Вместо словесного обозначения вывел значки (солнышко, домик и капелька). Библиотека 5х7 не позволяет сообразить полноценные солнышко и домик, но есть то что есть. Единственное что изменил, коды фигурных скобок { и } заменил на солнышко и капельку соответственно, а символ | заменил на домик. Вторая строка выводит дату каждые 10 минут на 53-й секунде. Символ ещё не придумал :oops:
Кнопки: пока не ставил да и нет такой необходимости. Вся конструкция, как у заправского радиолюбителя, собрана на макетке и может как её предшественницы годами работать в таком виде.
В планах добавить датчик давления, будильники и переписать значки в библиотеке, а лучше всю библиотеку. Шрифт 5х7, конечно, выглядит зрительно приятно, но оставлять незадействованной восьмой (нижний) ряд светодиодов как-то не айс на мой взгляд. Библиотеки хочу оптимизировать непосредственно под готовый продукт, ибо они универсальны и рассчитаны на различные модули и датчики (что есть хорошо), но при этом тоже хорошо "кушают" память контроллера (что ни есть здорово). :mad:
Ну и наконец сам код. Библиотеки все те же...
Спойлер

Код: Выделить всё

// Библиотеки
   #include <SPI.h>
   #include <Wire.h>
   #include <Adafruit_GFX.h>
   #include <Max72xxPanel.h>
   #include <iarduino_DHT.h>
   #include <iarduino_RTC.h>
// Подключение пьезоэлемента: Black - GND, Red - 5
   int soundPin = 5; 
// Подключение матриц и их количество по вертикали и горизонтали: CLK - 13, DIN - 11, CS - 9
   int pinCS = 9;
   int numberOfHorizontalDisplays = 1;
   int numberOfVerticalDisplays = 8;
   Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
// Подключение DHT22 на улице и в комнате: PIN1 - +5V, PIN2 - 2(3), PIN4 - GND
   iarduino_DHT sensor1(2);
   iarduino_DHT sensor2(3);
// Объект time для работы с модулем RTC на базе чипа DS1307, аппаратная шина I2C:
   iarduino_RTC time(RTC_DS1307);
// Символ часов
   const byte data[8]={B00111000,B01010100,B10010010,B11110010,B10000010,B01000100,B00111000,B00000000};

   String clocks;
   String weather;
   String calendar;
//==================================================================================
void setup(void)
// Назначение PIN5 режима работы "Выход":
{  pinMode(soundPin, OUTPUT);
// Инициализация модуля RTC DS1307:
   time.begin();
// Яркость матриц (от 0 до 15) и направление текста (1 - 90 гр., 2 - 180 гр., 3 - 270 гр.):
   matrix.setIntensity(1);
   matrix.setRotation(3);
}
   int updCnt = 0;
   int dots = 0;
   long dotTime = 0;
   long clkTime = 0;
   byte del=0;
//==================================================================================
void loop(void)
// Получение данных календаря, времени и погоды (каждые 10 циклов)  :
{  if(updCnt<=0) {updCnt = 1; getData(); clkTime = millis();}
// Звуковое сопровождение каждого часа c 06:00 до 22:00 в течение 5-и секунд:
   if(((time.Hours==|| time.Hours==|| time.Hours==|| time.Hours==|| time.Hours==10 || time.Hours==11 || time.Hours==12 || time.Hours==13 || time.Hours==14 || time.Hours==15 || time.Hours==16 || time.Hours==17 || time.Hours==18 || time.Hours==19 || time.Hours==20 || time.Hours==21 || time.Hours==22) && time.minutes==0) && time.seconds==0) {
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);
   analogWrite(soundPin, 255); delay(500); analogWrite(soundPin, 0); delay(500);}
// Запуск бегущей строки каждые 5 минут на 42-й секунде и запись показаний температуры/влажности в бегущую строку:
   if((time.minutes==|| time.minutes==|| time.minutes==14 || time.minutes==19 || time.minutes==24 || time.minutes==29 || time.minutes==34 || time.minutes==39 || time.minutes==44 || time.minutes==49 || time.minutes==54 || time.minutes==58) && time.seconds==42)
   {ScrollText(weather); updCnt--; clkTime = millis();}      
// Запуск бегущей строки каждые 10 минут на 53-й секунде и запись календаря в бегущую строку:
   if((time.minutes==|| time.minutes==18 || time.minutes==27 || time.minutes==36 || time.minutes==45 || time.minutes==54) && time.seconds==53)
   {ScrollText(calendar); updCnt--; clkTime = millis();}
   DisplayTime(); if(millis()-dotTime > 500) {dotTime = millis(); dots = !dots;}
}
//==================================================================================
void DisplayTime()
// Чтение показаний датчиков DHT22:
{  switch(sensor1.read()){}
   switch(sensor2.read()){}
// Очистка матрицы   
   matrix.fillScreen(LOW);
// Формирование символа часов и вывод на дисплей:
   for ( int y = 0; y < 8; y++ ) {for ( int x = 0; x < 8; x++ ) {matrix.drawPixel(x, y, data[y] & (1<<x));}}
// Получение и вывод текущего времени:
   clocks = String(time.gettime("His"));
// Положение текущего времени по горизонтали:
   int xh = 18;
   int xi = 35;
   int xs = 52;
// Центровка текущего времени по вертикали:
   int y = (matrix.height() - 8) / 2;
// Отображение двоеточия между часами и минутами, минутами и секундами по центру:
   matrix.drawChar(30, y, (String(":"))[0], HIGH, LOW, 1);
   matrix.drawChar(47, y, (String(":"))[0], HIGH, LOW, 1);
// Формирование показаний текущего времени и вывод на дисплей:
   matrix.drawChar(xh, y, clocks[0], HIGH, LOW, 1);
   matrix.drawChar(xh+6, y, clocks[1], HIGH, LOW, 1);
   matrix.drawChar(xi, y, clocks[2], HIGH, LOW, 1);
   matrix.drawChar(xi+6, y, clocks[3], HIGH, LOW, 1);
   matrix.drawChar(xs, y, clocks[4], HIGH, LOW, 1);
   matrix.drawChar(xs+6, y, clocks[5], HIGH, LOW, 1);
   matrix.write();
}
//==================================================================================
void ScrollText (String text)
  // Скорость бегущей строки:
{  int wait = 50;
// Центровка данных по вертикали:
   int y = (matrix.height() - 8) / 2;
// Расстояние между буквами (в точках) и размер шрифта (прописные буквы, в точках):
   int spacer = 1;
   int width = 5 + spacer;
   int refresh=0;
   for (int i = 0 ; i < width * text.length() + matrix.width() - 1 - spacer; i++)
   {if (refresh==1) i=0; refresh=0;
   matrix.fillScreen(LOW);
   int letter = i / width;
   int x = (matrix.width() - 1) - i % width;
   while (+ width - spacer >= 0 && letter >= 0)
   {if (letter < text.length())
   {matrix.drawChar(x, y, text[letter], HIGH, LOW, 1);}
   letter--; x -= width;}
// Вывод бегущей строки на дисплей:
   matrix.write();
   delay(wait);}
}
//==================================================================================
void getData()
// Формирование показаний календаря в бегущей строке:
{  calendar = ((String)+time.gettime("d.m.Y"));
// Формирование показаний температуры и влажности в бегущей строке:
   weather  = ((String)+"{ "+sensor1.tem+"'C" +"   } "+sensor1.hum+"%"+"   | "+sensor2.tem+"'C" +"   } "+sensor2.hum+"%");
}
Как только разберусь здесь с мультимедиа, закину для обзора фото и видео...


  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Программирование»

Кто сейчас на форуме

Боты: Yandex [Bot]