Go Down

Topic: Millis con Switch (Read 259 times) previous topic - next topic

kemosabesay

Buongiorno a tutti,
Dopo tanti studi e prove sono qui per mostrarvi una cosa strana che mi succede con lo Sketch che sto provando:
ovvero, come mai se conteggio il tempo tra il primo, il secondo e di nuovo il primo mi da tempi diversi?

Quindi: parte il programma, attesa 3 secondi, primo messaggio per 3 secondi, secondo messaggio per tre secondi.......e poi 5 secondi per ricominciare.

Mi sembra strano, sto sbagliando qualcosa?


Grazie

Code: [Select]


// Variabili
int ContatoreStato = 0;                   // conta il numero di volte che il pulsante è premuto buttonPushCounter



//MILLIS
unsigned long previousMillis = 0;
unsigned long interval = 3000;



void setup() {
 Serial.begin(9600);

}

void loop() {
unsigned long currentMillis = millis();

if (( long)(currentMillis - previousMillis) >= interval){
     previousMillis = currentMillis;
if (ContatoreStato <=1){ ContatoreStato++;}
else{ ContatoreStato =0;}

switch (ContatoreStato) {
      case 1:
Serial.println("messaggio 1");
      break;
       case 2:

Serial.println("messaggio 2");
       break;

}

}
}

Datman

Da quando if (( long)(currentMillis - previousMillis) >= interval) è vero, rimane sempre vero!
Hi, I am Gianluca from Roma. I play &work with electronics since I was 16(1984).
After 25 yrs of maintenance on cameras &video mixers, since 2013 my job is HDTV studios design.
Since Jan 2015 I play with Arduino: https://postimg.cc/gallery/2nnxqlam2/

Silente

Indenta quel codice. Basta andare nell'IDE , menù "strumenti" "formattazione automatica". Poi ripostalo che vediamo.
E poi perché nella if del timer casti ha long la sottrazione? Togli quel (long).
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

Datman

Neanche serve currentMillis: basta usare millis().
Hi, I am Gianluca from Roma. I play &work with electronics since I was 16(1984).
After 25 yrs of maintenance on cameras &video mixers, since 2013 my job is HDTV studios design.
Since Jan 2015 I play with Arduino: https://postimg.cc/gallery/2nnxqlam2/

fabpolli

Secondo me sono 6 i secondi prima di dare di nuovo il primo messaggio, se hai solo due stati allora ti consiglio di usare una variabile booleana e risolvi senza if e altri controlli strani.
Venendo al tuo codice quando parte l'esecuzione ContatoreStato vale zero dopo 3 secondi entri e essendo minore di due lo incrementi e vale 1 (Visualizzi il primo messaggio), passano tre secondi è ancora minore o uguale a 1 e lo incrementi e vale quindi due (visualizzi il secondo messaggio) passano tre secondi entri e essendo due magiore di uno gli assegni zero, il resto lo lascio scoprire a te

kemosabesay

il tutto è per capire come mai questo sketch non funge:
Code: [Select]

/* blendwave

    By: Andrew Tuline

    Date: October, 2015

    This uses beats, blend and the fill gradient functions to blend a couple of waves together. Again, try making changes to this and see how it looks.

*/

#include "FastLED.h"                                          // FastLED library.

#if FASTLED_VERSION < 3001000
#error "Requires FastLED 3.1 or later; check github for latest code."
#endif

// Fixed definitions cannot change on the fly.
#define LED_DT 12                                             // Data pin to connect to the strip.
#define LED_CK 11                                             // Clock pin for WS2801 or APA102.
#define COLOR_ORDER GRB                                       // It's GRB for WS2812 and BGR for APA102.
#define LED_TYPE WS2812                                       // Using APA102, WS2812, WS2801. Don't forget to modify LEDS.addLeds to suit.
#define NUM_LEDS 16                                           // Number of LED's.

