Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Sistemi integrati - problema led cambia intensità continuamente ma non dovrebbe
Forum - Sistemi integrati - problema led cambia intensità continuamente ma non dovrebbe

Avatar
alex1995 (Normal User)
Expert


Messaggi: 294
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 13:37
Lunedì, 19/01/2015
buon giorno, sto facendo con arduino uno sketch che se il led è spento lo accende e se io continuo a tenere il pulsante premuto per un secondo lui abbassa l' intensità della luce del led, solo che il led si accende alla massima intensità e poi la diminuisce continuamente. il pulsante è una variabile siccome non ne ho uno al momento.
Codice sorgente - presumibilmente C++

  1. #include <SPI.h>
  2. #include <WString.h>
  3. #include <SD.h>
  4.  
  5. void setup()
  6. {
  7.   Serial.begin(9600);
  8.   pinMode(6, OUTPUT);
  9.   SD.begin(4);
  10. }
  11.  
  12. void scriviFile(char *nomeFile, String datiFile)
  13. {
  14.   File scriviFile = SD.open(nomeFile, FILE_WRITE);
  15.   if(scriviFile)
  16.   {
  17.     scriviFile.println(datiFile);
  18.     scriviFile.close();
  19.     Serial.write("ok");
  20.   }
  21.   else
  22.   {
  23.     Serial.write("errore scrivi\n");
  24.   }
  25. }
  26.  
  27. String leggiFile(char *nomeFile)
  28. {
  29.   String getFile = String();
  30.   File leggiFile = SD.open(nomeFile);
  31.   if(leggiFile)
  32.   {
  33.     while(leggiFile.available())
  34.     {
  35.       char fileChar = leggiFile.read();
  36.       getFile += fileChar;
  37.     }
  38.     leggiFile.close();
  39.     return getFile;
  40.   }
  41.   else
  42.   {
  43.     Serial.write("errore leggi\n");
  44.   }
  45. }
  46.  
  47. int StringContains(String s, String search)
  48. {
  49.   //s.replace("Ú", "");
  50.   int max = s.length() - search.length();
  51.   int lgsearch = search.length();
  52.  
  53.   for (int i = 0; i <= max; i++)
  54.   {
  55.     if (s.substring(i, i + lgsearch) == search) return i;
  56.   }
  57.  
  58.   return -1;
  59. }
  60.  
  61. void loop()
  62. {
  63.   String leggifile = String(leggiFile("file.txt"));
  64.   int pulsante = 1;
  65.   if(pulsante == 1)
  66.   {
  67.     if(StringContains(leggifile, "off"))
  68.     {
  69.       digitalWrite(6, HIGH);
  70.       SD.remove("file.txt");
  71.       scriviFile("file.txt", "on");
  72.       delay(1000);
  73.     }
  74.   }
  75.   String leggifile2 = String(leggiFile("file.txt"));
  76.   if(pulsante == 1)
  77.   {
  78.     if(StringContains(leggifile2, "on"))
  79.     {
  80.       analogWrite(6, 64);
  81.       SD.remove("file.txt");
  82.       scriviFile("file.txt", "25p");
  83.     }
  84.   }
  85. }



dove sbaglio?

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 14:24
Lunedì, 19/01/2015
Testo quotato

Postato originariamente da alex1995: il pulsante è una variabile siccome non ne ho uno al momento.


Puoi usare due cavi in corto per i test.

Comunque come mai cosi tanti accessi al file su SD per le verifiche? Per organizzare le sequenza temporali non usare delay, facendo cosi "freeze" il micro, adopera la funzione millis() che ti fa capire bene quanto tempo sia trascorso senza bloccare i controlli, poi te la cavi con un paio di variabili.
In loop verifichi che il pulsante sia premuto, prendi il tempo e ti segni che è stato premuto, continui a verificare che sia tenuto premuto e simultaneamente controlli il tempo passato, allo scadere del secondo o quando il pulsante risulta non più premuto, esci dal ciclo e ti comporti di conseguenza, è passato un secondo? abbasso la luminosità se no ritorno ai controlli.


PM Quote
Avatar
alex1995 (Normal User)
Expert


Messaggi: 294
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 17:48
Lunedì, 19/01/2015
grazie :D

PM Quote