Ik denk dat ik van de week maar eens helemaal opnieuw moet beginnen, want ik ben de logica volledig kwijt. loop al 2 uur te prutsen met de voeding van het geluid.
Ik ben gewend van elektriciteit dat je een + en - hebt... deze kan je normaliter bij wijs van spreken zolang verlengen als je wil, sluit je er 4 stopcontacten op aan kan je er 4 stekkers van lampen in steken. wil je er 6, doe je er 6. Het is niet zo dat als ik nummer 6 aan doen dat nummer 3 niet meer werkt.
en ik snap niet waarom dat hier wel zo is.
ik sluit de 5v aan op de +, de gnd op de -
Maar als ik zowel de sound als bv de led daarop aansluit heeft het invloed op elkaar. Hoe dan?? deze zijn enkel met elkaar gelinkt via de Arduino.
Ik heb inmiddels ook ledjes welke van zichzelf knipperen, dus dat ik 1 stukje script minder.
Ik denk dat ik de clapper er maar uit laat, want ik maak het mezelf denk ik onnodig ingewikkeld.
Voor nu tijd om het even weg te leggen denk ik, voor het zo door de kamer heen vliegt 
Op zondag 25 februari 2024 12:21:12 schreef IvovdA:
nog een vraag... ik probeer mn geluidskit van stroom te voorzien via de power van de Arduino.
...
Ten eerste moet je niet teveel verbruiken. Een standaard USB poort op een laptop kan best eens stoppen met 200mA.
Ten tweede kan een module heel veel storing veroorzaken voor medegebruikers, dat is misschien op te lossen met wat condensatoren.
Zoals fcapri noemt: moet je programma's geen langzame dingen laten doen. Zoals een delay of op een motor wachten.
Hier een voorbeeld van 2 leds onafhankelijk laten knipperen zonder delay. Een button toevoegen op dezelfde manier geeft dus ook geen vertraging.
https://wokwi.com/projects/390706387118545921
Ook als ik de arduino voed met een adapter loop ik tegen dezelfde problemen aan.
Ik wilde eigenlijk alles op 3 AA batterijen laten draaien, maar ben nu angstig dat dat niet gaat lukken.
Op zondag 25 februari 2024 15:44:14 schreef fcapri:
heb je een foto of een schema, zal wel ergens iets fout zitten.
Zo ligt ie er nu bij.
benleentje
Golden Member
Ik denk dat ik van de week maar eens helemaal opnieuw moet beginnen, want ik ben de logica volledig kwijt. loop al 2 uur te prutsen met de voeding van het geluid.
Maak daar dan eens een paar goed foto van van zowel onderkant als bovenkant van de PCB.
En leg nog eens in detail uit hoe het normaal werkt dus met de batterijen en wat je al geprobeerd heb. En probeer ook even vanaf de 5V naar de batterijen en dan naar de PCB daarvan het schema te maken. Dus niet het schema van de totale pcb maar enkel de voeding.
benleentje
Golden Member
Op zondag 25 februari 2024 11:17:09 schreef IvovdA:
het script blokt nu niet meer inderdaad, maar werkt niet als gewenst....
De servo stopt op dat moment en gaat weer verder als de lampjes weer zijn gedoofd.de 'clapper' werkt nu helemaal niet meer.
Ja ik weet ook niet precies hoe je het wilt hebben
.
IK heb de sketch weer flink verbouwt.
Ik heb nu millis() gebruikt
+ een bool variabele om te zien wanneer de led aan moet
+ een variabele waarin de tijd zit dat de led weer uit moet.
Millis() zit standaard in de arduino en begint steeds op 0 als je de arduino aanzet het duurt ongeveer 49 dagen voordat millis() na continu aan heb gestaan weer op 0 begint dus tijd zat
.
Overal waar de led aan moet heb ik digitalWrite(ledpin, True) vervangen door ledIsAan op TRUE te zetten en daarna zet ik ook de tijd in ledIsAanTijd op millis() + wachtijd zodat we later de led ook op tijd weer uit kunnen zetten.
Als de led weer uit moeten zet je simpel de lesIsAan op FALSE en zet je ook gelijk de led weer uit.
De tijd is dan niet meer belangrijk omdat er pas weer naar die tijd gekeken word als de led weer aan is.
Dit is echter wel mijn eigen manier die ik min of meer zelf bedacht hebt. De voorbeelden op internet die gebruiken een andere manier die ik voor mijzelf niet logisch vond. Het ene is niet beter dan het andere maar mijn eigen manier is voor mij beter te begrijpen.
Ik zeg je dit omdat als je dit later gaat opzoeken hoe andere het doen je dan weet dat het anders is.
Het programma is nu geheel vrij van blokkerende code en doet steeds in stapje van de servo instellen en verder helemaal niets en wacht totdat je op een drukknop druk. Doet dan de wachttijd instellen en de led aanzetten en dan kijken wanneer de led weer uit mag
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards
const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
const int soundpin = A2;
const int threshold = 200;
const int uitgeluid = 12;
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
int pos = 60; // variable to store the servo position
bool movePos = true;
bool ledIsAan = false;
long ledIsAanTijd = 0;
void moveServo(){
myservo.write(pos);
if (movePos) { // check to see to move positieve or not
pos++;
if (pos == 80){ // check for max movement en reverse direcetion bij setting movePos to false
movePos = false;
}
} else {
pos--;
if (pos == 60) {
movePos = true;
}
}
delay(15);
}
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
pinMode(uitgeluid, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
pinMode(soundpin,INPUT);
}
void loop() {
// read the state of the pushbutton value:
moveServo();
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
// millis() zit standaard in arduino en vanaf het moment de je de Arduino aanzet begint millis() bij 0 milliseconde
if (buttonState == HIGH) {
// turn LED on:
ledIsAan = true; //De led mag aan maar word p[as echt aangezet in een apart stukje programma regels
ledIsAanTijd = millis() + 5000; //Tel bij de stand van millis() 5000 = 5 seconde op. De ledIsAaNtijd word elke keer als je op drukknop druk weer opnieuw ingesteld
}
int soundsens = analogRead(soundpin);
if (soundsens >= threshold) {
//turns ledPin on
digitalWrite(uitgeluid,HIGH);
//digitalWrite(ledPin,HIGH);
//delay(1800);
ledIsAan = true; //De led mag aan
ledIsAanTijd = millis() + 1800; //De led mag aan voor 1800 milliseconde
}
//Hieronder word de Led aan of uitgezet en word de tijd steeds vergelijken met de actuele tijd wanner de led weer uit moet.
if (ledIsAan) {
digitalWrite(ledPin, HIGH);
if (millis() > ledIsAanTijd) { //Als de actuele tijd in millis() groter is dan de led ISAanTijd dan moet de led weer uit
ledIsAan = false;
digitalWrite(ledPin, LOW);
}
}
}Ik kan alle code waarderen, soms vind ik rommelig zelfs leuker, soms worden er echter wel heel veel stappen gemaakt, ik vind hem zo code technisch wel elegant
// when 200ms went by we toggle pin 13
if ((millis() - lastBlinkTime) > 200) {
digitalWrite(13, ! digitalRead(13) );
lastBlinkTime=millis();
}
Je hoeft dan nergens te onthouden of die led wel aan of uit is. Je ziet ook wel eens dat er een digitalToggle library wordt gebruikt.
Het kan nog een stapje cryptischer, we kijken naar de 9e bit van de millis teller en schrijven dat naar de led pin:
digitalWrite(13,(millis() & 256) >> 8 );
Dat werkt ook met 512,1024,2048 enzovoorts.
benleentje
Golden Member
*K7Jz
Ja dat is inderdaad elegante code voor een blink led.
IK vind het zelf beter om eerst de tijd bij een variabele op te tellen en dat ik dan niet in de vergelijk het ervan moet aftrekken. Maar dat kan net zo makkelijk in jouw stuk code ook.
IK wil ook zeker niet beweren dat ik een goede programmeur ben integendeel juist maar op mijn eigen manieren met soms veel zoek werk op internet lukt het me wel.
En ja er zouden dingen best efficienter kunnen maar dan ben je soms 10 tegelijk proberen op te lossen.
Maar ben wel blij met je positieve feedback
Op zondag 25 februari 2024 20:30:17 schreef K7Jz:
Het kan nog een stapje cryptischer, we kijken naar de 9e bit van de millis teller en schrijven dat naar de led pin:
digitalWrite(13,(millis() & 256) >> 8 );Dat werkt ook met 512,1024,2048 enzovoorts.
goh, die is leuk, daar moet ik eens over nadenken om dat in mijn if loops te gebruiken ipv die delingen. zie voorbeeld hieronder.
met wat trukjes kan je dus de bits met een OR of AND zo bepalen dat je eender welke tijd kan gebruiken
als de code heel snel is, kan je zelf gewoon met delingen werken
verreist wel een paar voorwaarden
1) de loop moet er minstens 10ms over doen, anders ga je 2x de if uitvoeren of je moet dat getal verlagen. dit kun je zelf nog regelen met de delay. met een simpele serial.print kun je bepalen hoe snel de processor door zijn loop gaat.
ik bv ga vaak een aantal analoge metingen doen die elke 10ms gebeuren om er dan elke 1seconde een gemiddelde van nemen
deze code bespaart je wel een hoop variabelen want je moet de millis bijhouden van de 1e loop, en die van de 2de loop.
als je zo 30 processen laat lopen, loopt dat ferm op
void loop (){
if (millis()%1000<10){
Doe dit elke seconde
}
if (millis()%3000<10){
doe dit elke 3seconde
}
delay(10);
}Goedemorgen,
Ik heb het script van Beleentje gebruikt en loopt wederom tegen diverse dingen aan.
- De servo gaat bij het aanzetten van de Arduino aan en gaat niet meer uit.
- Het geluid wordt bij het aanzetten van de Arduino afgespeeld.
- Als ik op de drukknop druk gaat de led knipperen, maar gaat niet meer uit. Het geluid reageert niet op de drukknop.
- De 'clapper' werkt niet.
Ik heb het gevoel dat ik enorm op de verkeerde weg zit en zal opnieuw beginnen.
Nu enkel met drukknop, laat eerst dat maar werken, dan kan ik later evt nog andere dingen toevoegen.
Nog even voor de duidelijkheid het doel:
Bij drukken op de drukknop
- 5 seconde led aan (knippers vanzelf dus geen script voor nodig)
- 5 seconde de servo aan
- 1x get geluid afspelen.
Je hebt best veel zaken gaande.
Je moet eigenlijk elke letter code wantrouwen. dus zelfs als je in jouw situaties iets hebt als:
int soundsens = analogRead(soundpin);
if (soundsens >= threshold) {
//turns ledPin on
digitalWrite(uitgeluid,HIGH);
Dan moet je om te testen toch dingen veranderen bijvoorbeeld naar:
//int soundsens = analogRead(soundpin);
int soundsens = 0;
if (soundsens >= threshold) {
//turns ledPin on
digitalWrite(uitgeluid,HIGH);
Als het geluid dan nog steeds blijft spelen dan doe je zelfs:"
//int soundsens = analogRead(soundpin);
int soundsens = 0;
if (soundsens >= threshold) {
//turns ledPin on
uitcommentariëren:
//digitalWrite(uitgeluid,HIGH);
of misschien zelfs:
digitalWrite(uitgeluid,LOW);
En zo controleer je of elk karakter, woord of regel wel werkt zoals je dat verwacht. En als je nergens "uitgeluid HIGH" zet dan is er blijkbaar iets met de hardeware/spanning/opstarten waardoor de module zelf gaat spelen.
Er loopt hier nu ook een leuk draadje over een deurbelgong. Als je die los laat blijft hij ook bellen, waarschijnlijk door een spanningspiek die van de electromagneet terugkomt.
bij indrukken knop start je dus het geluid
zet de led aan
laat de servo lopen voor die 5sec
servo uit
led uit
geluid uit.
met je oude led was het dan
bij indrukken knop start je dus het geluid
zet de led aan
servo 1 beweging
led uit
servo weer terug
led aan
servo volgende beweging
...
geluid uit.
je moet dus gelijktijdig 1 ding doen, dan het andere ding doen, het ene uit, het andere uit, het ene weer aan...
Ja dat klopt.
Ik ben nu in Millis aan het duiken om dat te proberen te begrijpen.
Het geluid is een apart onderdeel, met een eigen voeding. Deze hoeft dus maar 1x getriggerd te worden, en het volledige geluidsbestand wordt dan afgespeeld. dus ik denk dat ik deze 'gewoon' aan de button kan verbinden, en dat dit dan relatief makkelijk is opgelost.
De uitdaging zit hem dan enkel nog in de servo en de lampjes 5 seconden, tegelijkertijd, aan te krijgen (en vooral ook weer te laten stoppen). Dit lijkt mij geen mega lastige klus.
als de leds nu zelf knipperen, is het gewoon een kwestie van de
led output high te zetten
daarna voer je dan het servo commando uit voor 5sec.
daarna zet je de led output af
en dat is het.
die klapper dat je hebt, kan je dan dezelfde functie geven als de drukknop
stel nu dat de servo 1sec bezig is. dan loop je de servo 5x door en dan is de 5sec om.
je kan het hard coden gewoon.
als je dan de led elke 0,5sec wil knipperen, dan zet je de led aan, beweeg de servo 0,5sec, led uit, servo aan 0,5sec, led aan...
gewoon een kwestie van de led aan/uit functie op te nemen in de servo
of je maakt een servo functie, die dan de millis() inleest in starttijd.
en dan door een do while loop gaat totdat millis groter is dan starttijd + 5000
[Bericht gewijzigd door fcapri op (16%)]
Op maandag 26 februari 2024 04:21:55 schreef fcapri:
[...].. deze code bespaart je wel een hoop variabelen want je moet de millis bijhouden van de 1e loop, en die van de 2de loop.
als je zo 30 processen laat lopen, loopt dat ferm opvoid loop (){ if (millis()%1000<10){ Doe dit elke seconde } if (millis()%3000<10){ doe dit elke 3seconde } delay(10); }
Ik doe het ook vaak zo, ik kwam echter zonder delay bij een onregelmatig patroon uit. Alsof soms die '<10' ms wordt gemist.. Het lag misschien aan de simulator. Ik heb deze regel zelfs genoteerd als 'kaarsvlam'
:
if ((millis() % 300) < 200) { // flicker like candle
// toggle pin
digitalWrite(2, ! digitalRead(2) );
}
Simulator: https://wokwi.com/projects/390806306065532929
Leuke simulator hierboven trouwens, doet ook ESP32
Hoi,
Opnieuw begonnen, en met behulp van alle tips en scripts ben ik denk ik een heel eind. Ik heb het circuit uitgetekend hoe het er nu uit ziet:
Aan de button zit de geluidsmodule, doordat deze gevoed is met batterij, gaat dit perfect.
zo ziet het er uit:
WhatsApp Video 2024-02-27 at 09.18.58.mp4
De lampjes knipperen niet tegelijkertijd, dat irriteert me. Dus wellicht toch voor ledjes en dan via het script laten knipperen, maar dat komt later wel.
Als ik voeding ook de voeding van mijn geluidsmodule aansluit gaat het mis, dan doet hij het niet meer:
WhatsApp Video 2024-02-27 at 09.19.02.mp4
Kan ik hier nog iets aan doen?
Hierbij het script:
#include <Servo.h>
Servo myservo;
const int LED = 13;
const int KNOP = 12;
int buttonState = 0;
int pos = 60;
bool movePos = true;
bool ledaan = false;
long ledduur = 0;
void moveServo(){
myservo.write(pos);
if (movePos) {
pos++;
if (pos == 80){
movePos = false;
}
} else {
pos--;
if (pos == 60) {
movePos = true;
}
}
delay(15);
}
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(KNOP, INPUT);
myservo.attach(8);
}
void loop() {
buttonState = digitalRead(KNOP);
if (buttonState == HIGH) {
moveServo();
ledaan = true;
ledduur = millis () +5000;
}
if (ledaan) {
digitalWrite(LED, HIGH);
moveServo();
if (millis() > ledduur) {
ledaan = false;
digitalWrite(LED, LOW);
}
}
}
als je die module nu via een andere voeding oplaad, speelt ze dan wel?
bv trek die blauwe en groene draad los van de knop, sluit de usb kabel aan, en duw die 2 draadjes groen/blauw eens tegen elkaar. speelt die dan wel of niet?
2de punt: bij die drukknoppen zijn de draden intern ook doorverbonden. dat zijn geen 2 fysieke schakelaars.
dus zo afgaande op de foto hangt de rode draad ook aan de groene
en de oranje ook aan de blauwe (mijn paars getekende lijnen is wat die schakelaar intern ook doet).
jouw rode draad is +5V neem ik aan. is de groene op de muziek print dan ook +5V of iets anders? mogelijks maak je daar iets fout omdat de usb kabel ook aan massa en +5V hangt.
ik had gewoon die 3V cellen eruit gehaald en van die 'accu aansluitingen' een draad gelegd naar de 3,3V van je arduino. zonder de USB dus.
voor die knipperleds.
neem eens een gewone led en een knipperled en hang die in serie op je voeding.
als de knipperled uit gaat, loopt er geen stroom en zal de andere serie led ook uitgaan.
wel geen 2 knipperleds nemen
in mijn ligfiets heb ik zo iets gemaakt voor de knipperlichten. een rode knipperled op een printje die altijd knippert, en die transistor aanstuurt
als die serieschakeling van 2leds niet goed werkt, kan je eenvoudig zo een knipperled gebruiken die een kleine BC547 aanstuurt die de 2 led ogen dan laat 'knipperen'
Op dinsdag 27 februari 2024 09:40:59 schreef fcapri:
2de punt: bij die drukknoppen zijn de draden intern ook doorverbonden. dat zijn geen 2 fysieke schakelaars.
dus zo afgaande op de foto hangt de rode draad ook aan de groene
en de oranje ook aan de blauwe (mijn paars getekende lijnen is wat die schakelaar intern ook doet).
jouw rode draad is +5V neem ik aan. is de groene op de muziek print dan ook +5V of iets anders? mogelijks maak je daar iets fout omdat de usb kabel ook aan massa en +5V hangt.
Je bent briljant, dit is inderdaad het probleem. Als ik 1 van de 2 draden aansluit op de schakeldraad van de Servo werkt het wel en blijft hij opladen.
Hoi,
Ik heb inmiddels onderstaand script waardoor ik de LEDs nu ook tegelijkertijd kan laten knipperen. Wederoom met een tip van hierboven, dus veel dank!
Nu denk ik dat ik bijna zover ben, ik wil echter graag nog een vertraging van zeg 0,5 seconde voordat de servo start.
De rest moet wel direct starten.
Heeft iemand voor mij een tip hoe ik deze met 0,5 sec vertraging (t.o.v. het indrukken van de knop) kan laten starten?
het script:"
#include <Servo.h>
Servo myservo;
const int LED = 13;
const int KNOP = 12;
int buttonState = 0;
int pos = 60;
bool movePos = true;
bool ledaan = false;
long ledduur = 0;
void moveServo(){
myservo.write(pos);
if (movePos) {
pos++;
if (pos == 80){
movePos = false;
}
} else {
pos--;
if (pos == 60) {
movePos = true;
}
}
delay(15);
}
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(KNOP, INPUT);
myservo.attach(8);
}
void loop() {
buttonState = digitalRead(KNOP);
if (buttonState == HIGH) {
moveServo();
ledaan = true;
ledduur = millis () +4100;
}
if (ledaan) {
digitalWrite(LED, HIGH);
digitalWrite(13,(millis() & 512) >> 8 );
moveServo();
if (millis() > ledduur) {
ledaan = false;
digitalWrite(LED, LOW);
}
}
}
digitalWrite(LED, HIGH);
digitalWrite(13,(millis() & 512) >> 8 );
De bovenste regel is overbodig. 13 is gelijk aan LED. Je zet dus eerst de led aan en enkele microseconden later ga je hem aan of uitzetten op basis van bit 9 van millis(). Het kan dus zo:
digitalWrite(LED,(millis() & 512) >> 8 );
Ik zou servo vertraging zo doen. Ik sla ook die buttonPressed over door die direct in de if statement te zetten. moveServo staat er ook dubbel.
Ik trek alle if-statements uit elkaar. 'Geneste' ifs moet je proberen te voorkomen. Dat leest gewoon erg lastig en geeft snel fouten.
if ( digitalRead(KNOP) == HIGH) { //éénmalige variable sla ik over
// moveServo(); kan hier weg.
ledaan = true;
ledduur = millis () +4100;
servoStart = millis() + 500;
}
if (ledaan) {
digitalWrite(LED,(millis() & 512) >> 8 ); //knipper led
}
if (millis()>servoStart && ledaan) { //als de starttijd voorbij is én de led aan is dan bewegen we servo.
moveServo();
}
if (millis() > ledduur) {
ledaan = false;
digitalWrite(LED, LOW);
}
servoStart moet je ook nog even aan het begin definieren als long.
Overigens is dit ook een mooi moment om 'ledaan' een betere naam te geven als 'animationOn' ofzoiets.. idem voor ledduur.. Omdat je over 3 jaar denkt dat je daar alleen de ledjes mee controleert maar de servo is er ook mee verbonden.
Hoi,
Ik ben aan het oefenen met solderen. Maar het gekke is dat 1 van mijn leds niet meer werkt.
Ik heb exact dezelfde route als via het breadboard, dus ik heb het idee dat ik gek wordt.
Ik heb de verbindingen al meermaals opnieuw aangelegd, maar kom er niet uit.
1 van de 2 doet het, maar tegelijkertijd lukt niet.
iemand een gouden tip?

werkt de led nog?
neem zo een 3V lithium cel en tik met2 draadjes kort de led eens aan.
zit misschien verkeerd om, of is kapot door hitte van solderen
Nou dat is me toch wat... je hebt gelijk, lampje stuk.
Dan is bij het verwisselen van de lampjes de eerste keer ook al het lampje direct stuk gegaan. Wist niet dat dat zo snel kan gaan.
Thanx 