Нужна помощь. Собрал часы с термометром, все прекрасно работает. Но не могу понять как вывести на 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); }
Я разобрался, все работает, вот код пользуйтесь) Код (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); }