Vai al contenuto
PLC Forum


millis concatenato


kemosabe

Messaggi consigliati

 

no, fa il  primo ciclo e si ferma lo stesso,

Sostituisci strip.numPixels() con un numero noto (es. 3). Se si ferma lo stesso c'è qualche problema o nella libreria che stai usando (che non conosco, neopixel o simili?) o a livello hardware. Casomai, se non è enorme, posta il codice completo, è più facile fare un analisi.

 

Ciao, Ale.

Link al commento
Condividi su altri siti


  • Risposte 91
  • Created
  • Ultima risposta

Top Posters In This Topic

  • kemosabe

    30

  • Livio Orsini

    22

  • ilguargua

    21

  • GiRock

    6

 

{i=0;}

Scusate l'ignoranza ..(con l'occasione magari si attacca qualcosa anche sui miei due neuroni ) , la sintassi del linguaggio concede /obbliga l'uso di queste parantesi per la variabile '' i '' ?

Link al commento
Condividi su altri siti

 

il fatto è che leggendo vari libri, sempre da solo, ti spiegano solo alcune cose, quasi sempre solo le cose di base.

Vorrei farvi capire, che come funziona un delay o un millis, credo di averlo compreso.Le mie domande sono rivolte, per comprendere come funziona sto " contenitore " di nome void.

Vedo che continui a interpretare male il termine "void" nonostante ti sia stato spiegato in tanti modi.
Il concetto di funzione è proprio un concetto di base, i libri che dici di aver letto spiegano tali concetti di base, ma evidentemente non ti sono ancora chiari.
Una funzione non è un contenitore (lo è una variabile in un certo senso), e void non è il suo nome: ad esempio in "void loop()", 'void' è il tipo restituito dalla funzione, il nome della funzione è 'loop'.

 

Nel codice che hai inserito più avanti, che cosa dovrebbe succedere mettendo i=0?

Il codice non è completo, si può solo intuire in parte il comportamento. Cosa fa la funzione strip.setPixelColor()?

Link al commento
Condividi su altri siti

 

la sintassi del linguaggio concede /obbliga l'uso di queste parantesi per la variabile '' i '' ?

