Ticker sur un afficheur 1602. Cours Arduino : création d'un ticker à l'aide d'un microcontrôleur. Programmation du téléscripteur

Ligne rampante sur l'écran LCD du HD44780.

La recherche d'une « solution toute faite » pour un ticker en C n'a donné aucun résultat. J'ai donc dû le faire moi-même.

Ce « morceau » de code vous permet d'afficher une ligne courante (de droite à gauche), à ​​n'importe quel endroit et en utilisant n'importe quel nombre de familiarités, dans des indicateurs LCD avec un contrôleur HD44780 ou similaire.

La première chose à souligner est que le langage C ne permet pas de travailler « directement » avec des chaînes. Autrement dit, il est impossible de copier un caractère d'une chaîne à une autre à l'aide de l'opérateur d'affectation ( = )... pour cela, vous devez utiliser une fonction spéciale strncpy(). De manière générale, plusieurs fonctions sont utilisées pour travailler avec des chaînes en C. Dans Self-Tourmentors, un chapitre distinct est consacré à l’utilisation de ces fonctions. Dans l'Aide"e sur CV_AVR, une description des fonctions permettant de travailler avec des chaînes se trouve dans la section "Fonctions de chaîne". Les prototypes de ces fonctions sont dans le fichier chaîne.h.

"...chaîne source..." - une chaîne de caractères à partir de laquelle doit être affichée dans la ligne "en cours d'exécution" ;

"...caractères affichés..." - la véritable "ligne rampante".

L'algorithme suivant a été choisi pour organiser la ligne rampante :

1. Les caractères affichés se déplacent de droite à gauche. Celui le plus à gauche est « perdu » dans ce cas.

2. Après le décalage, le caractère suivant de la chaîne source est copié vers le caractère le plus à droite.

3. Lorsque la fin de la ligne source est atteinte, le premier caractère de la ligne source devient le caractère suivant.

Pour décaler des caractères - pour la cellule à décaler, le code de caractère est lu dans la RAM de l'écran (DDRAM) HD44780 et écrit dans la cellule RAM de gauche.

Selon la fiche technique du HD44780, le caractère gauche de la ligne supérieure a une adresse DDRAM de 0x00 et le caractère gauche de la ligne inférieure a une adresse 0x40. Il faut rappeler que pour accéder à la RAM de l'écran (et non à la RAM du générateur de caractères), le bit RS doit être égal à 1 (RS est le bit de poids fort dans l'octet d'adresse, voir DataSheet).

En conséquence, nous obtenons que pour « adresser » le deuxième caractère gauche de la ligne supérieure, vous devez « travailler » avec l'adresse 0x01 | 0x80 = 0x81.

Les fonctions d'écriture et de lecture du « contenu interne » du HD44780 sont dans la bibliothèque (prototypes en lcd.h.... donc.. le programme lui-même :

/* pour CV_AVR

Dans cet exemple, la ligne courante est affichée dans les bits 8 (0xC7) à 16 de la ligne inférieure d'un indicateur 16 bits.

. ......

#inclure

caractère non signé n_sim=1,m_end=43 ; //43 - longueur de la ligne dans l'exemple
...........

beg_stroka())(
caractère non signé i ;

// décale la ligne rampante

si(beg_str)(
pour(i=0;i<9;i++)lcd_write_byte(0xC7+i,lcd_read_byte(0xC8+i));
beg_str=0;

// écriture du caractère suivant à l'extrême droite

lcd_gotoxy(15,1);
lcd_putchar(ish_str);
si(++n_sim>m_end)n_sim=1;
}
}

Glossaire:

n_sim - pointeur vers la position du caractère actuel dans la chaîne source ;

m_end - le nombre total de caractères dans la chaîne source ;

beg_str- bit "activer" le décalage. Avec son aide, vous pouvez réguler la vitesse de course ;

ish_str - chaîne source.

Très probablement, chacun des compilateurs C existants dispose de fonctions de bibliothèque permettant de travailler avec le HD44780. Par conséquent, « refaire » le programme pour « votre » compilateur ne sera pas difficile.

Je « prépare » la chaîne source à l'aide de l'utilitaire bien connu « HD44780.exe ». Lors de son utilisation, la longueur de ligne est indiquée dans les commentaires : "/* Longueur maximale d'une ligne : 43 octets */"

