светодиодная матрица на MAX7219 базе Max72xxPanel создаем бегущую строку с помощью переменных.

shapkin
Offline
Зарегистрирован: 17.10.2016

здарово народ! как то раз нужно было быстро сделать бегущую строкку на светодиодеой матрице MAX7219 на руском языке и с возможностью отображения заначения разных переменых. перерыл вес инет не чего подобного не нашел, если что и было то все какоето карявое. единственый нормально работающий код для отображения русского шрифта я нашел на этом форуме.   http://arduino.ru/forum/programmirovanie/led-matritsa-max7219-maxmatrixlib базы можно скачать там же. я немного над ним поработал и все что мне было нужно получилось и решил викинуть сюда, может каму пригодится.

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>


int pinCS = 10; // DIN 11, CLK 13 
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
int numberOfVerticalDisplays = 4;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

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

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

int spacer = 2; // Промежуток между символами (кол-во точек)
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; // Возвращаем строку 
    }
    //* ВНЕКОТОРЫХ КОМИЛЯТОРАХ АРДУИНО ЭТОТ КОД НУЖЕН, НАПРИМЕР В 1.0.3 СДВИГАТЬ СИМВОЛ НУЖНО, А В 1.6.7 УЖЕ НЕТ.
    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; 
}
//*ПЕРЕМЕНЫЕ
//**********************************
int stroka = 0;//переменая строки
String peremenay1 = "20 ";
String peremenay2 = "75 ";
String peremenay3 = "24 ";
String peremenay4 = "переменая4";
//**********************************

void setup() {
  Serial.begin(9600);
  
  matrix.setIntensity(1); // Используйте значение между 0 и 15 для яркости
  matrix.setRotation(matrix.getRotation()+3); //развернуть строку 1 - 90, 2 - 180, 3 - 270
 
}
void loop() {
  // сдесь в зависимости от перменых на матрицу выводится нужная строка
  if (stroka == 0) {
  tape = utf8rus(" первая сторка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
  
   }
  if (stroka == 1) {
  tape = utf8rus("вторая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
 }
 if (stroka == 2) {
  tape = utf8rus("третья строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
 }
 if (stroka== 3) {
  tape = utf8rus("четвертая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
 }
 if (stroka == 4) {
  tape = utf8rus("пятая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
 }
stroka += 1;
if (stroka == 5) {
  stroka = 0;
 }
  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);
  }
 
}

 

shapkin
Offline
Зарегистрирован: 17.10.2016

Вот спомощю этого кода вывел даные с DHT-11 на светодиодную матрицу.



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

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

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

int spacer = 2; // Промежуток между символами (кол-во точек)
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; 
}
//*ПЕРЕМЕНЫЕ
//**********************************

String mesyc = " ";
//**********************************

void setup() {
  Serial.begin(9600);
delay(1000);              // выполняем задержку для перехода датчика в активное состояние
  matrix.setIntensity(1); // Используйте значение между 0 и 15 для яркости
  matrix.setRotation(matrix.getRotation()+3); //развернуть строку 1 - 90, 2 - 180, 3 - 270
 
}
void loop() {
 switch(sensor.read()){    // читаем показания датчика
   case DHT_OK:               Serial.println((String) "CEHCOP B KOMHATE: " + sensor.hum + "% - " + sensor.tem + "*C");  break;
    case DHT_ERROR_CHECKSUM:   Serial.println(         "CEHCOP B KOMHATE: HE PABEHCTBO KC");                     break;
    case DHT_ERROR_DATA:       Serial.println(         "CEHCOP B KOMHATE: OTBET HE COOTBETCTB. CEHCOPAM 'DHT'"); break;
   case DHT_ERROR_NO_REPLY:   Serial.println(         "CEHCOP B KOMHATE: HET OTBETA");                          break;
    default:                   Serial.println(         "CEHCOP B KOMHATE: ERROR");                               break;
   
  }
  
  // сдесь в зависимости от перменых на матрицу выводится нужная строка
 
 tape = utf8rus(mesyc +" температура "+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);
}

правда в строке 

 tape = utf8rus(mesyc +" температура "+sensor.tem +"`C, влажность "+sensor.hum+"%");

сначала должна быть переменая String и наче выдает ошибку

invalid operands of types 'const char [25]' and 'float' to binary 'operator+'

возможно каким то образом надо преобразовывать переменые float в String, кроме этого косяка все остальное норм, работает. библиотеку скачал сдесь http://iarduino.ru/file/225.html

вот видео.

https://www.youtube.com/watch?v=ioPhjgSu68E

shapkin
Offline
Зарегистрирован: 17.10.2016
здарово народ.  наконец то пришли мои часы  ds1307 и сразу
 решил собрать часы на светодиодной матрице MAX7219 
и датчике влажности DHT-11 и что бы все отображалось с русским шрифтом.
соединил все так.
 
вот код

#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 = 10; // DIN 11, CLK 13 
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
int numberOfVerticalDisplays = 8;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

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

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

int spacer = 2; // Промежуток между символами (кол-во точек)
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(matrix.getRotation()+3); //развернуть строку 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);
}

вот видео

https://youtu.be/xwNt9NwN_Io

сейчес жду индикатор на TM1637 и свето диоды. на основе этого железа хочу собрать большой 4-разрядный 7-сегментный  индикатор и тогда проект будет готов.

 

msng
Offline
Зарегистрирован: 07.06.2012

здорово!!! подпишусь на темку, тоже получил матрицы, буду делать в подарок часы.

ранее брал отдельные индикаторы без регистров, плату под них разводил, травил, больно много мороки....

тут прислали, за вечер подключил, русифицировал, ваще красота...

Спасибо!!!

shapkin
Offline
Зарегистрирован: 17.10.2016

Ура мне пришел мой индикатор TM1637. наконец то я смог закончить свой проект часов.

большой 4 разрядный 7сегментный индикатор я собрал на 130 светодиодах, вот так

 

с плато TM1637 я снял маленький индикатор и на его место припаял ножки, свой индикатор подсоединил по этой схеме.

все железо к ардуино подсоединил вот так.

блок питания взял от TP-LINK 9 вольт  800 микроампер.

вот код

#include <Wire.h>
#include "TM1637.h"  // http://www.seeedstudio.com/wiki/File:DigitalTube.zip
#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)
//***************
 // 7сигментный индикатор
#define CLK 6         
#define DIO 7 
#define brightness 7  // яркость, от 0 до 7

    // кнопки
#define keyHor 5
#define keyMin 4 
#define keyPL  3

TM1637 tm1637(CLK,DIO);  
#define DS3231_I2C_ADDRESS 0x68
  
volatile boolean flag;

///// часы ..
byte decToBcd(byte val){
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}
//***************
int pinCS = 10; // DIN 11, CLK 13 
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
int numberOfVerticalDisplays = 8;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

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

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

int spacer = 2; // Промежуток между символами (кол-во точек)
int width = 5 + spacer; // Ширина шрифта 5 пикселей
int led = 8;// точка
/* Перекодировать русские шрифты из 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 setDateDs3231(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS3231_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs3231(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}

void setINT(){    //включает выход SQW, который вроде выключен по умолчанию
 Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x0E);
  Wire.write(0x00); // было Wire.write(0x80);  
  Wire.endTransmission();
}

void blink() {
  digitalWrite(13, !digitalRead(13));
  flag = !flag;
  tm1637.point(flag); 
}


//**********************************
String znam_den = " ";

void setup() {
  //********************************** индикатор
  Wire.begin();
  pinMode(13, OUTPUT);
  pinMode(keyHor, INPUT_PULLUP);
  pinMode(keyMin, INPUT_PULLUP);
  pinMode(keyPL, INPUT_PULLUP);
  pinMode(led, OUTPUT);// строка точка
  tm1637.init();
  tm1637.set(brightness);  
  
  setINT(); 
  attachInterrupt(0, blink, CHANGE);
  //**********************************
  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(matrix.getRotation()+3); //развернуть строку 1 - 90, 2 - 180, 3 - 270
 
}
void loop() {
  //**********************************
   nastroika:// точка безусловного перехода,хоть и не рекомендуют ее использовать умные програмисты, но в моем слаучае это необходимость.

  
  //********************************** индикатор
  // читаем время из модуля
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; 
  getDateDs3231(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  digitalWrite(led, HIGH); // точка
    // забиваем массив значениями для отпарвки на экран
  int8_t TimeDisp[4]; 
  
  TimeDisp[0] = hour / 10;
  TimeDisp[1] = hour % 10;
  TimeDisp[2] = minute / 10;
  TimeDisp[3] = minute % 10;



    // обработка кнопок
   
   if (!digitalRead(keyPL)){
  if (!digitalRead(keyHor) ){   // часы
      second = 0;                           // сбрасываем секунды
      hour++;                               // пребавляем единицу к часам
      if (hour > 23) hour = 0;              // если вылезли за границы присваеваем 0
      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year); // пишим в модуль
      delay(200);
  }
  if (!digitalRead(keyMin) ){   // минуты
      second = 0;
      minute++;
      if (minute > 59) minute = 0;
      setDateDs3231(second, minute, hour, dayOfWeek, dayOfMonth, month, year);
      delay(200);
  }
  tm1637.display(TimeDisp);// отправляем массив на экран если кнопка PL нажата
  goto nastroika;// отправляем програму выполнять цикл loop сначала.
  }
     // отправляем массив на экран
  tm1637.display(TimeDisp);
  //********************************** индикатор
  DateTime now = RTC.now();



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


 switch(sensor.read()){    // читаем показания датчика
   
  }
  //********************************** знаменательные дни. для ардуино уно хватит памяти где то на 5-6 строк.
  if ((month==11) && (dayOfMonth ==30)  ){
   znam_den = "С днем рожденья мои лапки"; 
  }
  if ((month==1) && (dayOfMonth ==29)  ){
   znam_den = "Солнышко моё с днем рожденья"; 
  }
  if ((month==12) && (dayOfMonth ==31)  ){
   znam_den = "С новым Годом!"; 
  }
  //********************************** знаменательные дни.
  // сдесь в зависимости от перменых на матрицу выводится нужная строка
 
 tape = utf8rus((String)+"Время "+hour+":"+minute+" Дата "+year+"/"+month+"/"+dayOfMonth+" Температура "+sensor.tem +"`C, Влажность "+sensor.hum+"%  "+znam_den);
 
 
  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);
}

 

 

в коде который отвечает за работу кнопок пришлось добавить безусловный переход goto так как коррекция времени выполняется в цикле loop то добавление минуты или часа не происходит пока не выполнится весь цикл, а он выполняется около 20-30 секунд. при нажатие и удерживании кнопки PL цикл завершается и после доходит до оператора goto и начинается заново.также в это условие вставил функцию   tm1637.display(TimeDisp); что бы все что натыкал отображалось на индикаторе. 
Точку на индикаторе подсоединил к свободному выходу и зажег. потому что от платы TM1637 она не мигает и в цикле loop она мигает с периодичностью в 20-30 секунд по той же причине что описана выше. в последствии я спаяю какой нибудь генератор который будет мигать диодом без ардуино. 

также в ардуино осталась свободная память. которую я решил использовать. и добавил в код  возможность отображать знаменательные дни. такие как. С новым годом, с нем рожденья и т.п. Но код пока сырой и надним еще надо поработать. Также в коде полный хаус, если у кого есть желание приведите его в божеский вид.

вот видео

https://www.youtube.com/watch?v=J-s8X1iwKOs

Ardo23
Offline
Зарегистрирован: 29.12.2016

[quote=shapkin]

Спасибо за отличную схемку.  Собрал , добавил 2 DS18B20 к Dht11 - вывел один датчик на улицу, другой на балкон. Допилил скетч, заметил что можно выводить еще строки с текстом. Добавил случайную переменную и 5 строк -  получился отличный новогодний подарок жене. 

https://yadi.sk/i/QJp0i6Qa35nR74  видео 

shapkin
Offline
Зарегистрирован: 17.10.2016

класно получилось, вот если бы ты использовал 8 матриц, а не 4 веще была бы красота.

Ardo23
Offline
Зарегистрирован: 29.12.2016

Полностью согласен. Вот только надо было сразу заказать несколько матриц.... а сейчас заказы идут долго.  Еще хочу сделать часы с бегущей строкой - понравились https://www.youtube.com/watch?v=bRN6QQCCVqA   .  как сделать такую анимацию???  

NVV
Offline
Зарегистрирован: 03.01.2017
 
#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 = 10; // DIN 11, CLK 13 
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
int numberOfVerticalDisplays = 4;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4
 
Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
 
String tape = "";
int wait = 100; // время в миллисекундах
 
int spacer = 2; // Промежуток между символами (кол-во точек)
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(13); // Используйте значение между 0 и 15 для яркости
  matrix.setRotation(matrix.getRotation()+3); //развернуть строку 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());
 
 
  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);
}
NVV
Offline
Зарегистрирован: 03.01.2017

помогите где я тут накосипорил.мне надо датчик тепловой подключить простой и чтоб по русски писать можно было.Что надо поменять?

Ardo23
Offline
Зарегистрирован: 29.12.2016

Взять скетч из второго поста, там все правильно... и по русски писать можно )))) 

NVV
Offline
Зарегистрирован: 03.01.2017
// Видеообзоры и уроки работы с ARDUINO на YouTube-канале IOMOIO: https://www.youtube.com/channel/UCmNXABaTjX_iKH28TTJpiqA
 
#include <OneWire.h>                  // Подключаем библиотеку для взаимодействия с устройствами, работающими на шине и по протоколу 1-Wire
#include <DallasTemperature.h>        // Подключаем библиотеку с функциями для работы с DS18B20 (запросы, считывание и преобразование возвращаемых данных)
 
#include <OLED_I2C.h>                 // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
OLED  myOLED(A4, A5, A4);             // Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21
 
#define ONE_WIRE_BUS 2                // Указываем пин подключения data-вывода датчика температуры
#define term_power 4                  // Указываем пин подключения питания датчика температуры
 
OneWire oneWire(ONE_WIRE_BUS);        // Сообщаем библиотеке об устройстве, работающем по протоколу 1-Wire
DallasTemperature sensors(&oneWire);  // Связываем функции библиотеки DallasTemperature с нашим 1-Wire устройством (DS18B20)
 
extern uint8_t BigNumbers[];          // Подключаем шрифт
 
void setup(void)
{
  myOLED.begin();                     // Инициализируем библиотеку OLED_I2C
  pinMode(term_power, OUTPUT);        // Определяем пин подключения питания датчика температуры
}
 
 
float temperature() {                            // Измеряем температуру 10 секунд
  digitalWrite(term_power, HIGH);                // Включаем питание датчика температуры
  delay(200);                                    // Задержка перед первым измерением 
  sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
  delay(650);                                    // Задержка перед поторным измерением
  sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
  float t = float(sensors.getTempCByIndex(0));   // Получаем значение температуры
  digitalWrite(term_power, LOW);                 // Отключаем питание датчика температуры
  delay(1400);                                   // Задержка, чтобы датчик не нагревался от частых измерений
  return(t);                                     // Возвращаем значение температуры в место вызова функции
}
 
void loop(void)
{
    myOLED.clrScr();                                // Стираем все с экрана
    myOLED.setFont(BigNumbers);                     // Инициализируем шрифт
    myOLED.print(String(temperature()),CENTER, 10); // Выводим текущее значение температуры датчика, округленное до десятых
    myOLED.update();                                // Обновляем информацию на дисплее
}
NVV
Offline
Зарегистрирован: 03.01.2017

Привет всем.Помогите ни с одного а с двух датчиков вывести на олед дисплей.Я вообще ни могу понять.Пробовал расположение текста поменять тоже не допру.

Ardo23
Offline
Зарегистрирован: 29.12.2016

NVV пишет:

Привет всем.Помогите ни с одного а с двух датчиков вывести на олед дисплей.Я вообще ни могу понять.Пробовал расположение текста поменять тоже не допру.

прога Flprog   https://www.youtube.com/watch?v=JP3kE_Z2wLY

NVV
Offline
Зарегистрирован: 03.01.2017

я щас смотрю видео и в программе не могу найти олед дисплей.Привет

NVV
Offline
Зарегистрирован: 03.01.2017
NVV
Offline
Зарегистрирован: 03.01.2017

может у меня версия старая?

NVV
Offline
Зарегистрирован: 03.01.2017

есть какое нибудь обновление программы?

NVV
Offline
Зарегистрирован: 03.01.2017

Щас подключил два датчика в ком порте с двух показывает температуру.На дисплее тоже все разделил все норм но две температуры с одного датчика показывает.

NVV
Offline
Зарегистрирован: 03.01.2017
// Видеообзоры и уроки работы с ARDUINO на YouTube-канале IOMOIO: https://www.youtube.com/channel/UCmNXABaTjX_iKH28TTJpiqA
 
#include <OneWire.h>                  // Подключаем библиотеку для взаимодействия с устройствами, работающими на шине и по протоколу 1-Wire
#include <DallasTemperature.h>        // Подключаем библиотеку с функциями для работы с DS18B20 (запросы, считывание и преобразование возвращаемых данных)
 
#include <OLED_I2C.h>                 // Подключаем библиотеку OLED_I2C для работы со шрифтами и графикой
OLED  myOLED(A4, A5, A4);             // Определяем пины I2C интерфейса: UNO и NANO -- SDA - пин A4, SCL - пин A5; MEGA -- SDA - пин 20, SCL - пин 21
extern uint8_t RusFont[];                           // Подключаем русский шрифт
extern uint8_t SmallFont[];                         // Подключаем латинский шрифтом
 
 
#define ONE_WIRE_BUS 2                // Указываем пин подключения data-вывода датчика температуры
#define term_power 4                  // Указываем пин подключения питания датчика температуры
 
OneWire oneWire(ONE_WIRE_BUS);        // Сообщаем библиотеке об устройстве, работающем по протоколу 1-Wire
DallasTemperature sensors(&oneWire);  // Связываем функции библиотеки DallasTemperature с нашим 1-Wire устройством (DS18B20)
 
extern uint8_t BigNumbers[];          // Подключаем шрифт
 
void setup(void)
{
  myOLED.begin();                     // Инициализируем библиотеку OLED_I2C
  pinMode(term_power, OUTPUT);        // Определяем пин подключения питания датчика температуры
}
 
 
float temperature() {                            // Измеряем температуру 10 секунд
  digitalWrite(term_power, HIGH);                // Включаем питание датчика температуры
  delay(200);                                    // Задержка перед первым измерением 
  sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
  delay(650);                                    // Задержка перед поторным измерением
  sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
  float t = float(sensors.getTempCByIndex(0));   // Получаем значение температуры
  digitalWrite(term_power, LOW);                 // Отключаем питание датчика температуры
  delay(1400);                                   // Задержка, чтобы датчик не нагревался от частых измерений
  return(t);                                     // Возвращаем значение температуры в место вызова функци
}
void loop(void)
{
    myOLED.clrScr();                                // Стираем все с экрана
    myOLED.setFont(RusFont);                            // Инициализируем русский шрифт
    myOLED.print("EKBWF", LEFT, 0);           // Выводим надпись "Русский язык"
    myOLED.setFont(BigNumbers);                     // Инициализируем шрифт
    myOLED.print(String(temperature()),RIGHT, 0); // Выводим текущее значение температуры датчика, округленное до десятых
    myOLED.setFont(RusFont);                            // Инициализируем русский шрифт
    myOLED.print("LJV", LEFT, 40);           // Выводим надпись "Русский язык"
    myOLED.setFont(BigNumbers);                     // Инициализируем шрифт
    myOLED.print(String(temperature()),RIGHT, 40); // Выводим текущее значение температуры датчика, округленное до десятых
    myOLED.update();                                // Обновляем информацию на дисплее
NVV
Offline
Зарегистрирован: 03.01.2017

Текст сделал по русски все норм но как второе значение заставить читать со второго датчика ни как.

maxbarich
Offline
Зарегистрирован: 31.05.2013

Всем привет !! Подскажите пытаюсь освоить матрицу на max7219 4 модуля в  ряд , через arduino mega 2560 . Подключил все по даташиту на mega и max7219

50 ( miso) -> Din

51 (mosi) -> CLK

53  (SS)   -> CS 

данное подключение работает с библиотекой Ledcontrol.h всякие спецэффекты работают но перевернуто , а с библиотеками Adafruit_GFX.h и max72xxPanel.h все застывает и ничего не происходит , вот вариант кода ( брал с данной ветки)  : 

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>


int pinCS = 53; // DIN 11, CLK 13 
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
int numberOfVerticalDisplays = 4;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

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

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

int spacer = 2; // Промежуток между символами (кол-во точек)
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; // Возвращаем строку 
    }
    //* ВНЕКОТОРЫХ КОМИЛЯТОРАХ АРДУИНО ЭТОТ КОД НУЖЕН, НАПРИМЕР В 1.0.3 СДВИГАТЬ СИМВОЛ НУЖНО, А В 1.6.7 УЖЕ НЕТ.
    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; 
}
//*ПЕРЕМЕНЫЕ
//**********************************
int stroka = 0;//переменая строки
String peremenay1 = "20 ";
String peremenay2 = "75 ";
String peremenay3 = "24 ";
String peremenay4 = "переменая4";
//**********************************

void setup() {
  Serial.begin(9600);
  
  matrix.setIntensity(1); // Используйте значение между 0 и 15 для яркости
  matrix.setRotation(matrix.getRotation()+3); //развернуть строку 1 - 90, 2 - 180, 3 - 270
 
}
void loop() {
  // сдесь в зависимости от перменых на матрицу выводится нужная строка
  if (stroka == 0) {
  tape = utf8rus(" первая сторка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
  
   }
  if (stroka == 1) {
  tape = utf8rus("вторая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
 }
 if (stroka == 2) {
  tape = utf8rus("третья строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
 }
 if (stroka== 3) {
  tape = utf8rus("четвертая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
 }
 if (stroka == 4) {
  tape = utf8rus("пятая строка ,"+peremenay1+peremenay4+" текст"+peremenay3+"текст2 "+peremenay2+"%");
 }
stroka += 1;
if (stroka == 5) {
  stroka = 0;
 }
  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);
  }
 
}

 

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Народ подскажите, какой то сдвиг букв, печтаю А выводит Б и так далее, где капать?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Efendis пишет:

Народ подскажите, какой то сдвиг букв, печтаю А выводит Б и так далее, где капать?

Ну если капать на Марсе, то точно сдвиг букв вы там не найдете, но это скорее мое ИМХО. А если поближе, то наверно надо ковырять код, который вы туда залили. 

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Код взят от сюда в месте с библиотеками, но у все все норм, находил вопрос такой же в сети, но ответа небыло, видимо еденичный случай

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Efendis пишет:

Код взят от сюда в месте с библиотеками, но у все все норм, находил вопрос такой же в сети, но ответа небыло, видимо еденичный случай

Ну да потерялась строка в файле знакогенератора ,вот и сдвиг образовался. Вместо того что бы ковыряться в коде, вы ищите ошибку здесь.

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Я тут прошу помочь. А не что мне делать. Кто может сталкивался. Начинаются палки. Если такие знатоки, помогли бы, чем язвить.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот зачем мне копаться в чужом коде, портить глаза. Тем более тот код я не считаю "шедевром" , и опыта я в этом точно не получу, только настроение упадет.

arduinec
Offline
Зарегистрирован: 01.09.2015

Efendis пишет:

Народ подскажите, какой то сдвиг букв, печтаю А выводит Б и так далее, где капать?

См. пост 15 темы: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Нет там в 15 посте ничего что нужно мне.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Efendis пишет:

Код взят от сюда в месте с библиотеками, но у все все норм, находил вопрос такой же в сети, но ответа небыло, видимо еденичный случай

Ну, если "от сюда", то конечно. Вы предлагаете всем угадывать от какого такого "сюда" Вы что-то там взяли и перерывать все "сюда" в надежде наткнуться на золотую жилу? Задаёте вопрос - давайте код.

Но ответ (судя по хрустальному шару) скорее всего такой. Автор нумерует буквы с нуля ("а" - нулевая, "б" - первая"), а Вы с единицы ... ну, или что-то в этом роде.

artemon25
Offline
Зарегистрирован: 25.12.2015
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
008 int numberOfVerticalDisplays = 4;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

Подскажите а сколько вообще можно сразу подключить этих матриц по горизонтали и вертикали комплекты по 4шт. спасибо

Gogi
Offline
Зарегистрирован: 17.09.2017

Классно получилось. Уважаемый Ardo23 Ты можешь скинуть мне скетч-очень надо- я не программист и поэтому ничего не понимаю в написании кода. Но провода соединить могу. Я накупил этого железа хочу сделать такие часы. В принципе я уже залил скетч представленный выше но хотелось бы чтобы всё работало чётко. Год был 4-ёх значный часы в формате 1:07 а не 1:7 . И что в этом коде классно что там есть знаменательные дни. Под себя можно даты и записи сделать. Заранее благодарю. А датчик давления BMP280  реально в этот код вписать?

 

Ardo23
Offline
Зарегистрирован: 29.12.2016

Я тоже не программист ... есть такая програмка Flprog , а вот ссылка на форум с блоком для МАХ7219 http://flprog.ru/forum/18-1769-1 . Теперь можно выводить на панель показания любых датчиков и русский текст , и много других символов . 

tuzman
Offline
Зарегистрирован: 02.11.2017

maxbarich   DIN -51

                    CLK-52

                     CS-53

 

maximys
Offline
Зарегистрирован: 02.12.2015

Подскажите как настроить время и дату той строкой в коде неполучаетса. Спасибо

здарово народ.  наконец то пришли мои часы  ds1307 и сразу
 решил собрать часы на светодиодной матрице MAX7219 
и датчике влажности DHT-11 и что бы все отображалось с русским шрифтом.
соединил все так.
 
вот код

#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 = 10; // DIN 11, CLK 13 
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
int numberOfVerticalDisplays = 8;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

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

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

int spacer = 2; // Промежуток между символами (кол-во точек)
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(matrix.getRotation()+3); //развернуть строку 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);
}

вот видео

https://youtu.be/xwNt9NwN_Io

сейчес жду индикатор на TM1637 и свето диоды. на основе этого железа хочу собрать большой 4-разрядный 7-сегментный  индикатор и тогда проект будет готов.

 

[/quote]

bwn
Онлайн
Зарегистрирован: 25.08.2014

Не понял, чего вы хотите, но если про незначащие нули, то:

hMinute = future.minute()/10;
lMinute = future.minute()%10;
//Далеее выводите hMinute и lMinute в строку.

 

Ardo23
Offline
Зарегистрирован: 29.12.2016

 часы 1307 убегают хорошо . За год на 90 минут прибавили .

 https://youtu.be/y-dzk8t0cWA  

https://youtu.be/XazS43FvGIo  моя строчка с датчиками ,  год спустя. 

maximys
Offline
Зарегистрирован: 02.12.2015
#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 = 10; // DIN 11, CLK 13 
int numberOfHorizontalDisplays = 1;//КОЛИЧЕСТВО МАТРИЦ ВЕРТИКАЛЬНО
int numberOfVerticalDisplays = 8;//КОЛИЧЕСТВО МАТРИЦ ГОРИЗОНТАЛЬНО MAX7219 8х8х4

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

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

int spacer = 2; // Промежуток между символами (кол-во точек)
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(matrix.getRotation()+3); //развернуть строку 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);
}

У меня вопрос по коду что выше немогу настроить дату и время в коде указано что дата и время можно настроить RTC.adjust(DateTime(__DATE__, __TIME__)); но у меня ничего неполучаетса.

vk007
Offline
Зарегистрирован: 16.06.2015

Ну так раскомментируйте эту строку и получится - скомпилируйте и залейте скетч. Время на часах выставится по компьютерному времени.

Только потом снова закомментимруйте и перезалейте скетч. Иначе после каждой перезагрузки, время будет устанавливаться одно и то же.

maximys
Offline
Зарегистрирован: 02.12.2015

Так я сделал раскоментировал залил но нечего не настраиваетса.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А чего именно Вы ждёте?

maximys
Offline
Зарегистрирован: 02.12.2015

У меня вопрос по коду что выше немогу настроить дату и время в коде указано что дата и время можно настроить RTC.adjust(DateTime(__DATE__, __TIME__)); но у меня ничего неполучаетса.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы моего вопроса не поняли. Чего Вы ждёте от этой строки? Что она посмотрит на часы и установит Вам правильную время и дату или что она за пивом сбегает? Что делает по-Вашему эта строка?

maximys
Offline
Зарегистрирован: 02.12.2015

Согласно кода строка для настройки дати и времени но она етого не делает и я спрашиваю как настроить дату и время.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Боюсь, что Вы не понимаете смысла этой строки. Какую именно дату и время она по Вашему устанавливает? И откуда она, по-Вашему, эту дату и время берёт?

maximys
Offline
Зарегистрирован: 02.12.2015

Так обясните пожалуйста если несложно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Я Вас спрашивая. Вы говорите она не работает. Я и спрашиваю, чего на не делает? Время не устанавливает? А какое время она должна по-Вашему установить - текущее в момент включения питания или время, в которое Вы просыпаетесь на работу. Что она должна делать и не делает?

Если Вы не знаете, что она должна делать, то как Вы заключили, что она этого не делает?

maximys
Offline
Зарегистрирован: 02.12.2015

Когда я заливаю скетч которий должен отображать дату время температуру и влажность но дата изначально стоит 2000 01 01 и время 0 00 так вот время и дата должни отображатса текущие тоесть настольние часи но етого непроисходить. Так понятно или нет.

kalapanga
Offline
Зарегистрирован: 23.10.2016

maximys пишет:
Когда я заливаю скетч которий должен отображать дату время температуру и влажность но дата изначально стоит 2000 01 01 и время 0 00 так вот время и дата должни отображатса текущие тоесть настольние часи но етого непроисходить. Так понятно или нет.

Вытащите эту строку наружу из if-а, внутри которого она сейчас стоит. И проделайте описанные операции: раскомментировать, залить скетч, закомментировать обратно, залить скетч.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maximys пишет:
Когда я заливаю скетч которий должен отображать дату время температуру и влажность но дата изначально стоит 2000 01 01 и время 0 00 так вот время и дата должни отображатса текущие тоесть настольние часи но етого непроисходить. Так понятно или нет.

Тогда эта строка не то, что Вам надо.

Эта строка содержит время и дату компиляции программы. Вот всё. на что Вы можете расчитывать.