// Global variables can be changed on the fly.
uint8_t max_bright = 128;                                      // Overall brightness definition. It can be changed on the fly.

struct CRGB leds[NUM_LEDS];                                   // Initialize our LED array.

CRGB clr1;
CRGB clr2;
uint8_t speed;
uint8_t loc1;
uint8_t loc2;
uint8_t ran1;
uint8_t ran2;


void setup() {

  Serial.begin(57600);                                        // Initialize serial port for debugging.
  delay(1000);                                                // Soft startup to ease the flow of electrons.

  //  LEDS.addLeds<LED_TYPE, LED_DT, LED_CK, COLOR_ORDER>(leds, NUM_LEDS);  // Use this for WS2801 or APA102
  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);  // Use this for WS2812

  FastLED.setBrightness(max_bright);
  set_max_power_in_volts_and_milliamps(5, 500);               // FastLED Power management set at 5V, 500mA.

} // setup()



void loop() {

  blendwave();
  FastLED.show();

} // loop()



void blendwave() {

  speed = beatsin8(6, 0, 255);

  clr1 = blend(CHSV(beatsin8(3, 0, 255), 255, 255), CHSV(beatsin8(4, 0, 255), 255, 255), speed);
  clr2 = blend(CHSV(beatsin8(4, 0, 255), 255, 255), CHSV(beatsin8(3, 0, 255), 255, 255), speed);

  loc1 = beatsin8(10, 0, NUM_LEDS - 1);

  fill_gradient_RGB(leds, 0, clr2, loc1, clr1);
  fill_gradient_RGB(leds, loc1, clr2, NUM_LEDS - 1, clr1);

} // blendwave()

fabpolli

non trovo il nesso tra i due codici...

kemosabesay

il nesso è che siccome stavo provando il secondo codice e non funzionava ho scritto il primo per fare una prova, nella quale mi sono accorto del ritardo al secondo messaggio


grazie

fabpolli

Ok, allora se sistemi il primo codice poi lo integri nel secondo e sei a posto

kemosabesay

no scusa ho sbagliato invio
il codice che vorrei che funzionasse è quest:
Code: [Select]




#include "FastLED.h"                                          // FastLED library. Preferably the latest copy of FastLED 2.1.

#if FASTLED_VERSION < 3001000
#error "Requires FastLED 3.1 or later; check github for latest code."
#endif

// Variabili
int ContatoreStato = 0;                   // conta il numero di VOID

//MILLIS
unsigned long previousMillis =0;                                 // Store last time the strip was updated.
unsigned long interval = 3000;




// Fixed definitions cannot change on the fly.
#define LED_DT 12                                             // Data pin to connect to the strip.
#define LED_CK 11                                             // Clock pin for the strip.
#define COLOR_ORDER GRB                                       // Are they RGB, GRB or what??
#define LED_TYPE WS2812                                       // Don't forget to change LEDS.addLeds
#define NUM_LEDS 16                                           // Number of LED's.

// Initialize changeable global variables.
uint8_t max_bright = 128;                                      // Overall brightness definition. It can be changed on the fly.

struct CRGB leds[NUM_LEDS];                                   // Initialize our LED array.



CRGB clr1;
CRGB clr2;
uint8_t speed;
uint8_t loc1;
uint8_t loc2;
uint8_t ran1;
uint8_t ran2;

// Palette definitions
CRGBPalette16 currentPalette;
CRGBPalette16 targetPalette;
TBlendType    currentBlending;                                // NOBLEND or LINEARBLEND

// Define variables used by the sequences.
int      twinkrate = 100;                                     // The higher the value, the lower the number of twinkles.
uint8_t  thisfade = 8;                                        // How quickly does it fade? Lower = slower fade rate.
int       thishue = 50;                                       // Starting hue.
uint8_t   thisinc = 1;                                        // Incremental value for rotating hues
uint8_t   thissat = 100;                                      // The saturation, where 255 = brilliant colours.
uint8_t   thisbri = 255;                                      // Brightness of a sequence. Remember, max_bright is the overall limiter.
int       huediff = 256;                                      // Range of random #'s to use for hue
uint8_t thisdelay = 5;                                        // We don't need much delay (if any)
bool       randhue =   1;                                     // Do we want random colours all the time? 1 = yes.

void setup() {
  delay(1000);                                                // Power-up safety delay or something like that.
  Serial.begin(9600);

  LEDS.addLeds<LED_TYPE, LED_DT, COLOR_ORDER>(leds, NUM_LEDS);    // Use this for WS2812B

  FastLED.setBrightness(max_bright);
  set_max_power_in_volts_and_milliamps(5, 500);               // FastLED power management set at 5V, 500mA.
} // setup()


void loop () {
 
//blendwave();
 
 unsigned long currentMillis = millis();
 
if (( long)(currentMillis - previousMillis) >= interval){
     previousMillis = currentMillis;
if (ContatoreStato <=1){ ContatoreStato+ContatoreStato+1;}
else{ ContatoreStato =0;}

switch (ContatoreStato) {
      case 1:
           
           
            Serial.println( "TWINKLE");
             ChangeMe();            // Check the demo loop for changes to the variables.

                 EVERY_N_MILLISECONDS(10) {   // FastLED based non-blocking delay to update/display the sequence.
            confetti();}
                 EVERY_N_MILLISECONDS(100) {
                   uint8_t maxChanges = 24;
                     nblendPaletteTowardPalette(currentPalette, targetPalette, maxChanges);   // AWESOME palette blending capability.
  }

                EVERY_N_MILLISECONDS(thisdelay) {                           // FastLED based non-blocking delay to update/display the sequence.
           twinkle();
  }
                EVERY_N_SECONDS(5) {                                        // Change the target palette to a random one every 5 seconds.
                   static uint8_t baseC = random8();                         // You can use this as a baseline colour if you want similar hues in the next line.
                     targetPalette = CRGBPalette16(CHSV(random8(), 255,
                                     random8(128,255)), CHSV(random8(), 255,
                                     random8(128,255)), CHSV(random8(), 192,
                                     random8(128,255)), CHSV(random8(), 255,
                                     random8(128,255)));
 }
 
      break;
       case 2:
Serial.println( "blendwave");
          // blendwave();
          speed = beatsin8(6,0,255);

  clr1 = blend(CHSV(beatsin8(3,0,255),255,255), CHSV(beatsin8(4,0,255),255,255), speed);
  clr2 = blend(CHSV(beatsin8(4,0,255),255,255), CHSV(beatsin8(3,0,255),255,255), speed);

  loc1 = beatsin8(10,0,NUM_LEDS-1);
 
  fill_gradient_RGB(leds, 0, clr2, loc1, clr1);
  fill_gradient_RGB(leds, loc1, clr2, NUM_LEDS-1, clr1);

 
       break;

}

}
 
 
 
 
 
 
  FastLED.show();
 
} // loop()


void twinkle() {

  if (random8() < twinkrate) leds[random16(NUM_LEDS)] += ColorFromPalette(currentPalette, (randhue ? random8() : thishue), 255, currentBlending);
  fadeToBlackBy(leds, NUM_LEDS, thisfade);
 
} // twinkle()



void confetti() {                                             // random colored speckles that blink in and fade smoothly
  fadeToBlackBy(leds, NUM_LEDS, thisfade);                    // Low values = slower fade.
  int pos = random16(NUM_LEDS);                               // Pick an LED at random.
  leds[pos] += CHSV((thishue + random16(huediff))/4 , thissat, thisbri);  // I use 12 bits for hue so that the hue increment isn't too quick.
  thishue = thishue + thisinc;                                // It increments here.
} // confetti()