QAPASS LCD 1602 ne prend pas en charge la police russe, mais vous pouvez afficher l'alphabet cyrillique sur Arduino en créant vos propres caractères. Voyons comment créer des symboles et des lettres en cyrillique sur l'écran LCD Arduino. Pour ce faire, nous devons utiliser une variable dans le croquis octet et fonction lcd.createChar(). Notons tout de suite que la capacité mémoire sur Arduino pour les caractères est limitée à seulement huit caractères.

Comment afficher votre personnage sur LCD 1602

Un tableau générateur de caractères (CGROM) vous aidera à afficher votre symbole ou votre lettre cyrillique sur l'écran. Ce type de mémoire dans Arduino, comme la CGRAM, peut stocker des caractères natifs, mais la taille de la mémoire est limitée et ne peut accueillir que 8 caractères natifs. L'un des symboles non standard utiles pour créer une station météo domestique est le signe du degré. Dessinons un symbole.


Pour commencer, prenez une feuille de papier et dessinez dessus un tableau avec 5 colonnes et 8 lignes. Ensuite, ombrez les cellules du tableau (voir photo ci-dessus) qui doivent apparaître à l'écran. Le fait est que chaque caractère affiché à l'écran est constitué de pixels (5 pixels de large et 8 pixels de haut). Imaginons ensuite notre symbole comme un tableau de données composé de huit éléments - huit lignes.

Nous affichons notre propre symbole sur le LCD 1602

Pour cette leçon, nous aurons besoin des détails suivants :

  • Carte Arduino Uno/Arduino Nano/Arduino Mega ;
  • Moniteur LCD 1602 ;
  • fils mâle-femelle.

L'écran LCD est connecté via I2C à l'aide de quatre fils mâle-femelle : 2 fils de données et 2 fils d'alimentation. Si vous connectez un écran Ardiuno UNO, utilisez le circuit suivant - broche S.D.A. se connecte au port A4, sortie SCL– au port A5 et à deux fils d’alimentation – GND et 5V. Si QAPASS 1602 est connecté via le bus I2C à Arduino Mega, alors la carte possède les ports correspondants - SDA et SCL.

Esquisse pour créer un symbole sur LCD I2C

#inclure #inclure // créez votre propre symbole et donnez-lui le nom "simvol" octet simvol = ( 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000 ); void setup()(lcd.init()); // initialise l'écran LCD LCD rétro-éclairage(); lcd.createChar(1, simvol); lcd.setCursor(0,0); // place le curseur à 1 caractère de la première ligne lcd.print(char(1)); // affiche le caractère sur la première ligne) boucle vide () ( )

Explications pour le code :

  1. en utilisant un tableau d'octets simvol = ( ); nous avons chiffré le signe du degré que nous avions dessiné plus tôt sur un morceau de papier ;
  2. fonction lcd.createChar(num, données); crée un symbole personnalisé pour l'écran LCD, où entre parenthèses est spécifié num— le numéro du symbole et données- des données sur le tableau.
  3. chaque ligne du tableau commence par 0b - « zéro » et un « b » majuscule.

Nous affichons la police russe sur l'écran LCD 1602

L'écran QAPASS prend en charge 8 nouveaux caractères (numérotés de 0 à 7) mesurant 5 x 8 pixels. Une lettre cyrillique, comme un symbole, peut être spécifiée comme un tableau de huit octets caractérisant la chaîne correspondante. Vous pouvez ajouter jusqu'à 8 caractères, utilisez donc une combinaison de lettres latines et cyrilliques lors de la sortie, comme dans l'exemple. Téléchargez un croquis avec l'inscription « I ❤ site »

Croquis avec des lettres russes sur LCD I2C

#inclure // bibliothèque pour contrôler les appareils via I2C#inclure // connecte la bibliothèque pour LCD 1602Écran LCD LiquidCrystal_I2C (0x27,20,2); // attribue un nom à l'écran LCD pour l'affichage 20x2 // crée un symbole de cœur et quatre lettres en cyrillique coeur d'octet = ( 0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000 ); octet I = ( 0b01111, 0b10001, 0b10001, 0b01111, 0b00101, 0b01001, 0b10001, 0b00000 ); octet B = ( 0b11111, 0b10000, 0b10000, 0b11110, 0b10001, 0b10001, 0b11110, 0b00000 ); octet N = ( 0b10001, 0b10001, 0b10011, 0b10101, 0b11001, 0b10001, 0b10001, 0b00000 ); octet F = ( 0b01110, 0b10101, 0b10101, 0b10101, 0b01110, 0b00100, 0b00100, 0b00000 ); void setup()(lcd.init()); // initialise l'écran LCD LCD rétro-éclairage(); // active le rétroéclairage de l'écran // attribue un numéro de série aux personnages lcd.createChar(1, coeur); lcd.createChar(2, I); lcd.createChar(3, B); lcd.createChar(4, N); lcd.createChar(5, F); lcd.setCursor(6,0); // place le curseur sur le 6ème caractère de la première ligne lcd.print(char(2)); lcd.print(" "); lcd.print(char(1)); lcd.setCursor(0,1); // place le curseur au début de la deuxième ligne lcd.print("P"); lcd.print("O"); lcd.print(char(3)); lcd.print("O"); lcd.print("T"); lcd.print("E"); lcd.print("X"); lcd.print("H"); lcd.print(char(4)); lcd.print("K"); lcd.print("A"); lcd.print("1"); lcd.print("8"); lcd.print("."); lcd.print("P"); lcd.print(char(5)); ) boucle vide () ( )

