Go Down

Topic: cosa c'è di sbagliato in questo codice!?! (Read 463 times) previous topic - next topic

andreaTECHE

ragazzi non so come far scrivere più variabili sul lcd.
le variabili sono gli angoli dei servo.
Code: [Select]

lcd.print(leg_M1,leg_M2,leg_M3,leg_M4,leg_M5);

SukkoPera

Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

andreaTECHE


gpb01

#3
Nov 14, 2017, 09:18 pm Last Edit: Nov 14, 2017, 09:18 pm by gpb01
volevo fare tutto con una riga di codice
Tu puoi volere quello che vuoi, ma, se la sintassi del metodo chiamato NON lo prevede ...
... sempre errori avrai  :smiley-mr-green:

Guglielmo
Search is Your friend ... or I am Your enemy !

andreaTECHE

Tu puoi volere quello che vuoi, ma, se la sintassi del metodo chiamato NON lo prevede ...
... sempre errori avrai  :smiley-mr-green:

Guglielmo
a ok!
quindi il display lcd 16x2 non può contenere 5 variabili, in un unico comando.
mannaggia

gpb01

quindi il display lcd 16x2 non può contenere 5 variabili, in un unico comando.
Il display NON ha nulla a che vedere ...
... chi ha scritto la libreria che usi ha preso alcune decisioni, tra cui quali "metodi" scrivere che tu puoi chiamare. 

Tali metodi hanno una ben precisa sintassi, quindi, se l'autore ha dettato certe regole, occorre rispettarle.

Che poi, se tu sei in grado di farlo, ti metti li e scrivi una nuova libreria che implementa un comando per stampare N variabili ...
... beh, buon lavoro ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

Per quale motivo vorresti fare tutto con una riga sola?
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

ORSO2001

potrebbe "aggiungere" alla (sua) libreria un/alcuni metodo/i con va_arg ... sai che bei rompicapo!?  :D

Io_me

Oppure la cosa si può fare usando funzioni della libreria, quindi senza toccarla
Si crea una funzione che accetta in ingresso i puntatori alle variabili da stampare, e lei le stampa una ad una.
Nella loop() appare una sola riga, ma non credo sia conveniente dal lato spazio e complicazioni di codice.
Inoltre il numero di variabili possibili é fisso, e ci deve essere un esclusione dei puntatori a 0, presenti in caso di richieste eccessive.
Per fare si fa, per essere conveniente non lo é

torn24

#9
Nov 15, 2017, 08:38 am Last Edit: Nov 15, 2017, 08:44 am by torn24
Non c'è bisogno di scomodare i puntatori in questo caso :)
Se proprio vuoi fare tutto con una sola riga di codice, ti potresti creare tu una funzione stampa() che riceve i dati che vuoi stampare, e al suo interno chiamerai tante volte il metodo print con le varie variabili.
Una funzione di questo tipo non da nessun beneficio, sennò usare nel restante codice una sola riga per stampare più variabili.



astrobeed

La soluzione più semplice è usare sprintf() per inserire in un array di 16 elementi i dati, con la possibilità di formattarli a piacere, e poi inviarlo al display con una singola lcd.print().
Scientia potentia est

Datman

#11
Nov 15, 2017, 04:15 pm Last Edit: Nov 15, 2017, 04:26 pm by Datman
Nel mio contatore geiger per visualizzare ore, minuti e secondi ho usato String:
Code: [Select]
// oref, minutif e secondif sono ore minuti e secondi formattati in stringhe a 2 caratteri
//  mettendo uno spazio prima se il valore è di una sola cifra, cioè minore o uguale a 9.
ore=int(S/3600);
if(ore>9) oref=String(ore); else oref=" "+String(ore);

minuti=int((S%3600)/60);
if(minuti>9) minutif=String(minuti); else minutif=" "+String(minuti);

secondi=(S%3600)%60;
if(secondi>9) secondif=String(secondi); else secondif=" "+String(secondi);

if      (S<60)         lcd.print("   "+secondif+"s");
else if (S<3600) lcd.print(minutif+"m"+secondif+"s");
else                 lcd.print(oref+"h"+minutif+"m");
Allo stesso modo, per visualizzare più valori con un solo lcd.print (giustamente, perché impiega del tempo e rallenta il ciclo: è bene, quindi, scrivere solo se c'è qualche variazione oppure una volta ogni secondo o anche più secondi), puoi scrivere:
lcd.print(String(valore1)+String(valore2)+String(valore3)+String(valore4));
Hi, I am Gianluca from Roma. I play and work with electronics since I was 16 (1984).
After 25 years of maintenance on cameras and video mixers, since 2013 my job is HD TV studios design.
In Jan 2015 I began playing with Arduino.

gpb01

#12
Nov 15, 2017, 04:19 pm Last Edit: Nov 15, 2017, 04:19 pm by gpb01
...
lcd.print(String(valore1)+String(valore2)+String(valore3)+String(valore4));
Per carità, lascia stare la classe String !!!

Guglielmo
Search is Your friend ... or I am Your enemy !

Datman

Hi, I am Gianluca from Roma. I play and work with electronics since I was 16 (1984).
After 25 years of maintenance on cameras and video mixers, since 2013 my job is HD TV studios design.
In Jan 2015 I began playing with Arduino.

gpb01

Certo che funziona, ci mancherebbe pure, ma dimentichi che ...

... NON sei su un PC dove c'è un sistema operativo ed un "garbage collector", sei su una piccola MCU con solo 2KBytes di SRAM, dove devi fare tutto tu e dove usare la classe "String", a causa dell'allocazione e riallocazione dinamica della memoria, porta quasi sempre ... a grossi problemi e sicuri mal di testa !!!   :smiley-evil:

Quello che occorre fare è imparare ad usare bene le stringhe classiche del C e le funzioni che trovi nella libreria standard (... che, oltretutto, è automaticamente inclusa dal IDE) AVR libc ed, in particolare, quanto è in <string.h> ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up