Приветствую! Подскажите пожалуйста. Пытаюсь вывести информацию (температуру) на 7 сегментный дисплей. Вот такой: Датчик температуры DHT11 в виде модуля на плате. Без дисплея датчик выдаёт нормальную информацию. Как добавляю дисплей, показания датчика начинают прыгать. Да и сам дисплей ведёт себя странно... То всё работает нормально, то начинают кракозябры бежать... В чём может быть проблема? Код (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); }
Мда, походу не очень много кто работает с максами. Если ещё актуально: такой индикатор довольно много ест, попробуйте убавить яркость, так-же гдето читал что на этой панельке надо в обязательном порядке шунтировать керамический конденсатор на задней стороне (стоит по питанию) электролитом микрофарад на 220 хотя бы.
у меня другой вопрос по этому индикатору есть, допустим мне надо вывести на три разряда 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 еденицы, а как десятые сделать? и как привязать значения? ткните носом в пример какойнить либо статью если не сложно
Ну а что делать. Или заниматься по взрослому, или быть вечным новичком. Спойлер: немного доработал код Код (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 байт. */
А этим кодом я рисовал знакогенератор Спойлер: код Код (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 байт. */
Код не смотрел, но с этим индикатором дело имел. Он капризный. Чуть где контакт качается и глюки на весь экран. Не люблю его.