Specifichiamo (visto che è rimasto nell'altra pagina) che quello che hai citato è un costrutto che viene dopo un if, anzi vai, riscriviamolo che è meglio :

if(a <= b){c = 0;}

In questo caso specifico le parentesi graffe possono essere omesse, cioè puoi scrivere :

if(a <= b) c = 0;

In sostanze le graffe servono per raggruppare il codice da eseguire se la condizione di if è vera, quindi se hai più di una istruzione diventano obbligatorie. Questo ha a che vedere su come il compilatore interpreta il codice, se vuoi ne parliamo più in dettaglio, ma è scarsamente utile è non inerente questa discussione.

 

Ciao, Ale.

Modificato: da ilguargua
Link al commento
Condividi su altri siti

Forse vuoi che i LED si accendano e spengano continuamente e ciclicamente, allora modifica il codice postato così:

 

void loop() {
  int i;

  // qui i è già impostata a 0
  for(i=0;i<strip.numPixels();i++){
    strip.setPixelColor(i, strip.Color(255,255,255)); // Moderately bright green color.
    strip.show(); // This sends the updated pixel color to the hardware.
    delay(delayval); // Delay for a period of time (in milliseconds).

    // questa condizione non si verifica mai in questo punto
    //if (i>=strip.numPixels()) i=0;

    strip.setPixelColor(i, strip.Color(0,0,0));
    strip.show();
    delay(delayval); // Delay for a period of time (in milliseconds).
  }

}

 

Se invece vuoi che prima si accendano tutti e poi si spengano tutti ciclicamente, allora fai così:

 

void loop() {
  int i;

  // qui i è già impostata a 0
  for(i=0;i<strip.numPixels();i++){
    strip.setPixelColor(i, strip.Color(255,255,255)); // Moderately bright green color.
    strip.show(); // This sends the updated pixel color to the hardware.
    delay(delayval); // Delay for a period of time (in milliseconds).
  }

  for(i=0;i<strip.numPixels();i++){
    strip.setPixelColor(i, strip.Color(0,0,0));
    strip.show();
    delay(delayval); // Delay for a period of time (in milliseconds).
  }

}

 

Link al commento
Condividi su altri siti

kemosabe come vedi ci sono differenti modi per risolvere lo stesso problema.

I tutorials forse li hai letti male.e studiati peggio. E una questione di metodo si leggono dalla prima riga in avanti senza saltare una virgola ed eseguendo tutti gli esercizi proposti, anche se sembrano inutili. Non si passa al capitolo successivo se non si è sicuri di aver capito ed inteiorizzato il capitolo precedente. Al limite lo studia daccapo.

 

Come per tutti quelli della mia generazione, se frequnetavi la scuola media il latino era obbligatorio, ed era considerato una grandissima rottura di corbelli; io poi ero a scuola in un collegio di preti, quindi il latino era praticamente la lingua ufficiale.

Quando, molti anni dopo, iniziai lo studio dell'informatica benedissi la formazione avuta con lo studio del latino che, essendo una lingua estramemente logica e conseguente, mi aveva formato all'uso della logica ed alla disciplina.

Per mettere a punto un programma non si può e non si deve saltabeccare qua e la facendo prove alla pene di molosso. Si sceglie una linea e la si porta a termine disciplinatamente e secondo logica.

 

Ti suggerisco un metodo, semplice e facile da implementare, perverificare come evolve il tuo programma.

 

void setup() 
{

......
  Serial.begin(9600);
......

 

nella routine di inizializzazione inserisci questa riga, serve ad inizializzare la linea seriale.

 

Poi, se vui vedere se il programma passa o meno da una locazione e se una variabile assume io valore che immagin

i, scrivi:

 

  for( i=0;i<strip.numPixels();i++){
    strip.setPixelColor(i, strip.Color(255,255,255)); // Moderately bright green color.
    strip.show(); // This sends the updated pixel color to the hardware.
    delay(delayval); // Delay for a period of time (in milliseconds).
     Serial.print("contatore i = ");
     Serial.println(i);
     if (i>=strip.numPixels()){i=0;}
  }
 
     Serial.print("contatore i = ");
     Serial.println(i);
 strip.setPixelColor(i, strip.Color(0,0,0));
  strip.show();

Una volta lanciato il programma premi "ctrl + shift + m" e ti appare la finestra del terminale seriale (c'è anche il comando nel menù "Strumenti" dell'IDE di arduino).

A ogni passaggio ti apparrirà una riga con scritto "contatore i = xx.

In questo modo, ad esempio, monitori l'incremento del contatore del ciclo di for e verifichi che il programma esca dal ciclo e che esca in modo corretto.

 

Puoi mettere diverse righe per stampare differenti condizioni e verifica se e come il programma passa da una determianta locazione.

 

Di solito quando si sviluppano Sw con micro e si usano InCercuit device, lo fai con lo strumento mettendo break points, ma questa è un'altra storia.

 

 

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

#include <Adafruit_NeoPixel.h>


// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            6

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      24

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 500; // delay for half a second

void setup() {
 
  pixels.begin(); // This initializes the NeoPixel library.
}

void loop() {

  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

  for(int i=0;i<NUMPIXELS;i++){

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(255,255,255)); // Moderately bright green color.

    pixels.show(); // This sends the updated pixel color to the hardware.

    delay(delayval); // Delay for a period of time (in milliseconds).

  }
}

io sono partito da questo, che è un esempio messo nella libreria ADAFRUIT NEOPIXEL.

lui dopo il caricamento, spegne tutti i led, fa il ciclo di accensione di un led bianco uno dopo l'altro fino a 24, e poi basta, resta tutto acceso ma si ferma li.

Per quel motivo speravo che mettendo un if( i>=NUMPIXELS){i=0;},    potesse ripartire.

 

 

 

P.S. allora se metto un IF loop ecc, sono funzioni...........come devo chiamare .... void........void setup........void loop????????

 

grazie

Link al commento
Condividi su altri siti

 

allora se metto un IF loop ecc, sono funzioni...........come devo chiamare .... void........void setup........void loop????????

 

Chiamale setup, loop, pixle.show, etc. sono tutte funzioni. poi ci sono i cicli "for" e "while" ed i test "if  .... else"

 

Non so cosa c'è nella libreria Adafruit, però così cone è il loop si ripete all'infinito.

prova a mettere le righe di tracciatura come ti ho suggerito prima.

Link al commento
Condividi su altri siti

 

lui dopo il caricamento, spegne tutti i led,

Non conosco ne la libreria ne il tipo di hardware, ma presumo che questo accada nel setup, con pixels.begin().

 

 

fa il ciclo di accensione di un led bianco uno dopo l'altro fino a 24, e poi basta, resta tutto acceso ma si ferma li

No, se l'hardware e la libreria funzionano, lui continua ada accendere in sequenza tutti e 24 i led, solo che sono già accesi e non noti la differenza. Prova a fare un debug con la seriale come ti ha suggerito Livio, oppure falli accendere con colori random, allora dovresti vedere la differenza, es. modifica la riga di accensione così :

pixels.setPixelColor(i, pixels.Color(random(10,255),random(10,255),random(10,255)));

 

Ciao, Ale.

Link al commento
Condividi su altri siti

ho messo le righe di lettura, e conta da i =0 fino a i=24

poi ricomincia, solo che non vedo lo spegnimento dei pixel.

Quindi deduco, che effettivamente lui continui a far ciclare l'accensione dei led, solo che non spegnendosi non lo vedo.

ok, adesso sto facendo alcune prove per capire come far spegnere tutti i led contemporaneamente, perchè la riga sotto " strip.setPixelColor(i, strip.Color(0,0,0));
  strip.show(); "

 

non funziona..

 

grazie

 

p.s. ok ho capito la parola funzioni, allora per il void cosa uso? contenitore????

Link al commento
Condividi su altri siti

 

allora per il void cosa uso? contenitore????

NOO!

void è vuoto, nulla, niente. E' un aggettivo che specifica che la funzione non ritorna alcun valore.

Va bene che sei anziano, ma così è approfittarsene:smile:

 

void loop() {

  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

  for(int i=0;i<NUMPIXELS;i++){

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(255,255,255)); // Moderately bright green color.

    pixels.show(); // This sends the updated pixel color to the hardware.

    delay(delayval); // Delay for a period of time (in milliseconds).
    pixels.Color(0,0,0);
    pixels.show();
    delay(1000);                           
  }
}

