Knockturn Alley RGB led`s

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Gebruikers-avatar
Berichten: 31
Geregistreerd: 08 Sep 2016, 21:50

Knockturn Alley RGB led`s

Berichtdoor Kitemasters » 17 Aug 2022, 10:09

hoi,

Na al een tijdje de arduino`s in de la te laten verstoffen, komt door mijn huidige "print" projectje toch weer de inspiratie boven. :)
De Knockturn Alley booknook. Ziet er ongeveer zo uit;
https://i.redd.it/l8dgdilymoe51.jpg

Tja laten we zeggen max 20 led`s daar moet "iets" mee natuurlijk.

Doel is dus ieder lampje de kleur en helderheid kunnen instellen en als je hem uit en aan zet moet hij dat ook onthouden graag.
De volgende onderdelen zijn uit de la gehaald; Arduino nano (toch weinig ruimte, ook Mega en Uno beschikbaar en besteld is een ESP32 plus een eeprom moduletje).
Voor de led`s kwam ik uit op WS2812B dan zijn alle led`s met een data pin aan te sturen. Verder twee momentary knopjes een potmeter en de nodige weerstandjes ed.
Tot zover the big picture :D

Nu dan mijn eerste vraag,
Ik bedacht dat het handig is om naar verschillende blokjes code te kunnen springen en herinnerde me dat ik dat eerder (met hulp hier) gedaan had met een "state switch".
Die code heb ik weer opgezocht maar in die state switch zit volgens mij heel veel wat niet nodig is dus state switch er weer uit.
Maar nu het stukje dat ik niet snap,

Kennelijk is het geen probleem om vanuit void loop() naar void read_sens() te gaan.
maar bij de opdracht in void read_sens() om naar void Start() te gaan zegt hij " 'Start' was not declared in this scope "
terwijl read_sens volgens mij ook niet "declared" is.


Code: Alles selecteren
/*
 Knockturn Alley
 
 This code is developed to light the
 Knockturn Alley book nook with addressable RGB led`s,
 and be able to change color and brightness of
 each led separately.

  Parts required:
  1 - arduino Nano or compatible
  20 - RGB LED WS2812B
  2 - Ldr (A 9013 photo resistor 5mm)
  2 - 10K resistor

  Created 4 October 2022
  by Kitemasters

  This code is part of the public domain
*/

#include <EEPROM.h>
#include <FastLED.h>

// --------CONSTANTS (won't change)---------------

#define NUM_LEDS 3
#define DATA_PIN 2
#define COLOR_ORDER GRB
#define CHIPSET WS2812B
#define BRIGHTNESS 50
#define VOLTS 5
#define MAX_AMPS 100

int address = 0;
int Button1 = 4;
int Button2 = 5;
uint8_t hue = 0;
CRGB leds[NUM_LEDS];


//------------ VARIABLES (will change)---------------------


//========================================

void setup() {

  FastLED.addLeds<CHIPSET,DATA_PIN,COLOR_ORDER>(leds,NUM_LEDS);
  FastLED.setMaxPowerInVoltsAndMilliamps(VOLTS,MAX_AMPS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
  FastLED.show();
  Serial.begin(9600);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);

 
}
//========================================

void loop() {

  read_sens();                                   // read the sensors

}
//========================================

void read_sens() {

 
    digitalRead(Button1);
    digitalRead(Button2);
    analogRead(A6);
   
    if (Button1 == 0 && Button2 == 0) {
      Serial.println ("Geen button ingedrukt");
      Start();                                   // read the sensors
          }

    if (Button1 == 1 && Button2 == 0) {
      Serial.println ("Button1 ingedrukt");
      Program();                                   // read the sensors
          }

     if (Button1 == 0 && Button2 == 1) {
      Serial.println ("Button2 ingedrukt");
      Dim();                                   // read the sensors
          }     
   
 
  }
}
//========================================

void Start() {

    leds[0] = CHSV(hue, 255, 120);
    leds[1] = CRGB::Red;
    leds[2] = CRGB::Red;
    FastLED.show();
   

  read_sens();                                               // read the sensors
}
//========================================

void Program() {

  leds[0] = CHSV(hue, 255, 120);
    leds[1] = CRGB::Green;
    leds[2] = CRGB::Green;
    FastLED.show();

    read_sens();                                               // read the sensors
}
//========================================