Explications pour le code :

  1. Tableaux de chaînes dans l'octet de fonction simvol = ( ); peut être écrit sur une ligne ;
  2. Mot site web utilise un ensemble de lettres russes et latines.
  3. La procédure void loop() n'est pas utilisée dans l'esquisse, mais est toujours présente.

Bonjour gars. Aujourd'hui, nous allons créer un ticker sur les modules LED MAX7219 et Arduino. La tâche est très simple et ne nécessite pas de grandes connaissances dans le domaine de l’électronique et de la programmation. Pour commencer, je propose d'étudier un peu la théorie sur la structure de la matrice LED, le principe de sa connexion et de regarder une vidéo du résultat que nous rechercherons tout au long de l'article.

La matrice LED est un indicateur graphique qui peut être utilisé pour afficher des images, des lettres et des chiffres simples. Je n'ai pas l'intention de comprendre en détail la structure des indicateurs matriciels, mais il convient de noter que la matrice se compose essentiellement de 8x8 LED. Essentiellement, tout se résume à un affichage dynamique. Sur cette base, il est clair que regrouper plusieurs matrices n’est pas une tâche facile. Pour chaque nouvelle ligne ou colonne de matrices, vous devez ajouter un nouveau registre à décalage ainsi que des fils et des résistances, et, à l'amiable, également une puce ULN2003.

Heureusement, les ingénieurs développent depuis longtemps des microcircuits spécialisés pour contrôler divers types d'indicateurs. Dans cet article, nous examinerons un module matriciel avec la puce MAX7219. Comme nous le verrons plus tard, travailler avec un tel module est un plaisir.

Module matriciel LED avec CI MAX7219

Le module est une carte avec un microcircuit, le câblage nécessaire et, en fait, un indicateur matriciel. Habituellement, l'indicateur n'est pas soudé à la carte, mais inséré dans le connecteur. Ceci est fait de sorte qu'un groupe de modules puisse d'abord être fixé sur une surface avec des vis, puis les matrices peuvent y être insérées.

Le module comporte cinq broches de chaque côté. D'un côté, les données entrent dans le module, de l'autre, les données sortent du module et sont transférées vers le module suivant. Cela vous permet de connecter des matrices dans une chaîne.

Connecteur d'entrée/connecteur de sortie :

  • VCC, GND - alimentation ;
  • DIN - entrée de données ;
  • CS - sélection de module (sélection de puce) ;
  • CLK - impulsion de synchronisation.

Le module fonctionne sur une tension de 5 Volts.

Sortie de pixels à l'aide de la bibliothèque Max72xxPanel

Pour contrôler la puce MAX7219 nous utiliserons la bibliothèque Max72xxPanneau. Vous pouvez le télécharger à partir des liens à la fin de l'article.

Installons la bibliothèque et écrivons un petit code qui affichera un seul point avec les coordonnées x=3 et y=4. Le point clignotera avec une période de 600 millisecondes.

#inclure #inclure #inclure int pinCS = 10 ; int numberOfHorizontalDisplays = 1; // nombre de matrices horizontalement int numberOfVerticalDisplays = 1; // nombre de matrices verticalement Max72xxPanel matrice = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); void setup() ( matrice.setIntensity(4); // luminosité de 0 à 15 ) void loop() ( matrice.drawPixel(3, 4, HIGH); // éclaire le pixel avec les coordonnées (3,4) de la matrice. write (); // affiche tous les pixels dans la matrice delay(300); matrice.drawPixel(3, 4, LOW); // masque les pixels de la matrice.write(); delay(300); )

