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

vlad1946
Ефрейтор
Ефрейтор
Аватара
vlad1946
Ефрейтор
Ефрейтор
Сообщения: 15
Зарегистрирован: 6 июля 2020
С нами: 3 года 8 месяцев

#31 vlad1946 » 6 июля 2020, 21:37

Дим писал(а):Для первой версии часов добавил ИК приёмник.
Здравствуйте. Замечательный проект.Собрал ,всё работает.Можно ли сделать чтобы вместе с температурой и давлением выводилась дата(число,месяц,год,день недели) или отдельной строкой с пульта?


Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#32 Дим » 7 июля 2020, 0:03

vlad1946 писал(а):вместе с температурой и давлением выводилась дата(число,месяц,год,день недели)
Я думаю ни чего сложного в этом нет. Нужно просто взять эти данные с модуля DS1307 и добавить на вывод.
[center]i love you [s]mxIni[/s] Mysql[/center]

vlad1946
Ефрейтор
Ефрейтор
Аватара
vlad1946
Ефрейтор
Ефрейтор
Сообщения: 15
Зарегистрирован: 6 июля 2020
С нами: 3 года 8 месяцев

#33 vlad1946 » 7 июля 2020, 9:12

Здравствуйте.Спасибо за оперативный ответ.Для меня это пока сложно,я плохо разбираюсь в программировании(только начал изучать).Пытаюсь,но пока не получается.Ну да ладно не получится,оставлю так ,а проект очень нравится ,особенно управление с пульта-класс!

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#34 Дим » 7 июля 2020, 11:14

vlad1946 писал(а):только начал изучать
Тогда почитай статью про Библиотеку iarduino_RTC. Там описана функция gettime();
[center]i love you [s]mxIni[/s] Mysql[/center]

vlad1946
Ефрейтор
Ефрейтор
Аватара
vlad1946
Ефрейтор
Ефрейтор
Сообщения: 15
Зарегистрирован: 6 июля 2020
С нами: 3 года 8 месяцев

#35 vlad1946 » 8 июля 2020, 13:57

Здравствуйте. Вставил эту функцию в скетч,но она выводит данные в монитор порта(вижу там) ,как теперь вывести на дисплей? Я думаю ,что нужно читать библиотеку панели,правильно?И попутно вопрос: у вас в первой версии задействовано 3 клавиши пульта,а в последующей только одна-мне не понятно.Разъясните плиз.

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#36 Дим » 9 июля 2020, 20:00

vlad1946 писал(а):Вставил эту функцию в скетч
Покажи как (код)
vlad1946 писал(а):3 клавиши пульта,а в последующей только одна
3 клавиши - это одной вызов бегущей строки а две другие это регулировка яркости дисплея +-
[center]i love you [s]mxIni[/s] Mysql[/center]

vlad1946
Ефрейтор
Ефрейтор
Аватара
vlad1946
Ефрейтор
Ефрейтор
Сообщения: 15
Зарегистрирован: 6 июля 2020
С нами: 3 года 8 месяцев

#37 vlad1946 » 9 июля 2020, 22:05

Здравствуйте .Я имел ввиду вторую версию часов.Там вы использовали только одну клавишу с пульта(или я чего-то не понял)
Да, забыл сказать у меня модуль часов Ds3231.
Спойлер

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

#include <Adafruit_BMP085.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <DallasTemperature.h>
#include <iarduino_RTC.h>                     // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
iarduino_RTC time(RTC_DS1307);                // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C
Adafruit_BMP085 bmp;
// ============================== кнопки
const uint8_t PIN_button_SET  = 3;            // указываем номер вывода arduino, к которому подключена кнопка SET
const uint8_t PIN_button_UP   = 4;            // указываем номер вывода arduino, к которому подключена кнопка UP
//const uint8_t PIN_button_DOWN = 5;            // указываем номер вывода arduino, к которому подключена кнопка DOWN
bool     button_state1      = false;          // статус кнопки 1
bool     button_state2      = false;          // статус кнопки 2
uint32_t ms_button         = 0;
uint32_t ms_auto_click     = 0;

                       // корректировали время или нет
uint8_t updCnt = 0;
uint8_t dots = 0;
long dotTime = 0;
long clkTime = 0;
byte del=0;

const uint8_t DS18B20 = 7;         // Указываем, к какому выводу подключена DQ (уличн темп)

uint8_t mig = 0;
uint8_t migSet = 0;
uint8_t migTime = 0;
long previousMillis = 0;
uint8_t val=0; 