void Dim() {

  leds[0] = CHSV(hue, 255, 120);
    leds[1] = CRGB::Purple;
    leds[2] = CRGB::Purple;
    FastLED.show();

    read_sens();                                               // read the sensors
}


//========================================END

Advertisement

Berichten: 62
Geregistreerd: 04 Sep 2021, 08:31

Re: Knockturn Alley RGB led`s

Berichtdoor RobGood » 17 Aug 2022, 17:24

Hallo Kite..?
Ja die WS28xx zijn leuke dingen om mee te spelen.
Zo te zien zie ik geen syntax fouten.
Alleen je roept in de functie read_sens() de functie start() aan...en in functie start() roep je weer de functie read_sens() aan...
Weliswaar alleen als er geen knoppen zijn ingedrukt.
Kan niet inschatten hoe de compiler daar mee omgaat...(die foutmelding?) maar ik voel aan mijn virtuele water dat dat niet goed gaat....dit vormt een oneindige lus.
En misschien moet je iets doen om het bouncen van de drukknoppen op te vangen, die serialprints doen het al een beetje maar misschien is dat te weinig. Het totaal gaat nu met een enorme snelheid, terwijl 25x per seconde snel genoeg is, sneller kunnen we toch de veranderingen in de leds niet zien....
Het aanroepen van functie read_sens() op een timertje op 20ms,een interrupt of de ingebouwde timer millis() dan werkt het denk ik beter...uitproberen...

Rob

Berichten: 3878
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Knockturn Alley RGB led`s

Berichtdoor shooter » 17 Aug 2022, 17:52

ik zie alleen dat readsens heel vaak aangeroepen wordt, zet alle aanroepen onder elkaar in de loop en dan met timers wanneer je iets wilt hebben.
dus
loop(){
start();
program(); en zo onder elkaar
}
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 31
Geregistreerd: 08 Sep 2016, 21:50

