Часы на трех матрицах 8x8 MAX7219

S_Sergey_G
Ст. сержант
Ст. сержант
Avatar
S_Sergey_G
Ст. сержант
Ст. сержант
Posts: 88
Joined: 28 Jan 2021
With us: 2 months 15 days

#101by S_Sergey_G » 17 Feb 2021, 13:04

Дим wrote:измени
А на, что менять?

! ! !


S_Sergey_G
Ст. сержант
Ст. сержант
Avatar
S_Sergey_G
Ст. сержант
Ст. сержант
Posts: 88
Joined: 28 Jan 2021
With us: 2 months 15 days

#102by S_Sergey_G » 17 Feb 2021, 16:10

Ну вот конец дня, у меня ничего не получилось. Некудышный я ардуинщик.
Вот, что то сделал, переключает один раз на второй датчик. Но думаю это совсем не так.

Code: Select all

int RECEIVE_PIN = A0;
IRrecv irrecv(RECEIVE_PIN);
decode_results results;


Code: Select all

void setup(void) {
  Serial.begin( 9600 );
  irrecv.enableIRIn();


Code: Select all

void loop(void)
{   
if ((irrecv.decode(&results)) && (results.value==0xFD00FF) )
    {
        if (knopka == 0)
            knopka = 1;
           
       }
       else
       {
            knopka = 0;
                   
}

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1451
Joined: 5 Apr 2013
With us: 8 years

#103by Дим » 17 Feb 2021, 16:34

Сделано на коленке - не проверено, не компилировано. Есть комментарии, думаю разберёшься. Две версии для одной кнопки пульта и для двух. Если для двух - нужно Key2 делать свой.

Code: Select all

#include <Wire.h>
//#include <Adafruit_BMP085.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 = 0xFD00FF;                    // Определяем код кнопки ПДУ 1 датчик
uint32_t Key2 = 0xFD00FF;                    // Определяем код кнопки ПДУ 2 датчик

//Adafruit_BMP085 bmp;

uint8_t updCnt = 0;
uint8_t dots = 0;
long dotTime = 0;
long clkTime = 0;

const uint8_t DS18B20_1 = 8;                    // Указываем, к какому выводу подключен 1 датчик
const uint8_t DS18B20_2 = 7;                    // Указываем, к какому выводу подключен 2 датчик
long previousMillis = 0;
uint8_t val=0; 

uint8_t knopka 
= 0;                            // если не нажата на ПДУ 0 ((показ первый датчик)), иначе 1 (показ второй датчик)
uint8_t spacer = 2;
uint8_t width = 5 + spacer;                   // Регулируем расстояние между символами
uint8_t refresh=0;
const uint8_t  pinCS = 10;                    // Подключение пина CS
uint8_t numberOfHorizontalDisplays = 3;       // Количество светодиодных матриц по Горизонтали
uint8_t numberOfVerticalDisplays = 1;         // Количество светодиодных матриц по Вертикали
String clocks;                                // время (теперь темп)

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
OneWire oneWire_1(DS18B20_1);  
OneWire oneWire_2
(DS18B20_2);                 
DallasTemperature sensors_1
(&oneWire_1);
DallasTemperature sensors_2(&oneWire_2);
byte brightness = 0;                         // Яркость матрицы от 0 до 15
// ===================================================================================================================================
void setup(void) {
  Serial.begin( 9600 );                       // Инициируем передачу данных в монитор последовательного порта
  irrecv.enableIRIn();                        // запускаем прием ИК приемника 
/*  if (!bmp.begin())                           //для температуры улицы
  {
    while (1) {}
  } */
  sensors_1.begin();
  sensors_2.begin();
  matrix.setIntensity(brightness);            // Яркость матрицы от 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 матрица                                  

}
// =======================================================================
void loop(void) 
{   
  DisplayTime
();
  if(updCnt<=0) 
  
{                                                               // каждые 10 циклов получаем данные времени и погоды
    updCnt = 1;
    DisplayTime();
    clkTime = millis();
  }
 // DisplayTime();
  if(millis()-dotTime > 500) 
  
{
    dotTime = millis();
    dots = !dots;
  }
  if ( irrecv.decode( &results )) 
  
{                              // если данные с ПДУ пришли  
//==================== для одной кнопки начало кода =============
    if (results.value == Key1  && knopka = 0)                                     // если нажата кнопка и показывает первый датчик
      {knopka = 1;}                                                               
    else
{knopka = 0;}                                                             // если нажата кнопка и показывает второй датчик
//==================== для одной кнопки конец кода =============
/*
//==================== для двух кнопок начало кода =============         
    if (results.value == Key1)                                     // если нажата кнопка 1
      {knopka = 1;}                                                // 1 датчик
    if (results.value == Key2)                                     // если нажата кнопка 2
      {knopka = 0;}                                                // 2 датчик
//==================== для двух кнопок конец кода =============       
*/
   
    irrecv
.resume();   // принимаем следующую команду
  } 
}

void DisplayTime()
{
float tempOffset 10.0;               //поправка уличного датчика
  sensors_1.requestTemperatures();             // Считываем показания температуры 1 датчика
  sensors_2.requestTemperatures();             // Считываем показания температуры 2 датчика
  if(knopka == 0)
  {
  clocks = String(sensors_1.getTempCByIndex(0) - tempOffset, 1)+" ";  // темп в стринг 1 датчика
  }
  else{
  clocks = String(sensors_2.getTempCByIndex(0) - tempOffset, 1)+" ";  // темп в стринг 2 датчика  
  }
 
  matrix
.fillScreen(LOW);
  int y = (matrix.height() - 8) / 2;         // Центрируем текст по Вертикали
  
  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-6, y, clocks[2], HIGH, LOW, 1);
  matrix.drawChar(xm, y, clocks[3], HIGH, LOW, 1); 
  matrix
.write();                                     // Вывод на дисплей
}
/*
float tempOffset = 1.0;               //поправка уличного датчика
void getWeatherData()
{
  weatherString = " t.д: " + String(bmp.readTemperature(),1)+" ";
  weatherString += " ул: " + String(sensors.getTempCByIndex(0) - tempOffset, 1)+" ";
  weatherString += " дв: " + String(bmp.readSealevelPressure()/133.3) + " мм ";       //131.42 поправка реального(из инета)
}*/ 
i love you mxIni Mysql

S_Sergey_G
Ст. сержант
Ст. сержант
Avatar
S_Sergey_G
Ст. сержант
Ст. сержант
Posts: 88
Joined: 28 Jan 2021
With us: 2 months 15 days

#104by S_Sergey_G » 17 Feb 2021, 21:07

Вот спасибо, все заработало. С двумя кнопками вообще класс.
Только температура занижала на 10°C. float tempOffset = 10.0; заменил на float tempOffset = 1.0; стал нормально показывать.

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1451
Joined: 5 Apr 2013
With us: 8 years

#105by Дим » 17 Feb 2021, 21:34

S_Sergey_G wrote:температура занижала на 10°C
Это я специально сделал - помнишь писал "что бы не ждать утра". Нормально отображается?
Если датчик нормально показывает и нет необходимости корректировать показания температуры, то float tempOffset = 1.0; можно вообще удалить.
i love you mxIni Mysql

S_Sergey_G
Ст. сержант
Ст. сержант
Avatar
S_Sergey_G
Ст. сержант
Ст. сержант
Posts: 88
Joined: 28 Jan 2021
With us: 2 months 15 days

#106by S_Sergey_G » 17 Feb 2021, 21:49

Понял. Все равно утром проверю без корректировки. Спасибо Вам огромное!!!
У меня теперь вопросы по внешнему виду. Я так понял цифра занимает одну матрицу и не переходит на другую как в "моем" скетче?
Можно ли их как то сдвигать. Этот код "uint8_t width = 5 + spacer;" позволяет это делать?
На Вашем сайте я нашел "Image generate" подгоняю цифры под себя.

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1451
Joined: 5 Apr 2013
With us: 8 years

#107by Дим » 17 Feb 2021, 21:52

S_Sergey_G wrote:как то сдвигать
Я сам делал методом тыка. Пробуй все потихоньку )
uint8_t width = 5 + spacer там же комментарий есть - Регулируем расстояние между символами
S_Sergey_G wrote:Image generate
В этой теме я писал про него. И тут
i love you mxIni Mysql

