Прошу помощи в разрешении проблемы с matrix.drawChar

bibo
Offline
Зарегистрирован: 26.03.2018

Приветствую, товарищи.

Прошу помочь разобраться, почему не отображается время на светодиодной матрице под управлением max7219.

Все компилируется, но отображаются только мигающие точки , а вот само время ни в какую.

#include <Wire.h>
#include "DHT.h"  // подключаем библиотеку для работы с датчиком DHT
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
 #include <iarduino_RTC.h>

#define DHTTYPE DHT11   // DHT 11
#define DHTPIN 2    

iarduino_RTC time(RTC_DS1302, 5, 7, 6);   // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
DHT dht(DHTPIN, DHTTYPE);

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);
//iarduino_RTC time(RTC_DS1302, 5, 7, 6);   // Объявляем объект time для работы с RTC модулем на базе чипа DS1302, указывая выводы Arduino подключённые к выводам модуля RST, CLK, DAT
//DHT dht(DHTPIN, DHTTYPE);
// =======================================================================
void setup(void) {
  Serial.begin(9600);
    time.begin();
    
 dht.begin();
  //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;
String mesyc = " ";
// =======================================================================
void loop(void) {

  Serial.println(time.gettime("H:i")); // выводим время
  
  if(updCnt<=0) 
  { // каждые 10 циклов получаем данные времени и погоды
    updCnt = 1;
   time.gettime();
   dht.readHumidity();
  dht.readTemperature();
    clkTime = millis();
  }
  if(millis()-clkTime > 180000 && !del && dots) { //каждые 3 минуты/180000 сек запускаем бегущую строку
  //ScrollText(utf8rus("sampawno.ru!")); //тут текст строки
  ScrollText(utf8rus( mesyc + "влажность  " + dht.readHumidity()+ " % температура " + 
  dht.readTemperature()+ " `C ")); //тут текст температуры и давления
  updCnt--;
  clkTime = millis();
  }
  DisplayTime();
  if(millis()-dotTime > 500) {
    dotTime = millis();
    dots = !dots;
  }
}
// =======================================================================
void DisplayTime(){
   Serial.println(time.gettime("Hi")); // выводим время

               


    matrix.fillScreen(LOW);
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
   /*if(s & 1){matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);} //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
    else{matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);}  */
     matrix.drawPixel(15, 5, HIGH); // зажигаем пиксель с координатами {15,5}
    matrix.drawPixel(15, 2, HIGH); // зажигаем пиксель с координатами {15,2}
    matrix.drawPixel(16, 5, HIGH); // зажигаем пиксель с координатами {16,5}
    matrix.drawPixel(16, 2, HIGH); // зажигаем пиксель с координатами 16,2}
    matrix.write(); // вывод всех пикселей на матрицу
    delay(500);
    
   matrix.drawPixel(15, 5, LOW); // гасим пиксель
   matrix.drawPixel(15, 2, LOW); // гасим пиксель
   matrix.drawPixel(16, 2, LOW); // гасим пиксель
   matrix.drawPixel(16, 5, LOW); // гасим пиксель   
   matrix.write();
    delay(500);

  
 h = time.Hours;
 m = time.minutes;
    
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);
}
// =======================================================================
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(  dht.readTemperature(), 1)+" `С ";
  weatherString += " влаж.: " + String(mesyc + dht.readHumidity()) + " % ";
}
// =======================================================================
/*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 (i < k) {
    n = source[i]; i++;
    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30-1;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70-1;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
} 

Косяк  заключен в этом месте. Как его разрешить?

Тескст проги был честно скапитализден откуда-то с просторов сети и немного переделан под свои датчики.

void DisplayTime(){
   Serial.println(time.gettime("Hi")); // выводим время

               


    matrix.fillScreen(LOW);
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
   /*if(s & 1){matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);} //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
    else{matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);}  */
     matrix.drawPixel(15, 5, HIGH); // зажигаем пиксель с координатами {3,4}
    matrix.drawPixel(15, 2, HIGH); // зажигаем пиксель с координатами {3,4}
    matrix.drawPixel(16, 5, HIGH); // зажигаем пиксель с координатами {3,4}
    matrix.drawPixel(16, 2, HIGH); // зажигаем пиксель с координатами {3,4}
    matrix.write(); // вывод всех пикселей на матрицу
    delay(500);
    
   matrix.drawPixel(15, 5, LOW); // гасим пиксель
   matrix.drawPixel(15, 2, LOW); // гасим пиксель
   matrix.drawPixel(16, 2, LOW); // гасим пиксель
   matrix.drawPixel(16, 5, LOW); // гасим пиксель   
   matrix.write();
    delay(500);

  
 h = time.Hours;
 m = time.minutes;
    
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);
}

 

ven-til
Offline
Зарегистрирован: 13.02.2018

А бегущяя строка работает ок?

bibo
Offline
Зарегистрирован: 26.03.2018

да, работает нормально. я вроде как добился мигающих точек.

void DisplayTime(){
  
    h = time.Hours;
 m = time.minutes;
 second = time.seconds;
    matrix.fillScreen(LOW);
    int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали

    
      if(second & 1 ){matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);} 
    else if (second ++) {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.write();
   
}

ввел переменную, в которую записываются секунды и переделал цикл.

з.ы. крутая штука эта ардуина)только неделю назад для себя ее открыл.  жаль только, что си не знаю.

ven-til
Offline
Зарегистрирован: 13.02.2018

Надо проверить что выводит в сериал  hour1[0], hour2[0], min1[0], min2[0]

bibo
Offline
Зарегистрирован: 26.03.2018

в переменные h, m, second записываются числовые значения часов, минут и секунд(используется библиотека iarduino_rtc).

затем производятся преобразования этих переменных в другие переменные hour1[0], hour2[0], min1[0], min2[0] с целью получения необходимых значений.

hour1[0] выводит первую цифру часов, hour2[0] вторую цифру часов,min1[0] первую цифру минут, min2[0] вторую цифру минут.

matrix.drawChar каждую из этих цифр пишет по указанным координатам.

b707
Offline
Зарегистрирован: 26.05.2017

bibo пишет:

в переменные h, m, second записываются числовые значения часов, минут и секунд(используется библиотека iarduino_rtc).

затем производятся преобразования этих переменных в другие переменные hour1[0], hour2[0], min1[0], min2[0] с целью получения необходимых значений.

hour1[0] выводит первую цифру часов, hour2[0] вторую цифру часов,min1[0] первую цифру минут, min2[0] вторую цифру минут.

matrix.drawChar каждую из этих цифр пишет по указанным координатам.

bibo, это вы описали. как вам хотелось бы. чтоб работало. Но очевидно, что оно работает как-то не так - иначе вы б на форум не пришли.

Поэтому вас просят проверить - если вывести в Сериал значения hour1[0],  hour2[0] и тд - там будут правильные цифры или нет?

bibo
Offline
Зарегистрирован: 26.03.2018

 

выводит как и говорил)

Serial.println(time.gettime("H:i")) вывело 16:49,

Serial.println(hour1[0]);
Serial.println(hour2[0]);
Serial.println(min1[0]);
Serial.println(min2[0]);

вывело

1

6

4

9

bibo
Offline
Зарегистрирован: 26.03.2018

bibo
Offline
Зарегистрирован: 26.03.2018

bibo
Offline
Зарегистрирован: 26.03.2018

сорян, не сразу разобрался, как картинки прикреплять, нафлудил пустых сообщений.

b707
Offline
Зарегистрирован: 26.05.2017

bibo. понял, у вас все работает.

ven-til
Offline
Зарегистрирован: 13.02.2018

А вот так что выводит ?

Serial.println(byte(hour1[0]));
Serial.println(byte(hour2[0]));
Serial.println(byte(min1[0]));
Serial.println(byte(min2[0]));

bibo
Offline
Зарегистрирован: 26.03.2018
ven-til
Offline
Зарегистрирован: 13.02.2018

Все правильно. Все работает.

bibo
Offline
Зарегистрирован: 26.03.2018

если  выводить с byte, то получается, что вызываются значения из таблицы ascii, только почему-то со двигом