Re: Knockturn Alley RGB led`s

Berichtdoor Kitemasters » 18 Aug 2022, 00:45

Dank voor het meedenken

Geweldige ontdekkingen gedaan ;-)

1 als hij zegt "'Start' was not declared in this scope " wil dat niet zeggen dat daar precies de fout zit.
kan goed zijn dat er heel ergens anders een } of ( mist of teveel is, of zelfs een opeenstapeling van dergelijke. (wat het geval was)

2 in mijn hoofd was read sens de basis modus zeg maar, normaal branden de lampjes gewoon en hoeft hij pas wat te doen als een knopje wurdt gedrukt.
vandaar dat ik daar steeds naar terug wil.

3 snelheid was idd ook een ding in een latere poging ging hij er zo snel doorheen dat er geen verschil (kleur) te merken was.

Ik heb een nieuwe poging gedaan en daarbij de stateswitch toch behouden. dit werkt nu soort van,
zitten wat serial prints in om te checken wat hij doet. hij raast er idd in een rotgang doorheen :-)
Maar genoeg om nog even mee door te prutsen. ;-)

Code: Alles selecteren
#include <EEPROM.h>
#include <FastLED.h>

// --------CONSTANTS (won't change)---------------

#define NUM_LEDS 3
#define DATA_PIN 2
#define COLOR_ORDER GRB
#define CHIPSET WS2812B
#define BRIGHTNESS 50
#define VOLTS 5
#define MAX_AMPS 100

int address = 0;
int Button1 = 4;
int Button2 = 5;
uint8_t hue = 0;
CRGB leds[NUM_LEDS];

int read_sens_Interval = 200;                // millisecs between reading sensors
int motor_Acc_Interval = 100;                // millisecs between acceleration steps
int motor_Dec_Interval = 10;                 // millisecs between deceleration steps

//------------ VARIABLES (will change)---------------------

unsigned long currentMillis = 0;               // stores the value of millis() in each iteration of loop()
unsigned long previous_sens_Millis = 0;        // will store the last time sensors are read
unsigned long previous_Acc_Millis = 0;         // will store time of last acceleration step
unsigned long previous_Dec_Millis = 0;         // will store time of last deceleration step

int sensLreading = 0;                          // declare variable and set value for left sensor reading
int sensRreading = 0;                          // declare variable and set value for right sensor reading
int max_Speed = 200;                           // declare variable and set value for maximum Speed (0 to 255)
int Speed = 0;                                 // declare variable and set value for current Speed (0 to 255)
boolean direct = HIGH;                         // declare variable and set value for direction to HIGH (HIGH = left)

#define STATE_START 1                          // declare value 0 to be STATE_START
#define STATE_RUN 2                            // declare value 1 to be STATE_RUN
#define STATE_SETCOLOR 3                       // declare value 2 to be STATE_DECELERATE
#define STATE_SETBRIGHT 4                      // declare value 3 to be STATE_TURN
#define STATE_NOTUSED 5                        // declare value 4 to be STATE_ACCELERATE

int state = STATE_START;                       // declare variable "state" and set value to STATE_START

//========================================

void setup() {

  FastLED.addLeds<CHIPSET,DATA_PIN,COLOR_ORDER>(leds,NUM_LEDS);
  FastLED.setMaxPowerInVoltsAndMilliamps(VOLTS,MAX_AMPS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
  FastLED.show();
  Serial.begin(9600);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);

}
//========================================

void loop() {

Serial.println ("begin loop");
Serial.println (currentMillis);
delay(100);


  currentMillis = millis();                      // store the latest value of millis()
  read_sens();                                   // read the sensors

  switch (state)                                 // state switch
  {
    case STATE_START:
      Start();
      break;

    case STATE_RUN:
      Run();
      break;

    case STATE_SETCOLOR:
      Setcolor();
      break;

    case STATE_SETBRIGHT:
      Setbright();
      break;

    case STATE_NOTUSED:
      break;
  }
}
//========================================

void read_sens() {

Serial.println ("begin read SENS ");

  if (currentMillis - previous_sens_Millis >= read_sens_Interval) {   // time is up, so read sensors
    previous_sens_Millis = currentMillis;                             // because shooter and Koepel told me so.// save the time we last read sensors
    digitalRead(Button1);
    digitalRead(Button2);
    analogRead(A6);

Serial.println ("Sens gelezen////////");   
   
    if (Button1 == LOW && Button2 == LOW) {
      Serial.println ("Geen button ingedrukt");
      state = STATE_START;                                            // set state to "decelerate"
      previous_Dec_Millis = currentMillis;                            // set previous_Dec_Millis to current time
    }


    if (Button1 == HIGH && Button2 == LOW) {
      Serial.println ("Button1 ingedrukt");
      state = STATE_SETCOLOR;                                            // set state to "decelerate"
      previous_Dec_Millis = currentMillis;                            // set previous_Dec_Millis to current time
    }


    if (Button1 == LOW && Button2 == HIGH) {
      Serial.println ("Button2 ingedrukt");
      state = STATE_SETBRIGHT;                                            // set state to "decelerate"
      previous_Dec_Millis = currentMillis;                            // set previous_Dec_Millis to current time
    } 
  }
}
//========================================

void Start() {

Serial.println ("begin Start");

    leds[0] = CHSV(hue, 255, 120);
    leds[1] = CRGB::Red;
    leds[2] = CRGB::Red;
    FastLED.show();

  state = STATE_RUN;                                           // set state to "accelerate"
  previous_Acc_Millis = currentMillis;                                // set previous_Acc_Millis to current time
}
//========================================

void Run() {

    leds[0] = CHSV(hue, 255, 120);
    leds[1] = CRGB::Yellow;
    leds[2] = CRGB::Yellow;
    FastLED.show();

     read_sens();
    }
//========================================

void Setcolor() {

    leds[0] = CHSV(hue, 255, 120);
    leds[1] = CRGB::Blue;
    leds[2] = CRGB::Blue;
    FastLED.show();
   

  read_sens();

}
//========================================

void Setbright() {

    leds[0] = CHSV(hue, 255, 120);
    leds[1] = CRGB::Red;
    leds[2] = CRGB::Red;
    FastLED.show();
   
}
//========================================END

Gebruikers-avatar
Berichten: 31
Geregistreerd: 08 Sep 2016, 21:50

Re: Knockturn Alley RGB led`s

Berichtdoor Kitemasters » 19 Aug 2022, 11:08

Code weer ingekort,
doet verder wat ik verwacht behalve;

regel 82 (in void Start())