void ChangeMe() {                                             // A time (rather than loop) based demo sequencer. This gives us full control over the length of each sequence.
  uint8_t secondHand = (millis() / 1000) % 15;                // IMPORTANT!!! Change '15' to a different value to change duration of the loop.
  static uint8_t lastSecond = 99;                             // Static variable, means it's only defined once. This is our 'debounce' variable.
  if (lastSecond != secondHand) {                             // Debounce to make sure we're not repeating an assignment.
    lastSecond = secondHand;
    switch(secondHand) {
      case  0: thisinc=1; thishue=192; thissat=255; thisfade=2; huediff=256; break;  // You can change values here, one at a time , or altogether.
      case  5: thisinc=2; thishue=128; thisfade=8; huediff=64; break;
      case 10: thisinc=1; thishue=random16(255); thisfade=1; huediff=16; break;      // Only gets called once, and not continuously for the next several seconds. Therefore, no rainbows.
      case 15: break;                                                                // Here's the matching 15 for the other one.
    }
  }
} // ChangeMe()


void blendwave() {

  speed = beatsin8(6,0,255);

  clr1 = blend(CHSV(beatsin8(3,0,255),255,255), CHSV(beatsin8(4,0,255),255,255), speed);
  clr2 = blend(CHSV(beatsin8(4,0,255),255,255), CHSV(beatsin8(3,0,255),255,255), speed);

  loc1 = beatsin8(10,0,NUM_LEDS-1);
 
  fill_gradient_RGB(leds, 0, clr2, loc1, clr1);
  fill_gradient_RGB(leds, loc1, clr2, NUM_LEDS-1, clr1);

} // blendwave()


grazie

fabpolli

Si ok, ma hai ragionato sul suggerimento che ti ho dato al post #4?

kemosabesay

aspetta che mi concentro..... grazie

Datman

Dopo il valore 2 c'è il valore 0 (3 secondi) e poi c'è l'1. Tra 1 e 2, quindi, ci sono 3 secondi, ma tra 2 e 1 ci sono 3+3=6 secondi.
Hi, I am Gianluca from Roma. I play &work with electronics since I was 16(1984).
After 25 yrs of maintenance on cameras &video mixers, since 2013 my job is HDTV studios design.
Since Jan 2015 I play with Arduino: https://postimg.cc/gallery/2nnxqlam2/

kemosabesay

scusa ...quale valore zero, e poi perchè 3 +3 dove li prende ?

grazie

Silente

Il programma passo passo dovrebbe fare così
All'inizio del tempo e la variabile Vale 0
La situazione rimane costante per 3 secondi, ovvero la durata del timer
Il ciclo comincia ricaricando il timer e verificando se la variabile sia minore di 2.
0 e minori di 2 di conseguenza viene aumentato di 1.
La variabile attualmente vale 1 e con questo valore entra nei case.
Valendo 1 invia il primo messaggio e poi si ferma per 3 secondi che è sempre la durata del timer.
Nel secondo ciclo di timer la variabile vale 1 che è minore di 2 e che quindi viene aumentato di 1.
Uno più uno fa due quindi la variabile Vale 2 e con Tale valore entra nei case così facendo invia il secondo messaggio.
Devi passare un altro timer ovvero tre secondi dopo i quali il ciclo ricomincia ma adesso la variabile Vale 2 e non essendo più minore di 2 la variabile viene rimessa a zero. A differenza di prima Adesso è con zero che la variabile entra nei case ma non esiste un case per Zero e quindi il programma Aspetta altri tre secondi ricominciando il giro.

Ora ti è più chiaro il funzionamento del programma che tu hai scritto per semplificare un problema presente in un programma in inglese che tu hai scritto?

È da questa descrizione sei in grado di comprendere quale numero devi modificare sapendo che è uno soltanto e che si trova prima dei case
Dove va un numero va una variabile o una funzione. E dove va una boolean va un insieme di test.

Se vuoi ottenere devi saper spiegare

In pochi capiscono l'importanza di formattare, sii tra di essi

Go Up