Проблемы по выводу информации на 7 сегментный дисплей

Тема в разделе "Arduino & Shields", создана пользователем PND, 18 мар 2017.

Метки:
  1. PND

    PND Нуб

    Приветствую! Подскажите пожалуйста.

    Пытаюсь вывести информацию (температуру) на 7 сегментный дисплей. Вот такой:
    [​IMG]
    Датчик температуры DHT11 в виде модуля на плате.
    [​IMG]

    Без дисплея датчик выдаёт нормальную информацию. Как добавляю дисплей, показания датчика начинают прыгать.
    [​IMG]

    Да и сам дисплей ведёт себя странно... То всё работает нормально, то начинают кракозябры бежать...

    [​IMG]

    В чём может быть проблема?

    Код (C++):
    #include "stDHT.h"
    #include "LedControl.h"
    DHT sens(DHT11);

    LedControl lc=LedControl(12,10,11,1);

    void setup()
    {
      Serial.begin(9600);
      pinMode(2, INPUT);
      digitalWrite(2, HIGH);

      lc.shutdown(0,false);
      lc.clearDisplay(0);
      lc.setIntensity(0,8);
    }

    void loop()
    {
      int t = sens.readTemperature(2); // чтение датчика на пине 2
      int h = sens.readHumidity(2);    // чтение датчика на пине 2
      delay(500);

      Serial.print("Humidity: ");
      Serial.print(h);
      Serial.print("% ");
      Serial.print("Temperature: ");
      Serial.print(t);
      Serial.println("C ");

      int t1 = t/10;
      int t2 = t-t1*10;
      lc.setDigit(0,3,t1,false);
      lc.setDigit(0,2,t2,false);
      lc.setRow(0,1,B1100011);
      lc.setRow(0,0,B1001110);
      delay(500);

    }

     
     
    Последнее редактирование: 18 мар 2017
  2. SergC4

    SergC4 Нуб

    Мда, походу не очень много кто работает с максами. Если ещё актуально: такой индикатор довольно много ест, попробуйте убавить яркость, так-же гдето читал что на этой панельке надо в обязательном порядке шунтировать керамический конденсатор на задней стороне (стоит по питанию) электролитом микрофарад на 220 хотя бы.
     
  3. user999

    user999 Гик

    Первый пин попробуйте сменить на другой
     
  4. SergC4

    SergC4 Нуб

    у меня другой вопрос по этому индикатору есть, допустим мне надо вывести на три разряда 50 условных едениц с десятыми долями, на АЦП загоняю с операционника 10 едениц на вольт а вот как показания на индикатор вытащить не понимаю вот эти строчки разжуйте пожалуйста как составляются
    int t1 = t/10;
    int t2 = t-t1*10;
    lc.setDigit(0,3,t1,false);
    lc.setDigit(0,2,t2,false);
    ну 0,2, понятно, т2 это десятки, т1 еденицы, а как десятые сделать? и как привязать значения? ткните носом в пример какойнить либо статью если не сложно
     
  5. qwone

    qwone Гик

    Tomasina и arkadyf нравится это.
  6. SergC4

    SergC4 Нуб

    Фигассе, я ардуинку пять дней назад включил впервые... попробую разобраться но читать надо много...
     
  7. qwone

    qwone Гик

    Ну а что делать. Или заниматься по взрослому, или быть вечным новичком.
    Код (C++):
    /**/
    // ------Cl_print------------------
    class Cl_print {
      protected:
      public:
        virtual write(char obj) = 0;
        void print(char *obj) {
          int len = strlen(obj);
          for (int i; i < len; ++i) write(obj[i]);
        }
        void print(int value, unsigned char base = 10) {
          char buf[18];
          itoa(value, buf, base);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(unsigned int value, unsigned char base = 10) {
          char buf[17];
          itoa(value, buf, base);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(long value, unsigned char base = 10) {
          char buf[34];
          ultoa(value, buf, base);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(unsigned long value, unsigned char base = 10) {
          char buf[33];
          ultoa(value, buf, base);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(float value, unsigned char decimalPlaces = 2) {
          char buf[33];
          dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(double value, unsigned char decimalPlaces = 2) {
          char buf[33];
          dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
    };
    //------Cl_canvas------------------
    // класс полотно
    class Cl_canvas: public Cl_print {
      protected:
        char *buff;
        unsigned int len;
        unsigned int pos;
      public:
        Cl_canvas(unsigned int len_ = 10): len(len_) {
          buff = new char[len + 1];
          clear();
        }
        ~Cl_canvas() {
          delete[]  buff;
        }
        //**
        virtual write(char obj) {
          if (obj == 0) return;
          if (pos < len) {
            buff[pos] = obj;
            ++pos;
          }
        }
        char read(unsigned int pos_) {
          if (0 <= pos_ && pos_ < len) return buff[pos_];
          else return ' ';
        }
        unsigned int readLen() {
          return len;
        }
        void setPos(unsigned int pos_) {
          if (0 <= pos_ && pos_ < len) pos = pos_;
          else pos = len;
        }
        void clear() {
          for (byte i = 0; i < len; ++i) buff[i] = ' ';
          buff[len] = 0;
          pos = 0;
        }
        void viev() {
          Serial.println(buff);
        }
    };
    //-------Cl_Max7219_8x7seg------------------------------------------
    // класс Cl_Max7219_8x7seg 8 семисегментных индикаторов на Max7219
    #define DECODEMODE_ADDR  9
    #define BRIGHTNESS_ADDR  10
    #define SCANLIMIT_ADDR   11
    #define SHUTDOWN_ADDR    12
    #define DISPLAYTEST_ADDR 15
    // знакогенератор
    const char Font[] PROGMEM = {
      0x00, 0xA0, 0x22, 0x00, 0x5B, 0x00, 0x00, 0x20, // !"#$%&' 0x20
      0x30, 0x06, 0x00, 0x00, 0x80, 0x01, 0x80, 0x25, //()*+,-./
      0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, //01234567 0x30
      0x7F, 0x7B, 0xA0, 0xA0, 0x31, 0x41, 0x07, 0x65, //89:;<=>?
      0x6E, 0x77, 0x1F, 0x4E, 0x3D, 0x4F, 0x47, 0x00, //@ABCDEFG 0x40
      0x37, 0x30, 0x38, 0x00, 0x0E, 0x15, 0x15, 0x7E, //HIJKLMNO
      0x67, 0xFE, 0x05, 0x5B, 0x0F, 0x3E, 0x27, 0x00, //PQRSTUVW 0x50
      0x00, 0x27, 0x6C, 0x4E, 0x13, 0x78, 0x40, 0x08, //XYZ[\]^_
      0x02, 0x77, 0x1F, 0x0D, 0x3D, 0x4F, 0x47, 0x73, //`abcdefg 0x60
      0x17, 0x10, 0x18, 0x00, 0x06, 0x15, 0x15, 0x1D, //hijklmno
      0x67, 0x73, 0x05, 0x5B, 0x0F, 0x1C, 0x1C, 0x1C, //pqrstuvw 0x70
      0x00, 0x00, 0x6C, 0x31, 0x30, 0x07, 0x01, 0x00, //xyz{|}~del
    };
    char toSing(byte ansi) {
      if (0x20 <= ansi && ansi <= 0x7F)
        return pgm_read_byte_near(Font + ansi - 0x20);
      return 0x20;
    }
    class Cl_Max7219_8x7seg {
        const byte dinPin;
        const byte csPin;
        const byte clkPin;
      public:
        Cl_canvas canvas;
        //** конструктор
        Cl_Max7219_8x7seg(byte _dinPin, byte _csPin, byte _clkPin)
          : dinPin(_dinPin), csPin (_csPin), clkPin (_clkPin), canvas(8) {
          pinMode(dinPin, OUTPUT);
          pinMode(csPin, OUTPUT);
          pinMode(clkPin, OUTPUT);
          digitalWrite(csPin, HIGH);
        }
        void setup() {
          setBright(10);
          transfer(DISPLAYTEST_ADDR, 0);
          transfer(SCANLIMIT_ADDR, 7);
          transfer(DECODEMODE_ADDR, 0);
          canvas.clear();
          show();
        }
        void setBright(byte bright) {
          transfer(BRIGHTNESS_ADDR, bright & 0x0F);
        }
        void show() {
          off();
          for (byte i = 0; i < 8; ++i) {
            char aaa = canvas.read(i);
            transfer(8 - i, toSing(aaa));
          }
          on();
        }
        void transfer(byte com, byte data) {
          digitalWrite(csPin, LOW);
          for (byte i = 0; i < 8; ++i)  {
            digitalWrite(dinPin, !!(com & (0x80 >> i)));
            digitalWrite(clkPin, HIGH);
            digitalWrite(clkPin, LOW);
          }
          for (byte i = 0; i < 8; ++i)  {
            digitalWrite(dinPin, !!(data & (0x80 >> i)));
            digitalWrite(clkPin, HIGH);
            digitalWrite(clkPin, LOW);
          }
          digitalWrite(csPin, HIGH);
        }
        void on() {
          transfer(SHUTDOWN_ADDR, 0x01);
        }
        void off() {
          transfer(SHUTDOWN_ADDR, 0x00);
        }
    };
    //------------------------
    Cl_Max7219_8x7seg ld(/*DIN*/2,/*CS*/ 3,/*CLK*/4);
    //------------------------
    int main() {
      init();
      //setup()
      Serial.begin(9600);
      ld.setup();
      ld.canvas.print("89:;<=>?" );// напечатать
      ld.canvas.viev();//отправить вид в Serial
      ld.show();//отправить вид на дисплей
      for (;;) {
        //loop()
      }
      return 0;
    }
    /*Скетч использует 3144 байт (9%) памяти устройства. Всего доступно 32256 байт.
      Глобальные переменные используют 221 байт (10%) динамической памяти, оставляя 1827 байт для локальных переменных. Максимум: 2048 байт.
    */
     
    arkadyf нравится это.
  8. qwone

    qwone Гик

    А этим кодом я рисовал знакогенератор
    Код (C++):
    //**/
    unsigned long mill;
    // ------Cl_print------------------
    class Cl_print {
      protected:
      public:
        virtual write(char obj) = 0;
        void print(char *obj) {
          int len = strlen(obj);
          for (int i; i < len; ++i) write(obj[i]);
        }
        void print(int value, unsigned char base = 10) {
          char buf[18];
          itoa(value, buf, base);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(unsigned int value, unsigned char base = 10) {
          char buf[17];
          itoa(value, buf, base);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(long value, unsigned char base = 10) {
          char buf[34];
          ultoa(value, buf, base);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(unsigned long value, unsigned char base = 10) {
          char buf[33];
          ultoa(value, buf, base);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(float value, unsigned char decimalPlaces = 2) {
          char buf[33];
          dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
        void print(double value, unsigned char decimalPlaces = 2) {
          char buf[33];
          dtostrf(value, (decimalPlaces + 2), decimalPlaces, buf);
          int len = strlen(buf);
          for (int i; i < len; ++i) write(buf[i]);
        }
    };
    //------Cl_canvas------------------
    // класс полотно
    class Cl_canvas: public Cl_print {
      protected:
        char *buff;
        unsigned int len;
        unsigned int pos;
      public:
        Cl_canvas(unsigned int len_ = 10): len(len_) {
          buff = new char[len + 1];
          clear();
        }
        ~Cl_canvas() {
          delete[]  buff;
        }
        //**
        virtual write(char obj) {
          if (obj == 0) return;
          if (pos < len) {
            buff[pos] = obj;
            ++pos;
          }
        }
        char read(unsigned int pos_) {
          if (0 <= pos_ && pos_ < len) return buff[pos_];
          else return ' ';
        }
        unsigned int readLen() {
          return len;
        }
        void setPos(unsigned int pos_) {
          if (0 <= pos_ && pos_ < len) pos = pos_;
          else pos = len;
        }
        void clear() {
          for (byte i = 0; i < len; ++i) buff[i] = ' ';
          buff[len] = 0;
          pos = 0;
        }
        void viev() {
          Serial.println(buff);
        }
    };
    //-------Cl_Max7219_8x7seg------------------------------------------
    // класс Cl_Max7219_8x7seg 8 семисегментных индикаторов на Max7219
    #define DECODEMODE_ADDR  9
    #define BRIGHTNESS_ADDR  10
    #define SCANLIMIT_ADDR   11
    #define SHUTDOWN_ADDR    12
    #define DISPLAYTEST_ADDR 15
    /*функция     toSing
      описание    конвертировать с ANSI2 в знак
      ввод        ansi: код в ANSI2
      вывод       знак
    */

    // знакогенератор
    const char Font[] PROGMEM = {
      0x00, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, //
      0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, //
      0x7E, 0x30, 0x6D, 0x79, 0x33, 0x5B, 0x5F, 0x70, //01234567
      0x7F, 0x7B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //89abcdef
    };
    char toSing(byte ansi) {
      if (0x20 <= ansi && ansi <= 0x3F)
        return pgm_read_byte_near(Font + ansi - 0x20);
      return 0x20;
    }
    class Cl_Max7219_8x7seg {
        const byte dinPin;
        const byte csPin;
        const byte clkPin;
      public:
        Cl_canvas canvas;
        /*функция     Cl_Max7219_8x7seg
          описание    создать объект
          ввод        _dinPin:пин данных
                      _dinPin:пин CS
                      _dinPin:пин CLK
          вывод       нет
        */

        Cl_Max7219_8x7seg(byte _dinPin, byte _csPin, byte _clkPin)
          : dinPin(_dinPin), csPin (_csPin), clkPin (_clkPin), canvas(8) {
          pinMode(dinPin, OUTPUT);
          pinMode(csPin, OUTPUT);
          pinMode(clkPin, OUTPUT);
          digitalWrite(csPin, HIGH);
        }
        /*функция     setup
          описание    инициализация экрана
          ввод        нет
          вывод       нет
        */

        void setup() {
          setBright(10);
          transfer(DISPLAYTEST_ADDR, 0);
          transfer(SCANLIMIT_ADDR, 7);
          transfer(DECODEMODE_ADDR, 0);
          //clear();
          show();
        }
        /*функция     setBright
          описание    установить яркость экрана
          ввод        bright:яркость 0-15
          вывод       нет
        */

        void setBright(byte bright) {
          transfer(BRIGHTNESS_ADDR, bright & 0x0F);
        }
        /*функция     show
          описание    вывести буфер на экран
          ввод        нет
          вывод       нет
        */

        void show() {
          off();
          for (byte i = 0; i < 8; ++i) {
            char aaa = canvas.read(i);
            transfer(8 - i, toSing(aaa));
          }
          on();
        }
        /*функция     transfer
          описание    отправить команду
          ввод        com: команда
                      data: данные
          вывод       нет
        */

        void transfer(byte com, byte data) {
          digitalWrite(csPin, LOW);
          for (byte i = 0; i < 8; ++i)  {
            digitalWrite(dinPin, !!(com & (0x80 >> i)));
            digitalWrite(clkPin, HIGH);
            digitalWrite(clkPin, LOW);
          }
          for (byte i = 0; i < 8; ++i)  {
            digitalWrite(dinPin, !!(data & (0x80 >> i)));
            digitalWrite(clkPin, HIGH);
            digitalWrite(clkPin, LOW);
          }
          digitalWrite(csPin, HIGH);
        }
        /*функция     on
          описание    включить дисплей
          ввод        нет
          вывод       нет
        */

        void on() {
          transfer(SHUTDOWN_ADDR, 0x01);
        }
        /*функция     off
          описание    выключить дисплей
          ввод        нет
          вывод       нет
        */

        void off() {
          transfer(SHUTDOWN_ADDR, 0x00);
        }
    };
    //------Cl_Btn----------------------
    // класс кнопка
    class Cl_Btn {
      protected:
        const byte pin;
        void (*Do)();
        bool bounce = 0;
        bool btn = 1, oldBtn;
        unsigned long past;
      public:
        Cl_Btn(byte pin_, void (*Do_)()): pin(pin_), Do(Do_) {}
        void setup() {
          pinMode(pin, INPUT_PULLUP);
        }
        void loop() {
          bool newBtn = digitalRead(pin);
          if (!bounce && newBtn != btn) {
            bounce = 1;
            past = mill;
          }
          if (bounce && mill - past >= 10) {
            bounce = 0 ;
            oldBtn = btn;
            btn = newBtn;
            if (!btn && oldBtn) (*Do)();
          }
        }
    };
    //-----компоновка----------------------
    byte data;
    Cl_Max7219_8x7seg ld(/*DIN*/2,/*CS*/ 3,/*CLK*/4);
    void DoBtn1() {
      ld.transfer(1, data ^= 1);
      Serial.println(data, HEX);
    }
    void DoBtn2() {
      ld.transfer(1, data ^= 1 << 1);
      Serial.println(data, HEX);
    }
    void DoBtn3() {
      ld.transfer(1, data ^= 1 << 2);
      Serial.println(data, HEX);
    }
    void DoBtn4() {
      ld.transfer(1, data ^= 1 << 3);
      Serial.println(data, HEX);
    }
    void DoBtn5() {
      ld.transfer(1, data ^= 1 << 4);
      Serial.println(data, HEX);
    }
    void DoBtn6() {
      ld.transfer(1, data ^= 1 << 5);
      Serial.println(data, HEX);
    }
    void DoBtn7() {
      ld.transfer(1, data ^= 1 << 6);
      Serial.println(data, HEX);
    }
    void DoBtn8() {
      ld.transfer(1, data ^= 1 << 7);
      Serial.println(data, HEX);
    }
    Cl_Btn Btn1(/*пин*/5,/*обработчик*/DoBtn1);
    Cl_Btn Btn2(/*пин*/6,/*обработчик*/DoBtn2);
    Cl_Btn Btn3(/*пин*/7,/*обработчик*/DoBtn3);
    Cl_Btn Btn4(/*пин*/8,/*обработчик*/DoBtn4);
    Cl_Btn Btn5(/*пин*/9,/*обработчик*/DoBtn5);
    Cl_Btn Btn6(/*пин*/10,/*обработчик*/DoBtn6);
    Cl_Btn Btn7(/*пин*/11,/*обработчик*/DoBtn7);
    Cl_Btn Btn8(/*пин*/12,/*обработчик*/DoBtn8);
    //-----main-----------------------
    int main() {
      init();
      // setup()
      Serial.begin(9600);
      ld.setup();
      Btn1.setup();
      Btn2.setup();
      Btn3.setup();
      Btn4.setup();
      Btn5.setup();
      Btn6.setup();
      Btn7.setup();
      Btn8.setup();
      for (;;) {
        // loop()
        mill = millis();
        Btn1.loop();
        Btn2.loop();
        Btn3.loop();
        Btn4.loop();
        Btn5.loop();
        Btn6.loop();
        Btn7.loop();
        Btn8.loop();
      }
      return 0;
    }
    /*Скетч использует 4040 байт (12%) памяти устройства. Всего доступно 32256 байт.
      Глобальные переменные используют 298 байт (14%) динамической памяти, оставляя 1750 байт для локальных переменных. Максимум: 2048 байт.
    */
     
    arkadyf нравится это.
  9. ostrov

    ostrov Гуру

    Код не смотрел, но с этим индикатором дело имел. Он капризный. Чуть где контакт качается и глюки на весь экран. Не люблю его.
     
  10. qwone

    qwone Гик

    [​IMG] Только так надо делать самоделки. А иначе глюков будет точно много.