Arduino Uno+DHT11+RTC1307+MAX7219 (часы с термометром)

Тема в разделе "Arduino & Shields", создана пользователем Vladimir75rus, 5 июн 2018.

  1. Vladimir75rus

    Vladimir75rus Нерд

    Нужна помощь.
    Собрал часы с термометром, все прекрасно работает. Но не могу понять как вывести на MAX7219 заставку "Приятного использования".
    Пробовал добавлять в void setup строчку <<tape = utf8rus("Приятного использования");>>, но ничего не получается.
    Вот скетч
    Код (C++):
    #include <Wire.h>
    #include "RTClib.h"
    RTC_DS1307 RTC;
    #include <SPI.h>
    #include <Adafruit_GFX.h>
    #include <Max72xxPanel.h>
    //***************
    #include <iarduino_DHT.h>   // подключаем библиотеку для работы с датчиком DHT
    iarduino_DHT sensor(2);     // объявляем  переменную для работы с датчиком DHT, указывая номер цифрового вывода к которому подключён датчик (сейчас 2pin)
    //***************
    int pinCS = 9; // DIN 11, CLK 13
    int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
    int numberOfVerticalDisplays = 8;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

    Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

    String tape = "";
    int wait = 75; // время в миллисекундах

    int spacer = 1; // Промежуток между символами (кол-во точек)
    int width = 5 + spacer; // Ширина шрифта 5 пикселей

    /* Перекодировать русские шрифты из UTF-8 в Windows-1251 */

    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 + 0x2F;
              break;
            }
            case 0xD1: {
              n = source[i]; i++;
              if (n == 0x91) { n = 0xB7; break; }
              if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
              break;
            }
          }
        }
        m[0] = n; target = target + String(m);
      }
    return target;
    }

    String Serial_Read() {
      unsigned char c; // переменная для чтения сериал порта
      String Serial_string = ""; // Формируемая из символов строка
      while (Serial.available() > 0) { // Если в сериал порту есть символы
        c = Serial.read(); // Читаем символ
        //Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
        if (c == '\n') {  // Если это конец строки
              return Serial_string; // Возвращаем строку
        }
        if (c == 0xB8) c = c - 0x01;  // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
        if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
        Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
      }
      return Serial_string;
    }
    //*ПЕРЕМЕНЫЕ
    //**********************************


    //**********************************

    void setup() {
      Serial.begin(9600);
      Wire.begin();

    RTC.begin();

    if (! RTC.isrunning()) {

    Serial.println("RTC is NOT running!");

    // строка ниже используется для настройки даты и времени часов

    // RTC.adjust(DateTime(__DATE__, __TIME__));

    }
    delay(1000);              // выполняем задержку для перехода датчика в активное состояние
      matrix.setIntensity(6); // Используйте значение между 0 и 15 для яркости
      matrix.setRotation(1); //развернуть строку 1 - 90, 2 - 180, 3 - 270


    }
    void loop() {
      DateTime now = RTC.now();



    // выводим дару и время

    DateTime future (now.unixtime() ); // читаем показания часов


    switch(sensor.read()){    // читаем показания датчика

      }

      // сдесь в зависимости от перменых на матрицу выводится нужная строка
    tape = utf8rus((String)+"Время "+future.hour()+":"+future.minute()+" Дата "+future.year()+"/"+future.month()+"/"+future.day()+" Температура "+sensor.tem +"`C, Влажность "+sensor.hum+"%");
      if (Serial.available()){
        tape=Serial_Read();
      }
      for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
           {
        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 < tape.length() ) {
            matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
          }
          letter--;
          x -= width;
        }

        matrix.write(); // Отправить картинку для отображения
        delay(wait);
      }
    //delay(2000);
    }
     
  2. Vladimir75rus

    Vladimir75rus Нерд

    Я разобрался, все работает, вот код пользуйтесь)
    Код (C++):
    #include <Wire.h>
    #include "RTClib.h"
    RTC_DS1307 RTC;
    #include <SPI.h>
    #include <Adafruit_GFX.h>
    #include <Max72xxPanel.h>
    //***************
    #include <iarduino_DHT.h>   // подключаем библиотеку для работы с датчиком DHT
    iarduino_DHT sensor(2);     // объявляем  переменную для работы с датчиком DHT, указывая номер цифрового вывода к которому подключён датчик (сейчас 2pin)
    //***************
    int pinCS = 9; // DIN 11, CLK 13
    int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
    int numberOfVerticalDisplays = 8;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

    Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);

    String tape = "";
    int wait = 75; // время в миллисекундах

    int spacer = 1; // Промежуток между символами (кол-во точек)
    int width = 5 + spacer; // Ширина шрифта 5 пикселей

    /* Перекодировать русские шрифты из UTF-8 в Windows-1251 */

    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 + 0x2F;
              break;
            }
            case 0xD1: {
              n = source[i]; i++;
              if (n == 0x91) { n = 0xB7; break; }
              if (n >= 0x80 && n <= 0x8F) n = n + 0x6F;
              break;
            }
          }
        }
        m[0] = n; target = target + String(m);
      }
    return target;
    }

    String Serial_Read() {
      unsigned char c; // переменная для чтения сериал порта
      String Serial_string = ""; // Формируемая из символов строка
      while (Serial.available() > 0) { // Если в сериал порту есть символы
        c = Serial.read(); // Читаем символ
        //Serial.print(c,HEX); Serial.print(" "); Serial.print(c);
        if (c == '\n') {  // Если это конец строки
              return Serial_string; // Возвращаем строку
        }
        if (c == 0xB8) c = c - 0x01;  // Коррекция кодов символа под таблицу ???? так как русские символы в таблице сдвинуты относительно стандартной кодировки utf на 1 символ
        if (c >= 0xBF && c <= 0xFF) c = c - 0x01;
        Serial_string = Serial_string + String(char(c)); //Добавить символ в строку
      }
      return Serial_string;
    }
    //*ПЕРЕМЕНЫЕ
    //**********************************


    //**********************************

    void setup() {
      Serial.begin(9600);
      Wire.begin();

    RTC.begin();

    if (! RTC.isrunning()) {

    Serial.println("RTC is NOT running!");

    // строка ниже используется для настройки даты и времени часов

    // RTC.adjust(DateTime(__DATE__, __TIME__));

    }
    delay(1000);              // выполняем задержку для перехода датчика в активное состояние

      matrix.setIntensity(7); // Используйте значение между 0 и 15 для яркости
      matrix.setRotation(1); //развернуть строку 1 - 90, 2 - 180, 3 - 270

      tape = utf8rus("Приветствую вас, приятного использования"); // здесь вы пишите любой текст который вам нужно вывести в начале для приветствия

    if (Serial.available()){
        tape=Serial_Read();
      }
      for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
           {
        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 < tape.length() ) {
            matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
          }
          letter--;
          x -= width;
        }

        matrix.write(); // Отправить картинку для отображения
        delay(wait);
      }
    //delay(1000);
    }

    void loop() {
      DateTime now = RTC.now();

    // выводим дару и время

    DateTime future (now.unixtime() ); // читаем показания часов


    switch(sensor.read()){    // читаем показания датчика

      }

      // сдесь в зависимости от перменых на матрицу выводится нужная строка
    tape = utf8rus((String)+"Время "+future.hour()+":"+future.minute()+" Дата "+future.year()+"/"+future.month()+"/"+future.day()+" Температура "+sensor.tem +"`C, Влажность "+sensor.hum+"%");


      if (Serial.available()){
        tape=Serial_Read();
      }
      for ( int i = 0 ; i < width * tape.length() + matrix.width() - 1 - spacer; i++ )
           {
        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 < tape.length() ) {
            matrix.drawChar(x, y, tape[letter], HIGH, LOW,1);
          }
          letter--;
          x -= width;
        }

        matrix.write(); // Отправить картинку для отображения
        delay(wait);
      }
    //delay(2000);
    }
     
    arkadyf нравится это.