uint8_t wait 
= 35;                            // скорость бегущей строки
uint8_t spacer = 2;
uint8_t width = 5 + spacer;                   // Регулируем расстояние между символами
uint8_t refresh=0;
const uint8_t  pinCS = 10;                    // Подключение пина CS
uint8_t numberOfHorizontalDisplays = 4;       // Количество светодиодных матриц по Горизонтали
uint8_t numberOfVerticalDisplays = 1;         // Количество светодиодных матриц по Вертикали
String weatherString;                         //бегущая строка
String clocks;                                // время

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
OneWire oneWire(DS18B20);                   
DallasTemperature sensors
(&oneWire);
// ===================================================================================================================================
void setup(void) {
  Serial.begin( 9600 );                       // Инициируем передачу данных в монитор последовательного порта
  if (!bmp.begin())                           //для температуры улицы
  {
    while (1) {}
  } 
  time
.begin();                               // Инициируем работу с модулем.
  //time.settime(0,27,21,03,01,18,3);         // Записываем время в модуль: 0 сек, 27 мин, 21 час, 3, января, 2018 года, среда. time.settime(0,27,21,03,01,18,3);
  matrix.setIntensity(1);                     // Яркость матрицы от 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 матрица                                  
  pinMode(PIN_button_SET, INPUT_PULLUP);      // кнопки
  pinMode(PIN_button_UP, INPUT_PULLUP);
//  pinMode(PIN_button_DOWN, INPUT_PULLUP);
//   digitalWrite(PIN_button_SET ,HIGH);
}
// =======================================================================
void loop() {
  Serial.println( time.gettime("d-m-y, H:i, D") ); 

  
  if
(updCnt<=0) 
  
{                                                             // каждые 10 циклов получаем данные времени и погоды
    updCnt = 1;

    getWeatherData();
    clkTime = millis();
  }

   
  if
(millis()-clkTime > 90000 && !del && dots && mig == 0) {   //каждые 1.5 минуты/300000 мили/сек запускаем бегущую строку
  
  ScrollText
(utf8rus(weatherString));            // текст температуры и давления
  ScrollText(utf8rus("июль-2020"));
  updCnt--;
  clkTime = millis();
  }
  DisplayTime();
  time.blinktime(migSet);                                       // мигаем устанавливаемым параметром (migSet больше 0) при установке времени
  if(millis()-dotTime > 500) 
  
{
    dotTime = millis();
    dots = !dots;
  }
  Func_buttons_control();
}
void Func_buttons_control()
{
   uint32_t ms    = millis();
   bool pin_state1 = digitalRead(PIN_button_SET); // кнопка SET
   bool pin_state2 = digitalRead(PIN_button_UP); // 2 кнопка
  // =========================================================================================================================== кнопка SET
  if(pin_state1  == LOW && !button_state1 && ( ms - ms_button ) > 50 )
  { 
    button_state1      
= true;
    ms_button         = ms;
    switch (mig) 
    
{
      case 0:         // кнопка SET выбор час
        migSet = 3;
        mig = 1;
        break;
      case 1:         // кнопка SET выбор мин
        migSet = 2;
        mig = 2;
        break;
     case 2:         // кнопка SET сброс сек на 00
        migSet = 0;                                   // НЕмигают минуты и часы
        mig = 0;
        time.settime(0, -1, -1);                      // Сбросит секунды на 0, а часы, минуты и дату, оставит без изменений.
        break;
    }
  }
  //=========================================================================== кнопка SET (Фиксируем отпускание кнопки SET)  
  if( pin_state1 == HIGH && button_state1 && ( ms - ms_button ) > 50  )
  {
    button_state1      = false;   
    ms_button         
= ms;
  }
  //============================================================================ Кнопка UP (Установка часов)
  if(mig == 1 && pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 )// кнопка SET
  { 
    button_state2      
= true;
    ms_button         = ms;
    migSet = 0;
    time.Hours ++;                            // прибавляем единицу к часам
    if (time.Hours > 23) time.Hours = 0;      // если вылезли за границы присваеваем 0
    time.settime(-1, -1, time.Hours);         // установит часы, а секунды, минуты и дату, оставит без изменений.
  }
  if(mig == 1 && pin_state2  == LOW && ( ms - ms_button ) > 1000 && ( ms - ms_auto_click )>300 ) // После 1000 мс нажатия кнопки каждые 400 мс фиксируем событие нажатия  
  {
    ms_auto_click     = ms;
    migSet = 0;
    time.Hours ++;                            // прибавляем единицу к часам
    if (time.Hours > 23) time.Hours = 0;      // если вылезли за границы присваеваем 0
    time.settime(-1, -1, time.Hours);         // установит часы, а секунды, минуты и дату, оставит без изменений.
  }
  //============================================================================  Кнопка UP (Установка минут)
  if(mig == 2 && pin_state2  == LOW && !button_state2 && ( ms - ms_button ) > 50 )// кнопка SET
  { 
    button_state2      
= true;
    ms_button         = ms;
    migSet = 0;
    time.minutes ++;                          // прибавляем единицу к минутам
    if (time.minutes > 59) time.minutes = 0;  // если вылезли за границы присваеваем 0
    time.settime(-1, time.minutes, -1);       // установит минуты, а секунды, часы и дату, оставит без изменений.
  }
  if(mig == 2 && pin_state2  == LOW && ( ms - ms_button ) > 1000 && ( ms - ms_auto_click )>300 ) // После 1000 мс нажатия кнопки каждые 400 мс фиксируем событие нажатия  
  {
    ms_auto_click     = ms;
    migSet = 0;
    time.minutes ++;                          // прибавляем единицу к минутам
    if (time.minutes > 59) time.minutes = 0;  // если вылезли за границы присваеваем 0
    time.settime(-1, time.minutes, -1);       // установит минуты, а секунды, часы и дату, оставит без изменений.
  }
//==============================================================================  Кнопка UP ( Фиксируем отпускание кнопки установки часов/минут  )
  if(pin_state2 == HIGH && button_state2 && ( ms - ms_button ) > 50  )
  {
    button_state2      = false;   
    ms_button         
= ms;
    if(mig == 1){migSet = 3;}
    if(mig == 2){migSet = 2;}
  }
}
void DisplayTime()
{
  sensors.requestTemperatures();             // Считываем показания температуры 
  clocks = String(time.gettime("His"))+" ";  // Время
// здесь была коррекция времени
 
  matrix
.fillScreen(LOW);
  int y = (matrix.height() - 8) / 2;         // Центрируем текст по Вертикали
  // if(clocks[5] & 1){matrix.drawChar(14, y-1, (String(":"))[0], HIGH, LOW, 1);} //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
//  else{matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);}               //каждую НЕЧЕТНУЮ секунду НЕ ПЕЧАТАЕМ двоеточие по центру (чтобы мигало)
  if(clocks[5] & 1){matrix.drawChar(14, 0, (String(":"))[0], HIGH, LOW, 1);}    //каждую четную секунду печатаем двоеточие по центру (чтобы бегало)
  else{matrix.drawChar(14, -1, (String(":"))[0], HIGH, LOW, 1);}                //каждую НЕЧЕТНУЮ секунду печатаем двоеточие ВЫШЕ на 1 (чтобы бегало)
  
  int xh 
= 2;
  int xm = 19;
  matrix.drawChar(xh, y, clocks[0], HIGH, LOW, 1);
  matrix.drawChar(xh+6, y, clocks[1], HIGH, LOW, 1);
  matrix.drawChar(xm, y, clocks[2], HIGH, LOW, 1);
  matrix.drawChar(xm+6, y, clocks[3], 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 = 0.0;               //поправка уличного датчика
void getWeatherData()
{
  weatherString = " t.дом: " + String(bmp.readTemperature(),1)+" ";
  weatherString += " улица: " + String(sensors.getTempCByIndex(0) - tempOffset, 1)+" ";
  weatherString += " Давл: " + String(bmp.readSealevelPressure()/133.29) + " мм рт.ст ";       //131.42 поправка реального(из инета)
}
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;

}

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#38 Дим » 10 июля 2020, 15:34

vlad1946 писал(а):использовали только одну клавишу с пульта
Всё верно.
[center]i love you [s]mxIni[/s] Mysql[/center]

vlad1946
Ефрейтор
Ефрейтор
Аватара
vlad1946
Ефрейтор
Ефрейтор
Сообщения: 15
Зарегистрирован: 6 июля 2020
С нами: 3 года 8 месяцев

#39 vlad1946 » 10 июля 2020, 17:49

Спасибо вам за науку.Разобрался и методом тыка вставил строку( ScrollText( utf8rus(time.gettime("d-m-Y D"))); ) в нужное место.Вот что значит правильно вставить хе хе хе  :dance:

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#40 Дим » 10 июля 2020, 18:25

vlad1946 писал(а):Разобрался
Рад за вас  :balalaika:
[center]i love you [s]mxIni[/s] Mysql[/center]


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

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

Кто сейчас на форуме (по активности за 5 минут)

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