Buonasera. Provo a sintetizzare. Praticamente, le stringhe in oggetto sono dei titoli di canzoni che immetto da tablet da un'app creata con App inventor ( non è app inventor il problema), la quale trasmette diverse cose via bluetooth, compreso il titolo che va sulla seriale di Arduino e poi finalmente sull' LCD 1602. Premetto che il display è collegato ad Arduino correttamente, infatti riesco a visualizzare tranquillamente "Hello World" con lo sketch che si trova in giro. Il titolo da trasmettere è in coda a 4/5 info che l'app trasmette e quando è il turno del titolo, faccio precedere questo da un carattere di riconoscimento, questo '^' scrivendo quindi il seguente doppio controllo
if (ch == '^') { // nel loop
lcd.print("ciao");
Serial.println("ciao");
}
Ora, succede che "ciao" appare sul monitor seriale, il che mi conferma la lettura di '^' e quindi il carattere di riconoscimento di inizio "titolo", ma il "ciao" non appare sul 1602.
sono circa 18 pagine di codice e pensavo di circoscrivere il problema. Magari vedo se riesco ad estrapolare una parte significativa. Adesso mi succede che l'inserimento del seguente codice mi riavvia Arduino:
char ch;
char songname[15];
lcd.begin(16,2);
lcd.clear();
if (ch == '^' )
{ i=0;
lcd.setCursor(0,1);
while (ch != 'X') { // X carattere di fine titolo
songname*= Serial.read();*
_ lcd.print(songname*);_ _ Serial.println(songname); i=i+1; } }*_
**>blecmur: **ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice (... anche se di poche righe) all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie,
Così come lo hai scritto, quel pezzo di codice fa aumentare indefinitamente il valore di i.
Entri nel while con ch = '^' e tale rimarrà, quindi la condizione del while che ch sia diverso da 'X' sarà sempre vera.
gpb01:
**>blecmur: ** ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice (... anche se di poche righe) all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra). Grazie,
Guglielmo
ti chiedo scusa, ma in realtà ho cercato i tag Code ma non li ho trovati il modo. Non ho capito sull'editare...non era mia intenzione modificare un mio post ma rispondevo a te, anche se non ho quotato come si deve. Ma immagino che io non abbia capito quel che intendevi dirmi.
blecmur:
ti chiedo scusa, ma in realtà ho cercato i tag Code ma non li ho trovati il modo. Non ho capito sull'editare...non era mia intenzione modificare un mio post ma rispondevo a te, anche se non ho quotato come si deve. Ma immagino che io non abbia capito quel che intendevi dirmi.
Se segui alla lettera quello che ti ho scritto ... non puoi sbagliare, ci sono tutte le indicazioni ...
Scusate ma avevo fatto un Quick Reply e non mi comparivano tutte le possibilità
#include <LiquidCrystal.h>
String titolo;
if (ch == '<') { //song name starts after this
titolo = ""; //empty the variable
for (int i=0; i<99; i++) { //counter to make sure you don't get stuck in an infinite loop
char ch2 = Serial.read(); //read the serial, and store to ch2
if (ch2 == '>') //last character of the transmission, so break
break;
else //otherwise, add the character to the song name
titolo += ch2;
}
lcd.begin(16,2);
lcd.clear();
lcd.setCursor(0,1);
lcd.print(titolo);
//Serial.println(titolo);
}
Edit:
Sul Serial Monitor leggo la stringa contenuta in"titolo", ma con lcd.print (titolo) non la scrive sul display LCD, sul quale non appare niente
Visto che stai leggendo dalla seriale anziché utilizzare il for non potresti utilizzare anche un while che garantisca anche che i dati sulla seriale siano presenti? E poi al posto del tipo String utilizzare un array di char e raggiunto il carattere fine titolo mettere il terminatore. Una cosa del tipo:
fabpolli:
Visto che stai leggendo dalla seriale anziché utilizzare il for non potresti utilizzare anche un while che garantisca anche che i dati sulla seriale siano presenti?
Il codice di cui sopra è preceduto da un controllo sulla seriale, cioè se sulla seriale c'è qualcosa [ if( Serial.available()) ] allora viene eseguito, altrimenti lo salta.
fabpolli:
E poi al posto del tipo String utilizzare un array di char e raggiunto il carattere fine titolo mettere il terminatore.
provato ma non cambia nulla. Stavo pensando che magari la libreria non fosse la LiquidCrystal.h ma quella IC_2 ? Però avevo anche letto che la per la seconda bastavano 2/3 pins per collegare il 1602 mentre io ne ho usati 12.
Edit:
cosa strana (per me) è che se lcd.print("ciao") lo metto nel setup, sul display viene visualizzato "ciao", se lo metto all'interno della funzione no, come se non passasse dalla funzione, e invece ci passa
sono ancora quello delle banalità... ma il lcd.begin() lo esegui ogni ciclo del loop()? e anche il lcd.clear()?
il begin credo vada messo una sola volta all'inizio nel setup() per inizializzare il lcd...
poi col clear() in ogni loop rischi l'effetto sfarfallio...
fratt:
sono ancora quello delle banalità... ma il lcd.begin() lo esegui ogni ciclo del loop()?
nel setup
fratt:
e anche il lcd.clear()?
nel loop, ma solo per il fatto che se il titolo successivo è più corto, rimarrebbe una parte di quello precedente per cui preferirei azzerare tutto a costo di avere uno sfarfallio...che magari ci fosse ma non vedo niente
Prova a togliere la clear dal loop, se è quella a non farti visualizzare nulla è già un inizio, alla peggio per titoli più corti vedrai caratteri errati ma di questo ci si può occupare poi, intanto verifichiamo se è la clear il problema
Per essere, le parole vengono anche inviate ma appare anche quel carattere "ÿ" ripetuto che non capisco da dove provenga
#include <LiquidCrystal.h>
#include <USB.h>
#include <usbh_midi.h>
LiquidCrystal lcd(12, 11, 8, 7, 6, 5);
USB USB;
USBH_MIDI Midi(&USB);
String titolo;
void setup()
{
Serial.begin(115200); //start serial
lcd.begin(16, 2);
if (USB.Init() == -1) // QUESTA RIGA E LA SUCCESSIVA
{while(1);} // CAUSANO IL PROBLEMA
} // end void setup
void loop() {
if( Serial.available()) { //check for serial
char ch = Serial.read(); //serial message
if (ch == '<') { //song name starts after this
titolo = ""; //empty the variable
for (int i=0; i<99; i++) { //counter to make sure you don't get stuck in an infinite loop
char ch2 = Serial.read(); //read the serial, and store to ch2
if (ch2 == '>') //last character of the transmission, so break
break;
else //otherwise, add the character to the song name
titolo += ch2;
}
//lcd.clear();
lcd.setCursor(0,0);
lcd.print(" ");
lcd.print(titolo);
Serial.println(titolo);
}
}
}
[Code\]
Non sono pratico di moduli BT, hai fatto una prova ad abbassare la velocità a 9600 tanto per probvare se non fosse quello? Arduino e BT come seriale sono configurati allo stesso modo (baud rate, parità, ecc.)?
Ultima cosa io dopo aver fatto la print dei carattiri space per svuotare riposizionerei il cursore di nuovo a 0,0 altrimenti il titolo partirebbe da dopo gli spazi (Almeno nel mio fa così)