matrix.drawChar && max7219

Тема в разделе "Arduino & Shields", создана пользователем bibo, 26 мар 2018.

  1. bibo

    bibo Нерд

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

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

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

    Код (C++):
    #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( mesyc + "влажность  " + dht.readHumidity()+ " % температура " +
      dht.readTemperature()+ " `C ")); //тут текст температуры и давления
      updCnt--;
      clkTime = millis();
      }
      DisplayTime();
      if(millis()-dotTime > 500) {
        dotTime = millis();
        dots = !dots;
      }
    }
    // =======================================================================
    void DisplayTime(){
       Serial.println(time.gettime("H : i")); // выводим время

                 


        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, h, HIGH, LOW, 1);
        matrix.drawChar(xh+6, y, m, 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;
    }

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

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

    Код (C++):
    void DisplayTime(){
       Serial.println(time.gettime("H : i")); // выводим время

                 


        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, h, HIGH, LOW, 1);
        matrix.drawChar(xh+6, y, m, HIGH, LOW, 1);
        matrix.drawChar(xm, y, min1[0], HIGH, LOW, 1);
        matrix.drawChar(xm+6, y, min2[0], HIGH, LOW, 1);
    }
     
    Последнее редактирование: 26 мар 2018
  2. bibo

    bibo Нерд

    забыл matrix.write();:)
    теперь время отображается, проблема только в том, как с помощью этой библиотеки сделать мигающие точки одновременно со статическим выводом времени. в скетче вроде бы есть варианты(draw.pixel не работает как надо), а
    Код (C++):
    /*if(s & 1){matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1);} //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
        else{matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);}  */
    вообще не хочет ничего отображать.
    как сделать мигающие точки?
     
  3. bibo

    bibo Нерд

    в общем, сделал так
    Код (C++):
    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;


     

          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();
     
    }
    Вроде бы работает...
     
    Vladimir75rus нравится это.
  4. Прекрасно!