S_Sergey_G
Ст. сержант
Ст. сержант
Avatar
S_Sergey_G
Ст. сержант
Ст. сержант
Posts: 88
Joined: 28 Jan 2021
With us: 2 months 15 days

#108by S_Sergey_G » 18 Feb 2021, 11:36

Провел "полевые" испытания. Минусовую температуру отображает корректно. Переключения с пульта работают, правда дальность хромает, выше 3х метров не переключает, хотя светодиод на приемнике моргает. Минусовая температура не помещает десятки на 3х модулях, -13. и всё. Надо или 4 модуля или поиграться со сдвигом. И еще, вчера я проверял на одном датчике. Переключался между реальными градусами и пустым пином (показывал -1.0). Сегодня подключил два датчика а картина не поменялась один датчик не видит на 8 пине, (менял местами датчики рабочие).

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1451
Joined: 5 Apr 2013
With us: 8 years

#109by Дим » 18 Feb 2021, 11:57

Весь код скинь
i love you mxIni Mysql

S_Sergey_G
Ст. сержант
Ст. сержант
Avatar
S_Sergey_G
Ст. сержант
Ст. сержант
Posts: 88
Joined: 28 Jan 2021
With us: 2 months 15 days

#110by S_Sergey_G » 18 Feb 2021, 12:00

Code: Select all

