Go Down

Topic: Arduino + LCD Smartie - Affichage non compréhensible (Read 2 times) previous topic - next topic

ChefChaudard

J'ai trouvé une solution. J'ai trouvé un autre code.

Par contre par curiosité, j'aimerais comprendre ce qui n'allait pas

Voici le nouveau code :

Code: [Select]
/*
arduino-matrixorbital.ino
A software emulator for Matrix Orbital character display commands on Arduino.

V1.5 28/12/2011
Added fixes by yosoyzenitram, prettified code a little and added all Matrix Obrital commands for display model LK204-25.

V1.0 6/2/2010
Coded by giannoug <giannoug@gmail.com>
Based on code by nuelectronics <http://www.nuelectronics.com/>

You can use whatever screen size you want, but you will
have to make proper adjustments to both this file and at
LCDSmartie's configuration menu or whatever program you
might use.

Matrix Orbital LK204-25 manual (for command reference):
http://www.matrixorbital.ca/manuals/LK_Series/LK204-25/LVK204-25%20%28Rev1.3%29.pdf

The circuit (make sure to power the LCD):
* LCD RS pin to digital pin 12
* LCD E pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD Ve pin (contrast) to digital pin 6

*/

#include <LiquidCrystal.h>

// You can define your own pins here.
#define RS 2
#define E  22
#define D4 23
#define D5 24
#define D6 25
#define D7 26
#define BR 6

#define VERSION 1

#define GPO1 8 // Not yet implemented. (pg. 18 of the manual)

LiquidCrystal lcd(RS, E, D4, D5, D6, D7);

void setup() {
  Serial.begin(19200); // Default baudrate.
  lcd.begin(20, 4); // Change this for other screen sizes.

  analogWrite(BR, 0); // Set maximum brightness.

  lcd.print("Arduino");
  lcd.setCursor(1, 1);
  lcd.print("Matrix Orbital!");
}

void loop() {
  byte rxbyte = serial_getch(); // Command
  byte temp; // Parameter

  if (rxbyte == 254) {
    switch (serial_getch()) {
    case 71: // Set cursor position (2 parameters, column, row)
      lcd.setCursor(serial_getch() - 1, serial_getch() - 1);
      break;
    case 72: // Cursor home (doesn't clear the screen!)
      //lcd.home();
      lcd.setCursor(0,0);
      break;
    case 74: // Underline cursor on
      lcd.cursor();
      break;
    case 75: // Underline cursor off
      lcd.noCursor();
      break;
    case 83: // Block cursor on
      lcd.blink();
      break;
    case 84: // Block cursor off
      lcd.noBlink();
      break;
    case 76: // Move cursor left
      lcd.command(16);
      break;
    case 77: // Move cursor right
      lcd.command(20);
      break;
    case 78: // Define custom character (2 parameters, id, data)
      lcd.command(64 + (serial_getch() * 8));
      for (temp = 7; temp != 0; temp--) {
        lcd.print(serial_getch());
      }
      break;
      //case 35: // Read serial number
      //case 36: // Read version number
    case 54: // Read version number
      Serial.print(VERSION);
      break;
    case 55: // Read module type
      Serial.print(9); // 9 for LK204-25
      break;
    case 80: // Set contrast (1 parameter, contrast)
      analogWrite(BR, 0xFF-serial_getch());
      break;
    case 81: // Auto scroll on
      lcd.autoscroll();
      break;
    case 82: // Auto scroll off
      lcd.noAutoscroll();
      break;
    case 86: // General Purpose Output off (1 parameter, number)
      //temp = serial_getch();
      //if (temp == 1) {
      //  digitalWrite(GPO1, LOW);
      //}
      break;
    case 87: // General Purpose Output on (1 parameter, number)
      //temp = serial_getch();
      //if (temp == 0) {
      //  digitalWrite(GPO1, HIGH);
      //}
      break;
    case 88: // Clear screen
      lcd.clear();
      break;
    case 35: // Place large number
    case 38: // Poll key presses
    case 51: // Change I2C slave address (1 parameter, address)
    case 57: // Change baud rate (1 parameter, baud rate)
    case 59: // Exit flow-control mode
    case 61: // Place vertical bar (2 parameters, column, length)
    case 64: // Change the startup screen
    case 65: // Auto transmit keypresses on
    case 67: // Auto line wrap on
    case 68: // Auto line wrap off
    case 66: // Backlight on (1 parameter, minutes)
    case 69: // Clear key buffer
    case 70: // Backlight off
    case 79: // Auto transmit keypress off
    case 85: // Set debounce time (1 paramater, time)
    case 96: // Auto repeat mode off
    case 152: // Set and save brightness (1 parameter, brightness)
    case 153: // Set backlight brightness (1 parameter, brightness)
    case 104: // Initialize horizontal bar
    case 109: // Initialize medium number
    case 110: // Initialize lange numbers
    case 111: // Place medium numbers
    case 115: // Initialize narrow vertical bar
    case 118: // Initialize wide vertical bar
    case 124: // Place horizontal bar graph (4 parameters, column, row, direction, length)
    case 126: // Set auto repeat mode (1 parameter, mode)
    case 145: // Set and save contrast (1 parameter, contrast)
    case 160: // Transmission protocol select (1 parameter, protocol)
    case 192: // Load custom characters (1 parameter, bank)
    case 164: // Setting a non-standart baudrate (1 parameter, speed)
    case 193: // Save custom character (3 parameters, bank, id, data)
    case 194: // Save startup screen custom characters (2 parameters, id, data)
    case 195: // Set startup GPO state (2 parameters, number, state)
    case 200: // Dallas 1-Wire
      switch (serial_getch()) {
      case 1: // Dallas 1-Wire transaction (6 parameters, flags, send, bits, receive, bits, data)
      case 2: // Search for a 1-Wire device
      default:
        break;
      }
      break;
    case 213: // Assign keypad codes
    default:
      /* All other commands are ignored
       and parameter byte is discarded. */
      temp = serial_getch();
      break;
    }
    return; // Stop and start again.
  }

  // Otherwise its a plain char so we print it to the LCD.
  lcd.write(rxbyte);
}