Comme mentionné précédemment, les modules matriciels dotés de la puce MAX7219 peuvent être facilement combinés. C'est dans ce but qu'au début du programme on fixe le nombre de matrices horizontalement et verticalement. Dans ce cas, une matrice est utilisée, donc ces deux paramètres seront égaux à 1.

Il est important de noter qu'après avoir activé et désactivé les pixels à l'aide de la fonction dessinerPixel, vous devez appeler la fonction écrire. Sans la fonction d'écriture, les pixels ne seront pas affichés sur la matrice !

Écrivons maintenant un code qui affichera un visage souriant sur la matrice. Nous chiffrerons le sourire en utilisant un tableau de huit octets. Chaque octet du tableau sera responsable d'une ligne de la matrice, et chaque bit de l'octet sera responsable d'un point de la ligne.

#inclure #inclure #inclure int pinCS = 10 ; int numberOfHorizontalDisplays = 1; // nombre de matrices horizontalement int numberOfVerticalDisplays = 1; // nombre de matrices verticalement Max72xxPanel matrice = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); données d'octet const = ( 0b00111100, 0b01000010, 0b10100101, 0b10000001, 0b10100101, 0b10011001, 0b01000010, 0b00111100 ); void setup() ( matrice.setIntensity(7); // luminosité de 0 à 15 matrice.fillScreen(LOW); // effacement de la matrice pour (int y = 0; y< 8; y++) { for (int x = 0; x < 8; x++) { // зажигаем x-й пиксель в y-й строке matrix.drawPixel(x, y, data[y] & (1<

Note. La bibliothèque Max72xxPanel a une fonction setRotation, qui spécifie l'orientation de l'image sur la matrice. Par exemple, si nous voulons faire pivoter un smiley de 90 degrés, nous devrons le faire immédiatement après avoir appelé la fonction définirIntensité appel setRotation avec les arguments appropriés :

matrice.setRotation(0, 1);

le premier paramètre est l'indice matriciel, dans notre cas il est égal à zéro ; le deuxième paramètre est le nombre de tours à 90 degrés.

Sortie de texte à l'aide de la bibliothèque Adafruit-GFX

De la même manière, vous pouvez afficher n'importe quel autre symbole, par exemple une lettre, sur la matrice. Mais pour pouvoir afficher n'importe quelle lettre de l'alphabet anglais, nous devrons définir jusqu'à 26 tableaux de huit octets dans le programme ! C’est très fastidieux et bien sûr quelqu’un l’a déjà fait avant nous.

En plus des fonctions permettant de travailler avec des graphiques et du texte, la populaire bibliothèque Adafruit-GFX contient également une base de données de lettres latines en majuscules et minuscules, ainsi que tous les signes de ponctuation et autres symboles de service. Le lien vers la bibliothèque se trouve à la fin de l'article.

Vous pouvez afficher un symbole sur une matrice à l'aide de la fonction dessinerChar.

drawChar(x, y, caractère, couleur, arrière-plan, taille);

Les deux premiers paramètres de la fonction sont responsables des coordonnées du coin supérieur gauche du symbole. Le troisième paramètre est le symbole lui-même. La couleur du symbole dans notre cas sera égale à 1 ou HIGH, puisque la matrice est bicolore. L’arrière-plan est 0 ou FAIBLE. Fixons le dernier paramètre « taille » à 1.

Écrivons un programme qui affichera une à une sur la matrice toutes les lettres de la phrase : « HELLO WORLD !

#inclure #inclure #inclure int pinCS = 10 ; int numberOfHorizontalDisplays = 1; int numberOfVerticalDisplays = 1 ; Matrice Max72xxPanel = Max72xxPanel (pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays) ; Bande à cordes = "HELLO WORLD" ; int attendre = 800 ; void setup() ( matrice.setIntensity(1); // luminosité de 0 à 15 ) void loop() ( for (int i = 0 ; i< tape.length(); i++) { matrix.fillScreen(LOW); matrix.drawChar(0, 0, tape[i], HIGH, LOW, 1); matrix.write(); delay(wait); } }

Note. La bibliothèque Adafruit_GFX possède de nombreuses fonctions pour travailler avec des graphiques. Par exemple, drawCircle(3, 3, 2, HIGH) dessinera un cercle de centre (3,3) et de rayon 2. Le dernier paramètre est la couleur, mais dans le cas d'une matrice monochrome, il est 1 ou HIGH. La fonction drawLine(0, 0, 3, 6, HIGH) tracera une ligne entre les points (0,0) et (3,6).

Ligne rampante sur max7219