if (Button1 == HIGH) {
Serial.println ("Button1 ingedrukt");

ik kan drukken wat ik wil maar hij ziet het niet.
lijkt of ik die pin niet goed instel ofzo maar kan de fout niet vinden.

Code: Alles selecteren
/*
 Knockturn Alley
 
 This code is developed to light the
 Knockturn Alley book nook with addressable RGB led`s,
 and be able to change color and brightness of
 each led separately.

  Parts required:
  1 - arduino Nano or compatible
  20 - RGB LED WS2812B
  2 - Ldr (A 9013 photo resistor 5mm)

  Created 4 October 2022
  by Kitemasters

  This code is part of the public domain
*/

#include <EEPROM.h>
#include <FastLED.h>

// --------CONSTANTS (won't change)---------------

#define LED_TOTAL 3
#define DATA_PIN 2
#define COLOR_ORDER GRB
#define CHIPSET WS2812B
#define BRIGHTNESS 20
#define VOLTS 5
#define MAX_AMPS 100

int address = 0;
int Button1 = 4;
int Button2 = 5;
uint8_t hue = 0;
CRGB leds[LED_TOTAL];

//------------ VARIABLES (will change)---------------------



//========================================

void setup() {

  FastLED.addLeds<CHIPSET,DATA_PIN,COLOR_ORDER>(leds,LED_TOTAL);
  FastLED.setMaxPowerInVoltsAndMilliamps(VOLTS,MAX_AMPS);
  FastLED.setBrightness(BRIGHTNESS);
  FastLED.clear();
  FastLED.show();
  Serial.begin(9600);
  pinMode(Button1, INPUT);
  pinMode(Button2, INPUT);

}
//========================================

void loop() {

Serial.println ("begin loop");
delay(100);

Start();

}

//========================================

void Start() {

Serial.println ("begin Start");

    leds[0] = CRGB::Red;
    leds[1] = CRGB::Red;
    leds[2] = CRGB::Red;
    FastLED.show();
    delay(1000);

    digitalRead(Button1);

    if (Button1 == HIGH) {
    Serial.println ("Button1 ingedrukt");
    leds[0] = CRGB::Green;
    leds[1] = CRGB::Green;
    leds[2] = CRGB::Green;
    FastLED.show();
    delay(1000);
  } else {
    Serial.println ("Button1 niet ingedrukt");
    leds[0] = CRGB::Purple;
    leds[1] = CRGB::Purple;
    leds[2] = CRGB::Purple;
    FastLED.show();
    delay(1000);
  }


    Serial.println ("eind Start");

    Setcolor();

//  state = STATE_RUN;                                           // set state to "accelerate"
//  previous_sens_Millis = currentMillis;                                // set previous_Acc_Millis to current time
}
//========================================

void Run() {

    leds[0] = CRGB::Yellow;
    leds[1] = CRGB::Yellow;
    leds[2] = CRGB::Yellow;
    FastLED.show();

    }
//========================================

void Setcolor() {

  Serial.println ("begin Setcolor");

    leds[0] = CRGB::Blue;
    leds[1] = CRGB::Blue;
    leds[2] = CRGB::Blue;
    FastLED.show();
    delay(1000);


}
//========================================

void Setbright() {

    leds[0] = CHSV(hue, 255, 120);
    leds[1] = CRGB::Red;
    leds[2] = CRGB::Red;
    FastLED.show();
   
}
//========================================END

Berichten: 62
Geregistreerd: 04 Sep 2021, 08:31

Re: Knockturn Alley RGB led`s

Berichtdoor RobGood » 20 Aug 2022, 09:23

Ja das een leuke. Je hebt button1 als 4 gedeclareerd en vervolgens test je of button1 high is....nee die is niet high die is 4
Je bedoeld natuurlijk de stand van pin4 te testen,
Dus if digitalread van button1 is high...then.... else
Succes....

Gebruikers-avatar
Berichten: 31
Geregistreerd: 08 Sep 2016, 21:50

Re: Knockturn Alley RGB led`s

Berichtdoor Kitemasters » 20 Aug 2022, 10:52

Ja was een beetje dom

kan mij soms helemaal blindstaren op zo iets.
maar nu doet hij wat ik wil, ben nu bezig een debounce te bouwen.

dus ik deel de code wel weer bij de volgende ongetwijfeld domme vraag ;-)

dank.

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten