Chirurgia cranio-cerebrală minim invazivă
Tehnicile minim invazive impun utilizarea unei tehnologii ultramoderne. Endoscoapele operatorii de diverse tipuri, microscopul operator dedicat, neuronavigația, neuroelectrofiziologia, tehnicile avansate de anestezie, chirurgia cu pacientul treaz reprezintă armamentarium fără de care neurochirurgia prin "gaura cheii" nu ar fi posibilă. Folosind tehnicile de mai sus, tratăm un spectru larg de patologii cranio-cerebrale. www.neurohope.ro |
Arduino Led Dimmer with ON/OFF button
Last Updated: Jul 18 2019 18:02, Started by
rokyronnie
, Jul 18 2019 09:55
·
0
#1
Posted 18 July 2019 - 09:55
Salut,
Încerc să fac un led dimmer cu potentiometru la care să adaug si o simplă funcție de on/off din push buton, însă nefiind programator, nu prea reușesc. Acesta este un codul pentru dimmer: int ledPin = 9; int buttonPin = 2; int potPin = A0; int readValue; int writeValue; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); pinMode(potPin, INPUT); } void loop() { readValue = analogRead(potPin); writeValue = (255./1023.) * readValue; analogWrite(ledPin, writeValue); } Acesta este codul pentru ON/OFF din push button: int ledPin = 9; int buttonPin = 2; int toggleState; int lastButtonState = 1; long unsigned int lastPress; int debounceTime = 20; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } void loop() { int buttonState = digitalRead(buttonPin); if((millis() - lastPress) > debounceTime) { lastPress = millis(); if(buttonState == 0 && lastButtonState == 1) { toggleState =! toggleState; digitalWrite(ledPin, toggleState); lastButtonState = 0; } if(buttonState == 1 && lastButtonState == 0) { lastButtonState = 1; } } } Ma poate ajuta cineva sa 'imbin' aceste coduri? in asa fel incat sa am un circuit in care din potentiometru reglez intensitatea si din buton pot sa pornesc si sa opresc ledul. Multumesc! Attached Files |
#2
Posted 18 July 2019 - 11:05
Pai faci asa.. ce-i in afara lui loop()lecombini si lasi in afara lui loop(), ce-i inauntru, bagi totul inauntru. Nu conteaza ordinea deoarece cele doua programe lucreaza independent.
|
#3
Posted 18 July 2019 - 11:13
ON - OFF este binar
potentiometru este analogic, sau semnal discres 0 - 15 (0-255) problema este ca nu trebuie sa imbini codurile, ci sa definesti modul de functionare al becului daca apesi pe buton sa ignore potentiometru daca se schimba valoare potentiometrului sa ignore butonul |
#4
Posted 18 July 2019 - 11:25
Dacă am înțeles eu bine ce spui, atunci cam asta ar fi, doar că nu ține cont de buton, merge doar potentiometrul.
int ledPin = 9; int buttonPin = 2; int potPin = A0; int readValue; int writeValue; int toggleState; int lastButtonState = 1; long unsigned int lastPress; int debounceTime = 20; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); pinMode(potPin, INPUT); } void loop() { readValue = analogRead(potPin); writeValue = (255./1023.) * readValue; analogWrite(ledPin, writeValue); int buttonState = digitalRead(buttonPin); if((millis() - lastPress) > debounceTime) { lastPress = millis(); if(buttonState == 0 && lastButtonState == 1) { toggleState =! toggleState; digitalWrite(ledPin, toggleState); lastButtonState = 0; } if(buttonState == 1 && lastButtonState == 0) { lastButtonState = 1; } } } @Marian Ceva de genul, exact ca si cum ai avea un intrerupator de perete in camera cu un buton cu click si un potentiometru. butonul cu click il aprinde sau il stinge iar acesta lumineaza la intensitatea definita de potentiometru, respectiv daca acesta e inchis la maxim, atuci becul nu va lumina, chiar daca teoretic el se afla pe pozitia ON. Exact asa cum functioneaza aici: [ https://www.youtube-nocookie.com/embed/0ut_l1bzj-0?feature=oembed - Pentru incarcare in pagina (embed) Click aici ] |
#5
Posted 18 July 2019 - 11:44
Butonul este cu retragere ?
si nu merge "doar" potentimetru, doar ca potentimetru merge tot timpul, iti merge si butonul, un singur cilcu, apoi revine potentimetru separa functiile de citire potentimetru si aprindere led ai nevoi de o functie care sa monitorizeze cand se schimba potentimetru, si de o functie care sa vada cand este apasat butonul in loop o sa apara ceva de genul if stateChanged { output analog } if buttonWasPressed { toggleOutput } Edited by MarianG, 18 July 2019 - 11:44. |
#6
Posted 18 July 2019 - 13:32
Acest cod răspunde la potențiometru însă nu și la buton
int SwitchInputPin = 2; int LEDDrivePin = 9; int potPin = A0; volatile byte ButtonState = HIGH; void setup() { pinMode(LEDDrivePin, OUTPUT); pinMode(SwitchInputPin, INPUT); attachInterrupt(digitalPinToInterrupt(SwitchInputPin), OnButtonPressed, FALLING); } void OnButtonPressed() { ButtonState = !ButtonState; } void loop() { int PotValue = analogRead(potPin); if(ButtonState) { PotValue = map(PotValue, 0, 1023, 0, 255); analogWrite(LEDDrivePin,PotValue); } else { digitalWrite(LEDDrivePin, LOW); } } Am observat ca daca schimb acolo la volatile byte din High in Low atunci se opreste ledul, deci cred ca nu comunica cu butonul. |
#7
Posted 18 July 2019 - 16:07
Poftim. Poti da on/off din button la led, cand e on ledul ii controlezi intensitatea din potentiometru.
int ledPin = 9; int buttonPin = 2; int potPin = A0; int readValue; int writeValue; int buttonState; // the current reading from the input pin int lastButtonState = LOW; // the previous reading from the input pin // the following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // the last time the output pin was toggled unsigned long debounceDelay = 50; // the debounce time; increase if the output flickers int ButtonPress = 0; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT); pinMode(potPin, INPUT); } void loop() { // read the state of the switch into a local variable: int reading = digitalRead(buttonPin); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (reading != lastButtonState) { // reset the debouncing timer lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if (reading != buttonState) { buttonState = reading; // only if the new button state is HIGH if (buttonState == HIGH) { if (ButtonPress == 1) ButtonPress = 0; else ButtonPress = 1; } } } lastButtonState = reading; Serial.println(ButtonPress); if (ButtonPress == 1) { readValue = analogRead(potPin); writeValue = (255./1023.) * readValue; analogWrite(ledPin, writeValue); } else analogWrite(ledPin, 0); } Edited by Florin__Adrian, 18 July 2019 - 16:11. |
#8
Posted 18 July 2019 - 16:27
@Florin_Adrian
Multumesc frumos, insa din pacate nu merge. Daca schimb eu int ButtonPress = 1; in loc de 0, atunci ledul se aprinde si asculta de potentiometru insa nu si de buton |
#9
Posted 18 July 2019 - 16:35
Pune butonul ca aici: https://www.arduino....torial/debounce , la led sa ai un resistor de 220ohm intre pinul 9 si el, pentru ground nu ai nevoie.
Am facut si un video: [ https://www.youtube-nocookie.com/embed/vJgmuwhecNI?feature=oembed - Pentru incarcare in pagina (embed) Click aici ] |
#10
Posted 18 July 2019 - 17:19
@Florin_Adrian
Multumesc frumos! Am executat montajul intr-un simulator, doar ca sa testez si functioneaza. Dilema mea acum e urmatoarea: eu am acest circuit deja gata, pentru ca el functioneaza si ca un MIDI controller, atat potentiometrul cat si butonul. Trebuie obligatoriu sa am aceasta legatura a butonului la 5V? sau se poate scrie altfel codul ca sa functioneze si fara, pentru ca fara aceasta legatura, observ ca nu functioneaza, insa, eu am mai incercat coduri simple doar pentru ON/OFF si cu butonul legat doar la GND si 2, asa cum il am deja in montaj, functiona. De exemplu acesta: int ledPin = 9; int buttonPin = 2; int toggleState; int lastButtonState = 1; long unsigned int lastPress; int debounceTime = 20; void setup() { pinMode(ledPin, OUTPUT); pinMode(buttonPin, INPUT_PULLUP); } void loop() { int buttonState = digitalRead(buttonPin); if((millis() - lastPress) > debounceTime) { lastPress = millis(); if(buttonState == 0 && lastButtonState == 1) { toggleState =! toggleState; digitalWrite(ledPin, toggleState); lastButtonState = 0; } if(buttonState == 1 && lastButtonState == 0) { lastButtonState = 1; } } } Intreb acest lucru pentru ca, in nici un cod ce tine de partea de MIDI controller, el nu este legat asa si nu as vrea sa stric ceva. Attached Files |
|
#11
Posted 18 July 2019 - 17:58
Cu placere. Pentru buton elimina de la ground acel rezistor, scoate firul pentru pinul 2 si in loc de conexiunea la 5v il legi la pinul 2.
Si codul va fi urmatorul: https://pastebin.com/TPKBtPm4 Nu stiam de posibilitatea asta cu butonul, google m-a rezolvat. Edited by Florin__Adrian, 18 July 2019 - 18:00. |
#12
Posted 18 July 2019 - 18:02
Gata, functioneaza asa cum imi doream.
Multumesc foarte frumos! |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users