Простые часы на max7219

Аватара
Автор темы
Дим M
Администратор
Администратор
Сообщения: 1131
Репутация: 70
С нами: 5 лет 2 месяца

Простые часы на max7219

Сообщение #1 Дим » 17 декабря 2017, 16:24

Простые часы на max7219.png
Простые часы на max7219
Простые часы на max7219.png (246.89 КБ) 1689 просмотров


phpBB [media]


Вообщем то и часами это назвать нельзя, скорее это таймер который обнуляется каждые сутки и начинает свой отсчёт снова и снова. В данной схеме не предусмотрены ни модуль точного времени ни кнопки для настройки времени. Только Arduino и матрица max7219. Что бы часы относительно точно показывали время нужно запустить "девайс" в XX:00 минут, а часы можно настроить в строке float utcOffset = 17; //поправка часового пояса. Ну вот вообщем то и всё, в скетче есть необходимые пояснения.

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

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>

int offset=1,refresh=0;
int pinCS = 10; // Подключение пина CS
int numberOfHorizontalDisplays = 4; // Количество светодиодных матриц по Горизонтали
int numberOfVerticalDisplays = 1; // Количество светодиодных матриц по Вертикали;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

void setup(void) {
matrix.setIntensity(0); // Яркость матрицы от 0 до 15
matrix.setRotation(matrix.getRotation()+2); //1 - 90  2 - 180   3 - 270 градусов

// начальные координаты матриц 8*8
  matrix.setRotation(0, 1);        // 1 матрица
  matrix.setRotation(1, 1);        // 2 матрица
  matrix.setRotation(2, 1);        // 3 матрица
  matrix.setRotation(3, 1);        // 4 матрица
}

int dots = 0;
long dotTime = 0;
int h,m,s;
// =======================================================================
void loop(void) {
DisplayTime();
  if(millis()-dotTime > 500) {
    dotTime = millis();
    dots = !dots;
  }
}

// =======================================================================
void DisplayTime(){
    updateTime();
    matrix.fillScreen(LOW);
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
  
    if
(& 1){matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);} //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
    else{matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);}
    
    String hour1 
= String (h/10);
    String hour2 = String (h%10);
    String min1 = String (m/10);
    String min2 = String (m%10);
    String sec1 = String (s/10);
    String sec2 = String (s%10);
    int xh = 2;
    int xm = 19;
//    int xs = 28; //секунды

    matrix.drawChar(xh, y, hour1[0], HIGH, LOW, 1);
    matrix.drawChar(xh+6, y, hour2[0], HIGH, LOW, 1);
    matrix.drawChar(xm, y, min1[0], HIGH, LOW, 1);
    matrix.drawChar(xm+6, y, min2[0], HIGH, LOW, 1);
//    matrix.drawChar(xs, y, sec1[0], HIGH, LOW, 1);//секунды
//    matrix.drawChar(xs+6, y, sec2[0], HIGH, LOW, 1); //секунды 
 
    matrix
.write(); // Вывод на дисплей
}

float utcOffset = 17; //поправка часового пояса
long localEpoc = 0;
long localMillisAtUpdate = 0;

void updateTime()
{
  long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
  long epoch = round(curEpoch + 3600 * utcOffset + 86400L) % 86400L;
  h = ((epoch  % 86400L) / 3600) % 24;
  m = (epoch % 3600) / 60;
  s = epoch % 60;
}


Схема подключения такая же как и в других проектах

Простые часы на max7219 1.png
Простые часы на max7219
Простые часы на max7219 1.png (69.56 КБ) 1687 просмотров
i love you mxIni Mysql

! ! !


Аватара
Автор темы
Дим M
Администратор
Администратор
Сообщения: 1131
Репутация: 70
С нами: 5 лет 2 месяца

Часы на max7219 + DS18B20 + BMP180

Сообщение #2 Дим » 27 декабря 2017, 19:17

Пока не пришёл модуль точного времени, решил прикрутить к этим часам Модуль датчика температуры DS18B20 и Модуль датчика BMP180. И в итоге у меня получились часы и бегущая строка (через определённое время) с показаниями температуры на улице, дома и атмосферным давлением. Датчик выведен за окно по витой паре, BMP180 дома, с него и считывается домашняя температура.

Простые часы на max7219 1(1).png
Простые часы на max7219
Простые часы на max7219 1(1).png (77.62 КБ) 1652 просмотра


В код простых часов добавлены считывания и вывод температур и давления. Также сделал установку минут. Часы бегут на две минуты в сутки - как исправить пока не знаю. Но думаю что с установкой модуля точного времени, данную проблему удастся решить.

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

