[RISOLTO] Serial println dopo un po impazzisce

Ciao!!

sono nuovo del forum, e in realtà ho iniziato a smanettare con arduino solo da ieri.. quindi la domanda che sto per farvi sarà magari banale, comunque ringrazio in anticipo chi avrà voglia di rispondermi.

Allora, rilevo dei problemi col comando Serial.println, infatti, mentre in un primo momento funziona tutto correttamente, dopo un po (circa 30 secondi) inizia a impazzire, sputandomi fuori numeri a caso..

mi spiego meglio: io sto costruendo un contagiri, per ora voglio che arduino invii la velocità angolare al pc, con tempo di campionamento 0.5 sec.

per i primi 30 sec va tutto bene, poi inizia a dare una sfilza di zeri, come se campionasse ogni millisecondo o cose del genere....
secondo voi come mai? qualcuno ha avuto lo stesso problema?

grazie a tutti, ciao!

Tommaso

mi ero dimenticato di aggiungere che, ogni volta che inizia ad "impazzire", la ventola del PC si attiva, come se stesse anche iniziando a consumare piu risorse...

aggiungo infine, che uso un vecchio PC 32 bit con Ubuntu.

Ciao!

Tommaso

tommaso_spezia:
secondo voi come mai?

per fare i programmi ci vuole un po' di logica, anche per fare le domande però .... secondo te come potremmo risponderti ... non ti dico cosa ci servirebbe per valutare il problema, lo devi capire da solo :slight_smile:

ciao

Pablos non essere scortese :wink:
L'aiuto glielo do io: eccolo :smiley:

ehm.... :blush:

in effetti avevo tralasciato un dettaglio.. eccolo!!

const int LED = 13;
const int REED = 7;

int val = 0;
int cont = 0;
int accendiled = 0;
int tempozero = 0;
int velocita = 0;

void setup() {
  pinMode(LED,OUTPUT);
  pinMode(REED,INPUT);
  Serial.begin(9600);
}

void loop()

{
  val = digitalRead(REED);
  
  if (val == HIGH)
  {
    if (accendiled == 0)
      {
      accendiled = 1;
       }
  }
  else
  {
     if (accendiled == 2)
      {
      accendiled = 0;
       }
  }
    
  if (accendiled == 1)
      {
      accendiled = 2 ;   
      digitalWrite(LED,HIGH);
      cont = cont+1;
      digitalWrite(LED,LOW); 
       }
    
    if (millis()-tempozero >= 500)
     {
      velocita = cont/(6*0.5) ;
      Serial.println(velocita);
      tempozero = millis() ;
      cont = 0 ;
      }
   }

Leggi cosa ritorna la millis() sopratutto che tipo di dato e la sua dimensione.

Un altro consiglio, quando hai finito di scrivere il codice, usa nell'IDE di Arduino la voce di menu "Formattazione automatica (Ctrl+T)"

int velocita = 0;
velocita = cont/(6*0.5) ;

ma velocita non dovrebbe essere un float?

nid69ita:
millis() - Arduino Reference
Leggi cosa ritorna la millis() sopratutto che tipo di dato e la sua dimensione.

Un altro consiglio, quando hai finito di scrivere il codice, usa nell'IDE di Arduino la voce di menu "Formattazione automatica (Ctrl+T)"

dunque, la formattazione automatica non da alcun effetto.
ho provato a mettere, al posto di

Serial.println(velocita)

la riga (era questo che intendevi?)

Serial.println(millis())

ha lo stesso comportamento (cioè all'inizio tutto ok: mi da valori sequanziali multipli di 500, ma quando si arriva intorno a 31000 mi da una fila compulsiva di zeri...)

ah un altra cosa, avevo provato a mettere

Serial.println(veocita,HEX)

e dopo un po mi uscivano dei valori strani composti in parte da numeri ed in parte da lettere... ???

il float.. non saprei se usarlo, perchè ho letto occupi molta memoria: per ora il codice è molto scarno, ma in futuro dovrà pilotare anche altre cose, percui preferirei usare int che, comunque, ha un range di valori assolutamente idonei

grazie!

Tommaso

Tommaso se dichiari la variabile velocita come intero

int velocita = 0;

non puoi pretendere poi di effettuare operazioni con i decimali

velocita = cont/(6*0.5) ;

quindi ti stanno suggerendo di fare

float velocita = 0;

intanto risolviti il problema, poi pensi alla memoria no? :wink:

Ti aiuto ancora un pò:
il problema stà qui:
tempozero = millis();

Tu scrivi il valore della millis() dentro a una variabile. Verifica cosa ritorna la millis() e quanto è grande la tua variabile....
Praticamente ovunque hai dichiarato variabili e costanti con int.

Questo non è un problema
const int LED = 13;
ma sarebbe meglio
const byte LED = 13;

novità:

ho cambiato la variabile "tempozero" che era formattata come int, e l'ho imposta come "unsigned long" (da stessa di millis)

non cambiava nulla

percui ho provato anche a mettere la velocità come float, e in questo modo funziona!!!!

ma quindi scusate l'ignoranza, ma se io ho delle operazioni su una variabile questa deve essere per forza float?

ok ho letto ora le altre risposte..

grazie a tutti, metto "risolto" al topic!!

si vede che, preso dalla fotta di smanettare, non ho ancora una base teorica, eh? :wink:

a presto!

Tommaso

Tieni conto che anche la tempozero come int ti avrebbe dato problemi.

Una int contiene al massimo da -32768 a +32767 e 0 +65535 se unsigned int.
Tu leggi la millis() che ritorna unsigned long. Alla partenza del micro hai cifra piccola (1234, 1740, 2200...) ma ben presto superi i 32767
(dopo circa 32 secondi)