/*
* Waits for a byte to be available, reads and returns it.
*/
byte serial_getch() {
  while (Serial.available() == 0);

  return Serial.read();
}



Les caractères apparaisent

barbudor

#6
Apr 14, 2012, 06:57 pm Last Edit: Apr 14, 2012, 07:00 pm by barbudor Reason: 1
Je viens de monter la manip et le problème est là
Code: [Select]
 lcd.print((char)rxbyte);  //otherwise a plain char so we print it to lcd

Le sketch a été développé pour une version différente de l'IDE Arduino dans lequel la bibliothèque "Print" dont dérive "LiquidCrystal" avait une version différente de la fonction print()

Dans la version précédante print( byte ) était équivalente de print(char )
Alors que dans l'IDE 1.0, print( byte ) est devenu équivalent de print( int )
Donc le nouveau comportement est d'afficher la valeur de rxbyte plutot que le caractère représenté.

En ajoutant un cast (char)rxbyte on force l'affichage de rxbyte comme le caractère qu'il représente plutot que comme sa valeur (ie le code ASCII)

EDIT: Je viens de voir le nouveau code que tu as trouvé. Il utilise .write au lieu de .print
Or dans le code de Print.cpp, on trouve que print(char c) effectue un write(c)
C'est pour cela que le nouveau code marche aussi
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

ChefChaudard

Merci beaucoup pour cette réponse.

Naïvement, j'ai voulu intégrer cette fonctionnalité dans mon projet mais ça ne fonctionne pas.

Je suis entrain de réaliser un boitier de PC évolué. Il comporte entre autre un écran LCD permettant de paramétrer la tour, d'afficher les températures, les commandes de ventilateurs, etc. Toute cette partie est gérée par l'arduino.

Je suis tombé par hasard sur LCD Smartie et je me suis dis que ce serait une bonne idée de renvoyer également des informations systèmes en plus des autres.

Je pensais mettre tout le code servant à afficher les données du PC dans un switch case ou une condition if mais il s'avère que le programme ne reconnait plus les codes ainsi et plante à la compilation. Lorsque je fais un jeu de taquin de programmation, le programme ne dépasse plus le setup.

De plus je m'aperçois que la synchronisation série n'est pas robuste. Si je ferme LCD Smartie et que je le ré-ouvre, il y a de forte chance que le programme s'arrête au Setup.

Si je redémarre l'arduino, ca me fait bien souvent la même chose.

A priori, la meilleur solution est de mettre une carte arduino dédié à un LCD et alimentée par le port USB pour est synchronisé avec les signaux.

Je vais faire quelques tests en ce sens.

Merci encore pour ton aide !

barbudor

Je suis pas sur de comprendre mais il me semble que tu veux utiliser l'écran de 2 manières différentes dans le temps :
1) gérer les menus de l'application pour laquelle tu utilises un Arduino à l'origine
2) quand il ne sert pas pour l'usage ci-dessus, tu veux l'utiliser avec LCDSmartie

Si c'est çà, çà devrait pouvoir marcher.
Il faut que tu gère 2 cas dans ta loop et que tu fasse attention en passant d'un mode à l'autre.
Notamment quand tu reviens au mode Smartie, il faut
- vider le buffer série pour ignorer ce qui traine dedans qui est probablement incomplet
- te re-synchroniser sur l'affichage d'une nouvelle page. Peut être attendre la suite d'octets 254 (préfixe de commande) et 88 (commande effacement d'écran)

Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

ChefChaudard

Oui c'est ca. Afficher soit les informations issues de la carte arduino soit les informations issues du PC. J'ai mis le code dans une fonction if et à la compilation ça me mettais que des éléments n'était pas définis.

Après je t'avouerais que je maitrise pas du tout le code qui permet de faire l'affichage du PC et que les commandes utilisés sont assez obscures pour moi.

Je comprends pas que mettre tout le code de la fonction loop dans une fonction switch ou if génère des erreurs de compilation et que des commandes ne soient pas reconnues car non déclarées

Go Up