#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <DallasTemperature.h>
#define DS18B20 8  // Указываем, к какому выводу подключена DQ (уличн темп)
Adafruit_BMP085 bmp;

int wait = 50; // скорость бегущей строки
int spacer = 2;
int width = 5 + spacer; // Регулируем расстояние между символами
int refresh=0;
int pinCS = 10; // Подключение пина CS
int numberOfHorizontalDisplays = 4; // Количество светодиодных матриц по Горизонтали
int numberOfVerticalDisplays = 1; // Количество светодиодных матриц по Вертикали
String weatherString;
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
OneWire oneWire(DS18B20);                   
DallasTemperature sensors
(&oneWire);
// =======================================================================
void setup(void) {
  if (!bmp.begin()) {//для температуры улицы
  while (1) {}
  } 
  matrix
.setIntensity(0); // Яркость матрицы от 0 до 15
  matrix.setRotation(matrix.getRotation()+2); //1 - 90  2 - 180   3 - 270 угол поворота
// начальные координаты матриц 8*8
  matrix.setRotation(0, 1);        // 1 матрица
  matrix.setRotation(1, 1);        // 2 матрица
  matrix.setRotation(2, 1);        // 3 матрица
  matrix.setRotation(3, 1);        // 4 матрица
}
// =======================================================================
int updCnt = 0;
int dots = 0;
long dotTime = 0;
long clkTime = 0;
byte del=0;
int h,m,s;
// =======================================================================
void loop(void) {
  if(updCnt<=0) 
  
{ // каждые 10 циклов получаем данные времени и погоды
    updCnt = 1;
    getWeatherData();
    clkTime = millis();
  }
  if(millis()-clkTime > 180000 && !del && dots) { //каждые 3 минуты/180000 сек запускаем бегущую строку
  //ScrollText(utf8rus("sampawno.ru!")); //тут текст строки
  ScrollText(utf8rus(weatherString)); //тут текст температуры и давления
  updCnt--;
  clkTime = millis();
  }
  DisplayTime();
  if(millis()-dotTime > 500) {
    dotTime = millis();
    dots = !dots;
  }
}
// =======================================================================
void DisplayTime(){
    sensors.requestTemperatures();              // Считываем показания температуры 
    updateTime();
    matrix.fillScreen(LOW);
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
    if(& 1){matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);} //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
    else{matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);}  
    String hour1 
= String (h/10);
    String hour2 = String (h%10);
    String min1 = String (m/10);
    String min2 = String (m%10);
    int xh = 2;
    int xm = 19;
    matrix.drawChar(xh, y, hour1[0], HIGH, LOW, 1);
    matrix.drawChar(xh+6, y, hour2[0], HIGH, LOW, 1);
    matrix.drawChar(xm, y, min1[0], HIGH, LOW, 1);
    matrix.drawChar(xm+6, y, min2[0], HIGH, LOW, 1); 
    matrix
.write(); // Вывод на дисплей
}
// =======================================================================
void ScrollText (String text){
    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;
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
    while ( x + 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);
  }
}
// =======================================================================
float tempOffset = 1.5; //поправка уличного датчика
void getWeatherData()
{
  weatherString = "t.дом: " + String(bmp.readTemperature(),1)+" ";
  weatherString += " улица: " + String(sensors.getTempCByIndex(0) - tempOffset, 1)+" ";
  weatherString += " Давл: " + String(bmp.readSealevelPressure()/131.42) + " мм ";//131.42 поправка реального(из инета)
}
// =======================================================================
float utcOffset = 18; //поправка часового пояса (при первом включении)
float minOffset = 42; //установка минут (при первом включении)
long localEpoc = 0;
long localMillisAtUpdate = 0;
// =======================================================================r
void updateTime()
{
  long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
  //long epoch = round(curEpoch + 3600 * utcOffset + 86400L) % 86400L;
  long epoch = round(curEpoch + 3600 * utcOffset + 86400L + (minOffset * 60)) % 86400L; //(minOffset * 60) - установка минут
  h = ((epoch  % 86400L) / 3600 ) % 24;
  m = (epoch % 3600) / 60;
  s = epoch % 60;
}
// ============================ латиница =================================
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };
  k = source.length(); i = 0;
  while (< k) {
    n = source[i]; i++;
    if (>= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (== 0x81) { n = 0xA8; break; }
          if (>= 0x90 && n <= 0xBF) n = n + 0x30-1;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (== 0x91) { n = 0xB8; break; }
          if (>= 0x80 && n <= 0x8F) n = n + 0x70-1;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;


На видео подключено к Arduino Nano, но на Arduino UNO такая же схема подключения.

phpBB [media]
i love you mxIni Mysql


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

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

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

Сейчас этот раздел просматривают: 1 гость