Prova così, però non so come lavora quella libreria, quindi potrebbe anche non funzionare.

Nelciclo di lavoro cosa vedi? vedi i LEDs che si acendono e spengono? discrivi un po'mcosa vedi

Link al commento
Condividi su altri siti

 

allora per il void cosa uso?

void, come int, long, float, char etc. è un tipo di dato. A seconda del tipo, un dato occupa più o meno memoria (in byte). Nel linguaggio C (e nel C++) usato nell'Arduino il tipo di dato è fondamentale e va sempre specificato nella dichiarazione. Quindi, ad esempio nel caso di void setup(), puoi dire cha la funzione setup() è di tipo void.

 

Ciao, Ale.

Link al commento
Condividi su altri siti

con l'ultima modifica non cambia nulla, ovvero

dopo il caricamento si spegne tutto, poi parte la sequenza  ma rimane tutto acceso.

Con la modifica di Ale, continua a cambiare i colori in successione, ma non si spengono mai.

cosa posso cercare nella libreria per vedere come spegnere i led?

 

 

grazie 

 

p.s.  ok capito, grazie Ale

Modificato: da kemosabe
Link al commento
Condividi su altri siti

fin qui tutto bene.

il mio scopo primario era quello di trasformare un listato come questo:

#include <Adafruit_NeoPixel.h>
#include <EEPROM.h>

#define SWITCH 0
#define PIN 1


Adafruit_NeoPixel strip = Adafruit_NeoPixel(50, PIN, NEO_RGB + NEO_KHZ800);


void setup() {
   strip.begin();
  strip.show(); // Initialize all pixels to 'off'

  // initialize the SWITCH pin as an input.
  pinMode(SWITCH, INPUT);
  // ...with a pullup
  digitalWrite(SWITCH, HIGH);
}

#define MODE_ADDR 0
#define N_MODES 4