#include <Wire.h>
//#include <Adafruit_BMP085.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <DallasTemperature.h>
#include "IRremote.h"
IRrecv irrecv(A0);                            // указываем вывод, к которому подключен ИК приемник
decode_results results;
uint32_t Key1 = 0xFFA25D;                    // Определяем код кнопки ПДУ 1 датчик
uint32_t Key2 = 0xFFE21D;                    // Определяем код кнопки ПДУ 2 датчик

//Adafruit_BMP085 bmp;

uint8_t updCnt = 0;
uint8_t dots = 0;
long dotTime = 0;
long clkTime = 0;

const uint8_t DS18B20_1 = 8;                    // Указываем, к какому выводу подключен 1 датчик
const uint8_t DS18B20_2 = 7;                    // Указываем, к какому выводу подключен 2 датчик
long previousMillis = 0;
uint8_t val=0;

uint8_t knopka = 0;                            // если не нажата на ПДУ 0 ((показ первый датчик)), иначе 1 (показ второй датчик)
uint8_t spacer = 2;
uint8_t width = 5 + spacer;                   // Регулируем расстояние между символами
uint8_t refresh=0;
const uint8_t  pinCS = 10;                    // Подключение пина CS
uint8_t numberOfHorizontalDisplays = 3;       // Количество светодиодных матриц по Горизонтали
uint8_t numberOfVerticalDisplays = 1;         // Количество светодиодных матриц по Вертикали
String clocks;                                // время (теперь темп)

Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
OneWire oneWire_1(DS18B20_1); 
OneWire oneWire_2(DS18B20_2);                 
DallasTemperature sensors_1(&oneWire_1);
DallasTemperature sensors_2(&oneWire_2);
byte brightness = 2;                         // Яркость матрицы от 0 до 15
// ===================================================================================================================================
void setup(void) {
  Serial.begin( 9600 );                       // Инициируем передачу данных в монитор последовательного порта
  irrecv.enableIRIn();                        // запускаем прием ИК приемника
/*  if (!bmp.begin())                           //для температуры улицы
  {
    while (1) {}
  } */
  sensors_1.begin();
  sensors_2.begin();
  matrix.setIntensity(brightness);            // Яркость матрицы от 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 матрица                                 

}
// =======================================================================
void loop(void)
{   
  DisplayTime();
  if(updCnt<=0)
  {                                                               // каждые 10 циклов получаем данные времени и погоды
    updCnt = 1;
    DisplayTime();
    clkTime = millis();
  }
 // DisplayTime();
  if(millis()-dotTime > 500)
  {
    dotTime = millis();
    dots = !dots;
  }
  if ( irrecv.decode( &results ))
  {                              // если данные с ПДУ пришли 
//==================== для одной кнопки начало кода =============
//    if (results.value == Key1  && knopka = 0)                                     // если нажата кнопка и показывает первый датчик
  //    {knopka = 1;}                                                               
    //else{knopka = 0;}                                                             // если нажата кнопка и показывает второй датчик
//==================== для одной кнопки конец кода =============

//==================== для двух кнопок начало кода =============         
    if (results.value == Key1)                                     // если нажата кнопка 1
      {knopka = 1;}                                                // 1 датчик
    if (results.value == Key2)                                     // если нажата кнопка 2
      {knopka = 0;}                                                // 2 датчик
//==================== для двух кнопок конец кода =============       
 
    irrecv.resume();   // принимаем следующую команду
  }
}

void DisplayTime()
{
float tempOffset = 1.0;               //поправка уличного датчика
  sensors_1.requestTemperatures();             // Считываем показания температуры 1 датчика
  sensors_2.requestTemperatures();             // Считываем показания температуры 2 датчика
  if(knopka == 0)
  {
  clocks = String(sensors_1.getTempCByIndex(0) - tempOffset, 1)+" ";  // темп в стринг 1 датчика
  }
  else{
  clocks = String(sensors_2.getTempCByIndex(0) - tempOffset, 1)+" ";  // темп в стринг 2 датчика 
  }
 
  matrix.fillScreen(LOW);
  int y = (matrix.height() - 8) / 2;         // Центрируем текст по Вертикали
 
  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-6, y, clocks[2], HIGH, LOW, 1);
  matrix.drawChar(xm, y, clocks[3], HIGH, LOW, 1);
  matrix.write();                                     // Вывод на дисплей
}
/*
float tempOffset = 1.0;               //поправка уличного датчика
void getWeatherData()
{
  weatherString = " t.д: " + String(bmp.readTemperature(),1)+" ";
  weatherString += " ул: " + String(sensors.getTempCByIndex(0) - tempOffset, 1)+" ";
  weatherString += " дв: " + String(bmp.readSealevelPressure()/133.3) + " мм ";       //131.42 поправка реального(из инета)
}*/


  • Similar Topics
    Replies
    Views
    Last post

Return to “Программирование”

Who is online (over the past 5 minutes)

Users browsing this forum: 3 guests