J'espère donc que nous avons compris le dispositif et le principe de sortie sur une seule matrice. Passons maintenant directement au ticker.

De quoi aurez-vous besoin ?

Pour mettre en œuvre l’idée, vous aurez besoin de très peu de détails :

  • deux modules LED composés de quatre matrices de 8 x 8 pixels ;
  • fils de connexion;
  • Carte Arduino Nano ;

Schème

Sur le circuit imprimé du module LED utilisé se trouvent 4 matrices mesurant 8 par 8 pixels. Chaque écran LED est contrôlé par une puce MAX7219.

Le MAX7219 est un contrôleur permettant de contrôler les écrans LED, les matrices à cathode commune et les LED discrètes jusqu'à 64 pièces. Pour une perception plus confortable des informations affichées sur l'écran LED, il est recommandé d'installer plusieurs modules. Pour ce faire, ils sont combinés en groupes connectés séquentiellement, c'est-à-dire que la sortie du premier module (out) est connectée à l'entrée du deuxième module (in). Mon assemblage se compose de deux modules (16 matrices) dont la longueur est largement suffisante pour une lecture aisée de phrases entières. Dans ce cas, la connexion de l’ensemble à Arduino se fait de la même manière qu’à un seul module.

Programmation de lignes rampantes.

La ligne de fonctionnement des modules Arduino et LED contrôlés par MAX7219 est presque prête. Il est temps de passer à la dernière partie du programme.

#inclure #inclure #inclure int pinCS = 10 ; // Connectez CS à la 10ème broche, DIN à MOSI et CLK à SCK int numberOfHorizontalDisplays = 1; // Nombre de modules horizontalement int numberOfVerticalDisplays = 8; // Nombre de modules verticaux Matrice Max72xxPanel = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays); Bande à cordes = "" ; int attendre = 10 ; // Vitesse de défilement en millisecondes int spacer = 1; // Espace entre les caractères (nombre de points) int width = 5 + spacer; // Largeur des caractères /* Conversion de la police russe d'UTF-8 en Windows-1251 */ String utf8rus(String source) ( int i,k; String target; unsigned char n; char m = ( "0", "\0 " ); k = source.length(); i = 0; tandis que (i< k) { n = source[i]; i++; if (n >= 0xC0) ( switch (n) ( cas 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 = n; target = target + String(m); } return target; } /* Код для работы с com-портом */ String Serial_Read() { unsigned char c; // переменная для чтения сериал порта String Serial_string = ""; // Формируемая из символов строка while (Serial.available() >0) ( // S'il y a des caractères dans le port série c = Serial.read(); // Lire le caractère //Serial.print(c,HEX); Serial.print(" "); Serial.print(c ); if (c == "\n") ( // Si c'est la fin de la ligne return Serial_string; // Renvoie la chaîne ) if (c == 0xB8) c = c - 0x01; // Correction de caractère codes pour le tableau ???? puisque les caractères russes du tableau sont décalés par rapport au codage utf standard de 1 caractère if (c >= 0xBF && c<= 0xFF) c = c - 0x01; Serial_string = Serial_string + String(char(c)); //Добавить символ в строку } return Serial_string; } void setup() { Serial.begin(9600); tape = utf8rus("сайт Amateur Radio WorkShop"); // Этот текст выводиться при включении или если в com-порт не пришла информация matrix.setIntensity(3); // Яркость от 0 до 15 matrix.setRotation(matrix.getRotation()+3); //1 - 90 2 - 180 3 - 270 } void loop() { 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 && lettre >= 0) ( si (lettre< tape.length()) { matrix.drawChar(x, y, tape, HIGH, LOW,1); } letter--; x -= width; } matrix.write(); // Вывод сообщения на экран delay(wait); } }

Je ne vois aucun intérêt à décrire le code. C'est déjà bien commenté. Cependant, certaines fonctionnalités méritent d’être mentionnées.

Note. Important. La bibliothèque standard Adafruit_GFX ne prend initialement en charge que les polices anglaises, alors les gars de Russie ont essayé et réécrit la bibliothèque en ajoutant des polices russes et toutes sortes de goodies. Toutes les bibliothèques et croquis sont disponibles sur ma page GitHUB.

Un morceau de code pour travailler avec le port COM est nécessaire pour modifier rapidement le texte du message affiché sur le module LED. Cependant, nous avons besoin de lui non seulement pour cela. À l'avenir, en utilisant cette fonction, nous connecterons la nôtre et la ligne rampante sur Arduino.