void loop() {
  uint8_t mode = EEPROM.read(MODE_ADDR) % N_MODES;
  switch (mode) {
    case 0:
      singleColor(strip.Color(192, 0, 255)); // purple
      break;
    case 1:
      twinkle(strip.Color(0, 0, 255), strip.Color(255, 255, 255), 50);
      break;
    case 2:
      rainbowCycle(20);
      break;
    case 3:
      colorBlink(50);
      break;
  }
  mode = (mode + 1) % N_MODES;
  EEPROM.write(MODE_ADDR, mode);
}

bool buttonPressed() {
  bool pressed = false;
  while (! digitalRead(SWITCH))
    pressed = true;
  return pressed;
}

// Fill the dots with a color
void singleColor(uint32_t c) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c);
  }
  strip.show();
  while (! buttonPressed())
    ;
}

#define MAX_TWINKLE 5

void twinkle(uint32_t c1, uint32_t c2, uint8_t wait) {
  int16_t tw[MAX_TWINKLE];

  for(uint16_t i=0; i<strip.numPixels(); i++) {
    strip.setPixelColor(i, c1);
  }
  strip.show();

  for (uint8_t i = 0; i < MAX_TWINKLE; i++) {
    tw[i] = -1;
  }

  for ( ; ; ) {
    for (uint8_t i = 0; i < MAX_TWINKLE; i++) {
      if (tw[i] >= 0)
        strip.setPixelColor(tw[i], c1);
      tw[i] = random(strip.numPixels());
      strip.setPixelColor(tw[i], c2);
      strip.show();
      delay(wait);
      if (buttonPressed())
        return;
    }
  }
}

void colorBlink(uint8_t wait) {
  uint16_t i;
  uint8_t hue;
  uint32_t c;
  while (! buttonPressed()) {
    i = random(strip.numPixels());
    hue = random(256);
    c = Wheel(hue);
    strip.setPixelColor(i, c);
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for ( ; ; ) {
    for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
      for(i=0; i< strip.numPixels(); i++) {
        strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
      }
      strip.show();
      delay(wait);
      if (buttonPressed())
        return;
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if(WheelPos < 85) {
    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

in un ciclo continuo ma senza il consenso dello SWITCH, per attivare i vari passaggi in automatico.

Come sempre vi chiedo di non darmi soluzioni, ma di capire come posso arrivarci....forse.....

grazie

 

Link al commento
Condividi su altri siti

 

il mio scopo primario era quello di trasformare un listato come questo:

Prima un suggerimento importante : togli subito quell'EEPROM.write dal loop()!! La EEPROM ha un numero limitato di cicli di scrittura, poi non ci puoi più scrivere, e tieni conto che il loop() di un programma può essere eseguito anche migliaia di volte al secondo! Spiega perchè ti è necessario scrivere il dato nell'EEPROM, poi guardiamo di trovare una soluzione.

 

 

Ciao, Ale.

Link al commento
Condividi su altri siti

 

Prima un suggerimento importante : togli subito quell'EEPROM.write dal loop()!! La EEPROM ha un numero limitato di cicli di scrittura, poi non ci puoi più scrivere, e tieni conto che il loop() di un programma può essere eseguito anche migliaia di volte al secondo! Spiega perchè ti è necessario scrivere il dato nell'EEPROM, poi guardiamo di trovare una soluzione.

 

 

Ciao, Ale.

 

 

Come sempre vi chiedo di non darmi soluzioni, ma di capire come posso arrivarci....forse.....

grazie

 

 

Link al commento
Condividi su altri siti

da quello che ho letto, scrivere dati sulla eeprom serve per memorizzare dei dati e in caso di spegnimento e riaccensione possa rileggere i dati memorizzati per poter proseguire dal punto memorizzato prima dello spegnimento,

 

credo!!!

Link al commento
Condividi su altri siti

per quanto riguarda bool pressed, memorizza se il pulsante è premuto o no e restituisce " false o true"

 

mamma mia mi sembra di fare un esame!!

bello!!

Link al commento
Condividi su altri siti

 

scrivere dati sulla eeprom serve per memorizzare dei dati e in caso di spegnimento e riaccensione

 

Nella tua applicazione è completamente inutile e, come ti hanno detto, deleterio

 

nella memoria interna del microcontroller meno scritture inutili si fanno e meglio è

Link al commento
Condividi su altri siti

Ospite
Questa discussione è chiusa alle risposte.

×
×
  • Crea nuovo/a...