Как выводить показания dht11 на max7219 матрицу 8*8?

Тема в разделе "Arduino & Shields", создана пользователем Manulich, 5 май 2020.

  1. Manulich

    Manulich Нуб

    Есть задача выводить бегущей строкой на матрицу 8*8 показания с DHT11, на русском. и вроде бы разобрался, НО когда написал скетч вывода по нажатию кнопки выдаёт ошибку. Я выкручивался как мог, но теперь упёрся в тупик.
    скетч
    Код (C++):
    #include <iarduino_DHT.h>
    #include <SPI.h>                             // Подключаем библиотеку SPI
    #include <Adafruit_GFX.h>                    // Подключаем библиотеку Adafruit_GFX
    #include <Max72xxPanel.h>                    // Подключаем библиотеку Max72xxPanel
    int pinCS = 9;                               // Указываем к какому выводу подключен контакт CS
    int numberOfHorizontalDisplays = 1;          // Количество матриц по горизонтали
    int numberOfVerticalDisplays = 4;            // Количество матриц по-вертикали

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

    String tape = "";
    int wait = 100;                             // интервал, чем меньше тем бытрее бежит строка
    int spacer = 1;                             // Промежуток между символами (кол-во точек)
    int width = 5 + spacer;                     // Ширина шрифта составляет 5 пикселей
    iarduino_DHT sensor(4);



    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;
    }


    void setup() {
      pinMode(2, INPUT_PULLUP);
      pinMode(3, INPUT_PULLUP);
      pinMode(4, INPUT_PULLUP);
      pinMode(5, INPUT_PULLUP);
      tape = utf8rus("ДАРОВА");
      matrix.setIntensity(5);                    // Задаем яркость от 0 до 15
      matrix.setRotation(3);                     // Направление текста 1,2,3,4

    }

    void loop() {
      switch(sensor.read()){  // Читаем показания датчика
      if (digitalRead(2) == 1){
        tape = utf8rus("ТЕМПЕРАТУРА = " (sensor.tem) "ВЛАЖНОСТЬ " (sensor.hum));           // Считываем и сохроняе в переменную
       
       
      }


     
    for ( int i = 0 ; i < width * tape.length() + matrix.width() - 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);
      }
    }
    }

    /* Функция перекодировки русских букв из UTF-8 в Win-1251 */
    ошибка
    Код (C++):
    C:\Users\User71\Documents\Arduino\tamagohci_dla_TRU\tamagohci_dla_TRU.ino: In function 'void loop()':

    tamagohci_dla_TRU:70:57: error: expression cannot be used as a function

         tape = utf8rus("ТЕМПЕРАТУРА " (sensor.tem) "ВЛАЖНОСТЬ " (sensor.hum));           // Считываем и сохроняе в переменную

                                                             ^

    Несколько библиотек найдено для "iarduino_DHT.h"
    Используется: C:\Users\User71\Documents\Arduino\libraries\iarduino_DHT-master
    Несколько библиотек найдено для "SPI.h"
    Используется: C:\Program
    Несколько библиотек найдено для "Adafruit_GFX.h"
    Используется: C:\Users\User71\Documents\Arduino\libraries\Adafruit_GFX_Library
    Несколько библиотек найдено для "Max72xxPanel.h"
    Используется: C:\Users\User71\Documents\Arduino\libraries\arduino-Max72xxPanel-master
    exit status 1
    expression cannot be used as a function

     
    Помогите пожалуйста.
     
  2. NikitOS

    NikitOS Король шутов Администратор

    Что если перевести?

    Чтобы сделать строку из нескольких или добавить переменную, нужно часть соединять знаком «+»:
    Код (Text):
    tape = utf8rus("ТЕМПЕРАТУРА " + (sensor.tem) + "ВЛАЖНОСТЬ " + (sensor.hum));
     
  3. Manulich

    Manulich Нуб

    появилась другая ошибка
    Код (C++):
    C:\Users\User71\Documents\Arduino\tamagohci_dla_TRU\tamagohci_dla_TRU.ino: In function 'void loop()':

    tamagohci_dla_TRU:70:34: error: could not convert '(sensor.iarduino_DHT::tem + sensor.iarduino_DHT::hum)' from 'float' to 'String'

          tape = utf8rus((sensor.tem) + (sensor.hum));           // Считываем и сохроняе в переменную

                         ~~~~~~~~~~~~~^~~~~~~~~~~~~~

    Несколько библиотек найдено для "Max72xxPanel.h"
    Используется: C:\Users\User71\Documents\Arduino\libraries\arduino-Max72xxPanel-master
    Несколько библиотек найдено для "iarduino_DHT.h"
    Используется: C:\Users\User71\Documents\Arduino\libraries\iarduino_DHT-master
    Несколько библиотек найдено для "SPI.h"
    Используется: C:\Program
    Несколько библиотек найдено для "Adafruit_GFX.h"
    Используется: C:\Users\User71\Documents\Arduino\libraries\Adafruit_GFX_Library
    exit status 1
    could not convert '(sensor.iarduino_DHT::tem + sensor.iarduino_DHT::hum)' from 'float' to 'String'
     
  4. NikitOS

    NikitOS Король шутов Администратор

    Вы конвертируете два числа типа float в String, а так нельзя. Вы хотите получить что-то вроде "23.24 45.56"?
    Я бы сделал так:
    Код (Text):
    tape = utf8rus("" + sensor.tem + "°C " + sensor.hum + "%");
     
  5. Manulich

    Manulich Нуб

    не помогло, я так понимаю он считает что я хочу сложить строки. пробовал выводить только значение температуры, пишет что не может конвертировать float в string. что с этим делать то?
     
  6. NikitOS

    NikitOS Король шутов Администратор

    Обернуть sensor.tem и sensor.hum в String()
     
  7. b707

    b707 Гуру

    разобраться наконец, чем отличается string от String. Это. чтоб вы знали, кардинально разные вещи