Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Cum sterg mails din Promotions

Vanzare cumparare fara transfer b...

Receptie ciudata, in functie de t...

Dupa 20 ani de facultate, am uita...
 Mobile.de ofera imprumut de bani ...

problema test grila

Digi24 a disparut de pe TV Lg

Drept de proprietate intelectuala...
 Jante noi shitbox

Trinitas TV 4K

Dacia 1316 cu 6 usi ...

Frecventa modificata radio
 Un nou pericol pt batrani

Ar trebui sa vindem imobiliarele ...

Dupa renuntarea la aparat dentar

pelerinaj in Balcik
 

Arduino Led Dimmer with ON/OFF button

- - - - -
  • Please log in to reply
11 replies to this topic

#1
rokyronnie

rokyronnie

    Member

  • Grup: Members
  • Posts: 559
  • Înscris: 21.09.2007
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

  • Attached File  dimm.png   61.23K   15 downloads


#2
maccip

maccip

    46 ani

  • Grup: Senior Members
  • Posts: 33,266
  • Înscris: 06.01.2007
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,444
  • Înscris: 10.08.2005
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
rokyronnie

rokyronnie

    Member

  • Grup: Members
  • Posts: 559
  • Înscris: 21.09.2007
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
MarianG

MarianG

    be that as it may

  • Grup: Moderators
  • Posts: 31,444
  • Înscris: 10.08.2005
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
rokyronnie

rokyronnie

    Member

  • Grup: Members
  • Posts: 559
  • Înscris: 21.09.2007
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
Florin__Adrian

Florin__Adrian

    Member

  • Grup: Members
  • Posts: 465
  • Înscris: 11.05.2019
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
rokyronnie

rokyronnie

    Member

  • Grup: Members
  • Posts: 559
  • Înscris: 21.09.2007
@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
Florin__Adrian

Florin__Adrian

    Member

  • Grup: Members
  • Posts: 465
  • Înscris: 11.05.2019
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
rokyronnie

rokyronnie

    Member

  • Grup: Members
  • Posts: 559
  • Înscris: 21.09.2007
@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
Florin__Adrian

Florin__Adrian

    Member

  • Grup: Members
  • Posts: 465
  • Înscris: 11.05.2019
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
rokyronnie

rokyronnie

    Member

  • Grup: Members
  • Posts: 559
  • Înscris: 21.09.2007
Gata, functioneaza asa cum imi doream.
Multumesc foarte frumos! Posted Image

Anunturi

Neurochirurgie minim invazivă Neurochirurgie minim invazivă

"Primum non nocere" este ideea ce a deschis drumul medicinei spre minim invaziv.

Avansul tehnologic extraordinar din ultimele decenii a permis dezvoltarea tuturor domeniilor medicinei. Microscopul operator, neuronavigația, tehnicile anestezice avansate permit intervenții chirurgicale tot mai precise, tot mai sigure. Neurochirurgia minim invazivă, sau prin "gaura cheii", oferă pacienților posibilitatea de a se opera cu riscuri minime, fie ele neurologice, infecțioase, medicale sau estetice.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate