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

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

#41 vlad1946 » 11 июля 2020, 14:57

Дим писал(а):uint32_t Key1 = 0x2FD50AF;                    // Определяем код кнопки ПДУ OK
Здравствуйте.Вот эта кнопка запускает только бегущую строку и всё ?


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

#42 Дим » 11 июля 2020, 15:08

vlad1946 писал(а):бегущую строку и всё
Да только для запуска строки.Регулировку яркости я не делал.
[center]i love you [s]mxIni[/s] Mysql[/center]

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

#43 vlad1946 » 11 июля 2020, 15:47

Спасибо.Подскажите плиз много ли нужно переделать ,чтобы заменить датчик BMP180 на BMP280.Мне больше понравился первый вариант с пультом на 3х кнопках,а датчиков 180 нет,ждать с Али это долго.Или лучше посоветуйте как .....

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

#44 Дим » 11 июля 2020, 17:03

vlad1946 писал(а):много ли нужно переделать
BMP280 это новая версия датчика BMP180 так что возможно переделывать ни чего и не нужно (но нужно смотреть более детально)
[center]i love you [s]mxIni[/s] Mysql[/center]

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

#45 vlad1946 » 15 июля 2020, 18:50

Всё,допилил проект под свои хотелки. Сейчас время,день недели ,дату(д.м.г.) выводит в бегущей строке.С пульта регулируется(яркость +/- и запуск бегущей строки) BMP180 заменил на BMP280 работает по I2C. Чтобы BMP280 (китайский 3.3в) работал корректно по I2C нужно соединить вывод VCC(+3.3в питание) с выводом SDO. Вывод CSB не используется.Замечательный проект-Спасибо админу. Код:
Спойлер

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

#include <Adafruit_BMP280.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <DallasTemperature.h>
#include "IRremote.h"
IRrecv irrecv(12);                            // указываем вывод, к которому подключен ИК приемник
decode_results results;
uint32_t Key1 0x40BF30CF;                    // Определяем код кнопки ПДУ OK
uint32_t Key2 0x40BF7887;                    // Определяем код кнопки ПДУ лево
uint32_t Key3 0x40BFF807;                    // Определяем код кнопки ПДУ право
#include <iarduino_RTC.h>                     // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
iarduino_RTC time(RTC_DS1307);                // Объявляем объект time для работы с RTC модулем на базе чипа DS1307, используется аппаратная шина I2C
Adafruit_BMP280 bmp280;
// ============================== кнопки
const uint8_t PIN_button_SET  4;            // указываем номер вывода arduino, к которому подключена кнопка SET
const uint8_t PIN_button_UP   3;            // указываем номер вывода arduino, к которому подключена кнопка UP
//const uint8_t PIN_button_DOWN = 5;            // указываем номер вывода arduino, к которому подключена кнопка DOWN
bool     button_state1      false;          // статус кнопки 1
bool     button_state2      false;          // статус кнопки 2
bool     button_long_state  false;          // удержание кнопки (код выполнится один раз)
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;

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

uint8_t wibor 0;                            // После того как длительно нажали на кнопку SET можно будет нажимать коротко
uint8_t mig 0;
uint8_t migSet 0;
uint8_t migTime 0;
long previousMillis 0;
uint8_t val=0

uint8_t wait 40;                            // скорость бегущей строки
uint8_t spacer 2;
uint8_t width 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(pinCSnumberOfHorizontalDisplaysnumberOfVerticalDisplays);
OneWire oneWire(DS18B20);                   
DallasTemperature sensors(&oneWire);
byte brightness 0;                         // Яркость матрицы от 0 до 15
// ===================================================================================================================================
void setup(void) {
  
Serial.begin9600 );                       // Инициируем передачу данных в монитор последовательного порта
  
irrecv.enableIRIn();                        // запускаем прием ИК приемника
  
if (!bmp280.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(brightness);            // Яркость матрицы от 0 до 15
  
matrix.setRotation(matrix.getRotation()+2); // 1 - 90  2 - 180   3 - 270 угол поворота
                                   // начальные координаты матриц 8*8
  
matrix.setRotation(01);        // 1 матрица
  
matrix.setRotation(11);        // 2 матрица
  
matrix.setRotation(21);        // 3 матрица
  
matrix.setRotation(31);        // 4 матрица                                  
  
pinMode(PIN_button_SETINPUT_PULLUP);      // кнопки
  
pinMode(PIN_button_UPINPUT_PULLUP);
//  pinMode(PIN_button_DOWN, INPUT_PULLUP);
//   digitalWrite(PIN_button_SET ,HIGH);
}
// =======================================================================
void loop(void

  
Serial.printlntime.gettime("d-m-y, H:i:s, D") );   
  if(
updCnt<=0
  {                                                              
// каждые 10 циклов получаем данные времени и погоды
    
updCnt 1;
    
getWeatherData();
    
clkTime millis();
  }
//  if((millis()-clkTime > 600000 && dots && mig == 0) || (mig == 3))// Через 10 минут/600000 мили/сек и не переводим часы (mig == 0) (или нажата кнопа UP) запускаем бегущую строку
  
if(((time.minutes == || time.minutes == 19 || time.minutes == 29 || time.minutes == 39 || time.minutes == 49 || time.minutes == 59) && time.seconds == 59 && mig == 0) || (mig == 3)) 
  {                                                               
// каждые (9,19,29,39,49,59) минут и 59 секунд и не переводим часы (mig == 0)(или нажата кнопа UP) запускаем бегущую строку
    
ScrollText(utf8rus("Н-Тагил рулит!"));                        // любой ваш текст строки
    
ScrollText(utf8rus(weatherString));                           // текст температуры и давления
    
    
updCnt--;
    
ScrollTextutf8rus(time.gettime("d-m-Y   D")));              // вывод даты
    
clkTime millis();
    
mig 0;                                                      // переменная mig не 3, для кнопки вызова бегущей строки, что бы не циклило её
  
}
  
DisplayTime();
  
time.blinktime(migSet);                                         // мигаем устанавливаемым параметром (migSet больше 0) при установке времени
  
if(millis()-dotTime 500
  {
    
dotTime millis();
    
dots = !dots;
  }
  
Func_buttons_control();
  if ( 
irrecv.decode( &results )) 
  {                              
// если данные с ПДУ пришли  
    
if (results.value == Key1)                                     // если нажата кнопка 1
      
{mig 3;}                                                   // запускаем бегущую строку
      
    
if (results.value == Key2)                                     // если нажата кнопка 2
      
{brightness --;}                                             // убавляем переменную яркости матрицы
      
if (brightness == 255brightness 15;                      // если вылезли за границы присваеваем 15 
      
{matrix.setIntensity(brightness);}                           // устанавливаем яркость матрицы     
      
    
if (results.value == Key3)                                     // если нажата кнопка 3
      
{brightness ++;}                                             // прибавляем переменную яркости матрицы
      
if (brightness 15brightness 0;                         // если вылезли за границы присваеваем 0
      
{matrix.setIntensity(brightness);}                           // устанавливаем яркость матрицы   
      
    
irrecv.resume();   // принимаем следующую команду
  
}
}
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
// Фиксируем нажатие кнопки  SET
  
if( pin_state1  == LOW && !button_state1 && ( ms ms_button ) > 50 ){
      
button_state1     true;
      
button_long_state false;
      
ms_button         ms;
      if(
wibor == 1)
        switch (
mig
        {
          case 
1:         // кнопка SET выбор мин
            
migSet 2;
            
mig 2;
            break;
          case 
2:         // кнопка SET сброс сек на 00
            
migSet 0;                                   // НЕмигают минуты и часы
            
mig 0;
            
time.settime(0, -1, -1);                      // Сбросит секунды на 0, а часы, минуты и дату, оставит без изменений.
            
wibor 0;
            break;
        }  
  }
// После 2000 мс нажатия кнопки SET единоразово выполним код
  
if( pin_state1  == LOW && !button_long_state && ( ms ms_button ) > 2000 // кнопка SET выбор час
  
{
    
migSet 3;
    
mig 1;  
    
wibor 1;                                     // длительно нажали
  
}
// Фиксируем отпускание кнопки SET 
   
if( pin_state1 == HIGH && button_state1 && ( ms ms_button ) > 50  ){
      
button_state1     false;   
      
ms_button         ms;
      
Serial.println("No Press 2"); //действие после отпуска длительного нажатия
   
}   
  
//===========================================  Кнопка UP (Установка часов)
  
if(mig == && pin_state2  == LOW && !button_state2 && ( ms ms_button ) > 50 )
  { 
    
button_state2     true;
    
ms_button         ms;
    
migSet 0;
    
time.Hours ++;                            // прибавляем единицу к часам
    
if (time.Hours 23time.Hours 0;      // если вылезли за границы присваеваем 0
    
time.settime(-1, -1time.Hours);         // установит часы, а секунды, минуты и дату, оставит без изменений.
  
}
  if(
mig == && 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 23time.Hours 0;      // если вылезли за границы присваеваем 0
    
time.settime(-1, -1time.Hours);         // установит часы, а секунды, минуты и дату, оставит без изменений.
  
}
  
//===========================================  Кнопка UP (Установка минут)
  
if(mig == && pin_state2  == LOW && !button_state2 && ( ms ms_button ) > 50 )
  { 
    
button_state2     true;
    
ms_button         ms;
    
migSet 0;
    
time.minutes ++;                          // прибавляем единицу к минутам
    
if (time.minutes 59time.minutes 0;  // если вылезли за границы присваеваем 0
    
time.settime(-1time.minutes, -1);       // установит минуты, а секунды, часы и дату, оставит без изменений.
  
}
  if(
mig == && 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 59time.minutes 0;  // если вылезли за границы присваеваем 0
    
time.settime(-1time.minutes, -1);       // установит минуты, а секунды, часы и дату, оставит без изменений.
  
}
  
//===========================================  Кнопка UP (Установка минут) вызов бегущей строки  
  
if(mig == && pin_state2  == LOW && !button_state2 && ( ms ms_button ) > 50 )
  { 
    
mig 3;
  } 
//==============================================================================  Кнопка 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(140, (String(":"))[0], HIGHLOW1);}    //каждую четную секунду печатаем двоеточие по центру (чтобы бегало)
  
else{matrix.drawChar(14, -1, (String(":"))[0], HIGHLOW1);}                //каждую НЕЧЕТНУЮ секунду печатаем двоеточие ВЫШЕ на 1 (чтобы бегало)
  
  
int xh 2;
  
int xm 19;
  
matrix.drawChar(xhyclocks[0], HIGHLOW1);
  
matrix.drawChar(xh+6yclocks[1], HIGHLOW1);
  
matrix.drawChar(xmyclocks[2], HIGHLOW1);
  
matrix.drawChar(xm+6yclocks[3], HIGHLOW1); 
  
matrix.write();                                     // Вывод на дисплей
}
void ScrollText (String text)
{
    for ( 
int i width text.length() + matrix.width() - spaceri++ ) {
    if (
refresh==1i=0;
    
refresh=0;
    
matrix.fillScreen(LOW);
    
int letter width;
    
int x = (matrix.width() - 1) - width;
    
int y = (matrix.height() - 8) / 2;  // Центрируем текст по Вертикали
    
while ( width spacer >= && letter >= 
    {
      if ( 
letter text.length() ) 
      {
        
matrix.drawChar(xytext[letter], HIGHLOW1);
      }
      
letter--;
      
-= width;
    }
    
matrix.write();                    // Вывод на дисплей
    
delay(wait);
  }
}

float tempOffset = -0.5;               //поправка уличного датчика
void getWeatherData()
{
  
weatherString " t.дом: " String(bmp280.readTemperature(),1)+" ";
  
weatherString += " улица: " String(sensors.getTempCByIndex(0) - tempOffset1)+" ";
  
weatherString += " Давл: " String(bmp280.readPressure()/132.95) + " мм рт.ст ";       //131.42 поправка для вашего местоположения
}
String utf8rus(String source)
{
  
int i,k;
  
String target;
  
unsigned char n;
  
char m[2] = { '0''\0' };
  
source.length(); 0;
  while (
k) {
    
source[i]; i++;
    if (
>= 0xC0) {
      switch (
n) {
        case 
0xD0: {
          
source[i]; i++;
          if (
== 0x81) { 0xA8; break; }
          if (
>= 0x90 && <= 0xBF0x30-1;
          break;
        }
        case 
0xD1: {
          
source[i]; i++;
          if (
== 0x91) { 0xB8; break; }
          if (
>= 0x80 && <= 0x8F0x70-1;
          break;
        }
      }
    }
    
m[0] = ntarget target String(m);
  }
return 
target;

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

#46 Дим » 15 июля 2020, 21:14

vlad1946 писал(а):допилил проект
Можно и отдельную тему допиленного проекта сделать, с видео и схемой :wink:
[center]i love you [s]mxIni[/s] Mysql[/center]

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

#47 vlad1946 » 16 августа 2020, 10:17

Получил датчик BMP180 ,поставил в проект работает.Показания по давлению требуют корректировки для вашего местоположения BMP280 и BMP180.Заметил отличие : скетч с BMP180 занимает памяти намного меньше,чем с BMP280,что иногда бывает существенно при применении модуля PRO mini.Датчиков температуры уличных использую два(застекленная лоджия и улица) И ещё один мой косяк: не учел нагрев дисплея(матрицы) нагревает датчик BMP....(расположил в корпусе рядом , 2-3 градуса добавляет) Нужно выносить из корпуса на заднюю стенку где-то рядом, или делать поправку Для тех кто будет повторять.А так замечательный проект,я очень доволен.  :dance:!

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

#48 Дим » 22 августа 2020, 15:30

vlad1946 писал(а):не учел нагрев дисплея(матрицы)
Яркость (matrix.setIntensity) убавлена?
[center]i love you [s]mxIni[/s] Mysql[/center]

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

#49 vlad1946 » 30 августа 2020, 18:23

Да,яркость минимум. Даже на минимальной яркости 2 градуса добавляет,непонятно откуда тепло идет.

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

#50 Дим » 30 августа 2020, 20:37

vlad1946 писал(а):непонятно откуда тепло идет
Тепло может идти и от самого контроллера.
[center]i love you [s]mxIni[/s] Mysql[/center]


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

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

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

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