Pages: 1 [2] 3   Go Down
Author Topic: Problemi con programmino semplice  (Read 2129 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hai perfettamente ragione. Ma stai parlando un LCD, non di un computer. lui non sa "andare a capo", è fatto solo per mostrare una stringa, quindi sei tu che devi programmare l'atmega in modo da far credere all'utente che il LCD vada a capo et fronzoli vari
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Padova
Offline Offline
Full Member
***
Karma: 0
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quindi io potrei fare una cosa del genere:

if (inByte = '/n'){
   lcd.write('/n');
}else if (inByte = '/r'){
   lcd.write('/r');
}

confermi?
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

no, LCD NON sa cosa farsene dei tuoi a capo. Lui è fatto per essere usato come a battaglia navale, dando le coordinate X e Y, non sa niente di righe o menate varie, il massimo della sua intelligenza è andare di seguito se gli passi più valori (ma nnon penso nemmeno che sia l'LCD, mi sa che è la libreria). Quindi in pratica se ricevi un \r\n (in windows) un \n (in linux) o un \n\r (in mac) devi dire all'lcd di posizionarsi alla riga successiva usando il gioco della battaglia navale col cursore.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Padova
Offline Offline
Full Member
***
Karma: 0
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Perfetto, ho risolto grazie!
Questo è lo sketch finale:

Code:
#include <LiquidCrystal.h>

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

void setup() {
  lcd.begin(20,4);
  Serial.begin(1200);
}

void loop() {
 
  if (Serial.available()) {
    char inByte = Serial.read();
    switch (inByte) {
    case '\n':
      lcd.setCursor(0,0);
      break;
    case 'L':
      lcd.setCursor(0,1);
      lcd.write("L");
      break;
    case 'H':
      lcd.setCursor(0,2);
      lcd.write("H");
      break;
    case '\r':
      break;
    default:
      Serial.write(inByte);
      lcd.write(inByte);
      }
  }
}
Cosi facendo ho eliminato anche il problema della stringa che eccedeva la lunghezza dell'LCD quindi quando mi da la temperatura max (Hi) e min (Lo) vado su una nuova riga.
Ora devo trovare il modo di stampare tutto questo su carta... il problema è, non so perchè, che quando inserisco un comando di tipo printer.write(); non legge più la stringa ASCII ma mi da tutta una serie di 00X30 05X30 ecc ecc che in teoria dovrebbe essere un'altra forma di lettura del carettere ASCII giusto?
Logged

Padova
Offline Offline
Full Member
***
Karma: 0
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Problemino divertente: nel case ho distinto varie operazioni nel caso in cui entrino i caratteri 'L' 'H' '\n' e'\r'... la cosa divertente è che lui compie quelle operazioni anche se li vede come 72 74 10 o 13 ovvero i loro corrispettivi decimali! Come faccio per evitare questa cosa?
Per capirci voglio che vada a capo solo quando legge \r e non 13 perchè la mia stringa ASCII è alfanumerica e quindi sarebbe un disastro.
Grazie
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22817
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

\n è un carattere ESCAPE e quindi è equivalente al byte 13.
Logged


Padova
Offline Offline
Full Member
***
Karma: 0
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ho notato che al posto dello 0 (zero) mi mette degli spazi e spesso va a capo senza che effettivamente il dato fosse \r... com'è possibile???
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

00X30  e 05X30  sembrano valori esadecimali, ma quel 05 indica che prende 2 byte, quindi che probabilmente si tratta di UNICODE
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Padova
Offline Offline
Full Member
***
Karma: 0
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Secondo me dovrei leggere prima tutta la stringa di 32 caratteri e poi elaborarla (mandarla a LCD, stamparla o salvarla su SD).
Sapendo che la mia stringa ASCII inizia con 'k' e finisce con '\n' come potrei fare? Che ciclo potrei usare?
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

bhe anzichè mettere le cose nell'LCD potresti metterle in una array di 32 elementi di char, che ne dici? e se sostituisci il \n con \0 diventa una stringa vera e propria (\0 è il carattere di fine stringa), e quindi potrai giocarci con le funzioni strlen, etc.. oppure dare l'array in pasto alla classe String e usarlo con la classe String (te lo sconsiglio se vuoi capire bene questo concetto)
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Padova
Offline Offline
Full Member
***
Karma: 0
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

come posso sostituire \n con \0? Dallo strumento mi arriva sempre una stringa fissa che finisce con \n  smiley-confuse
Parli di questo array? http://arduino.cc/en/Reference/String
un char array giusto?
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

esatto, parlo di quel link.

Quote
come posso sostituire \n con \0?

if leggo \n allora salva nell'array \0 altrimenti salvaci il carattere letto smiley-mr-green
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Padova
Offline Offline
Full Member
***
Karma: 0
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Dunque... ho realizzato questo sketch:

Code:
void setup() {
  Serial.begin(1200);
 
}
String line = "";   
void loop() {
  if (Serial.available()) {
    char inByte = Serial.read();
    switch (inByte) {
    case '\n':
      Serial.println(line);     
      line = "";       
      break;
    default:
      line += inByte;                         
    }
  }
}

E fin qui tutto ok, a serial monitor ho la stringa precisa! I problemi iniziano quando provo a loggare la stringa su SD con questo sketch:

Code:
#include <SD.h>

const int chipSelect = 10;

void setup() {
  Serial.begin(1200);
  Serial.print("Initializing SD card...");
  pinMode(10, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");


String line = "";

void loop() {
  if (Serial.available()) {
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    char inByte = Serial.read();
    switch (inByte) {
    case '\n':
      if (dataFile) {
        dataFile.println(line);
        dataFile.close();
        Serial.println(line);     
        line = "";       
      } else {
          Serial.println("error opening datalog.txt");
        }
      break;
    default:
      line += inByte;                         
      }
  }
}

Appena inizializzata la sd si pianta e sul file txt non c'è nulla. Oppure a volte scrive qualcosa, un pò confuso ma pertinente, ma sul file trovo la stessa confusione. Cosa sbaglio?
La riga File dataFile = SD.open("datalog.txt", FILE_WRITE); ho provato a metterla altrove, magari nel setup ma non me lo compila, mi dice che dataFile non è dichiarato per quello scopo.
Logged

0
Offline Offline
Shannon Member
****
Karma: 131
Posts: 10474
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

l'errore è dato dal fatto che ad ogni open DEVE corrispondere una CLOSE. aggiusta il tuo codice di conseguenza.

Quote
mi dice che dataFile non è dichiarato per quello scopo.

si chiama visibilità delle variabili. una variabile nasce e muore all'interno del suo blocco, ovvero delle {}, e non può essere vista da cose al di fuori del suo blocco (salvo particolari casi) anche se "viva", però può essere vista dai "sottoblocchi". cerca visibilità delle variabili su wikipedia o google per magiori info.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Padova
Offline Offline
Full Member
***
Karma: 0
Posts: 197
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie, mi son studiato questo e credo di aver capio: http://it.wikipedia.org/wiki/Variabile_(informatica)
Ora però, nell'attesa di rimettermi sotto con la memorizzazione di questa stringa benedetta, sto provando a stamparla su stampante e la cosa si presenta assai problematica. Come consigliato ho creato un programma che prima di eseguire le operazioni di stampa mi crei la stringa. Il problema però, sebbene migliori, rimane.
Questo è lo sketch:
Code:
#include <SoftwareSerial.h>

#include <Adafruit_Thermal.h>

//#include <LiquidCrystal.h>

//LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int printer_RX_Pin = 8;  // this is the green wire
int printer_TX_Pin = 9;  // this is the yellow wire

Adafruit_Thermal printer(printer_RX_Pin, printer_TX_Pin);

void setup() {
  Serial.begin(1200);
  //lcd.begin(20,4);
  printer.begin();
}

String line = "";   

void loop() {
  if (Serial.available()) {
    char inByte = Serial.read();
    switch (inByte) {
    case '\n':
      Serial.println(line);     //print complete line
      //lcd.setCursor(0,0);
      //lcd.print(line);
      printer.println(line);
      line = "";        //reset to empty string
      break;
    default:
      line += inByte;                         //append inByte to the line String
    }
  }
}

Se io non uso la stampa tutto ok (anche se inizializzo la stampante). Nel momento in cui faccio partire la stampante mi omette parte della stringa (solitamente gli ultimi 2 o 3 caratteri) dopodichè inizia a sballare completamente il puntamento della stampa, sia su carta che su LCD. La stringa poi me la scrive anche correttamente, ma sballa tutti i puntamenti, come puoi vedere nella foto allegata.
Secondo te a cosa può essere dovuto?


* DSC00060.JPG (210.48 KB, 1080x1920 - viewed 14 times.)
Logged

Pages: 1 [2] 3   Go Up
Jump to: