Domanda:
Come attivare / disattivare il dimmer della luce utilizzando un altro pin?
Hasan
2017-01-19 17:38:35 UTC
view on stackexchange narkive permalink

In un progetto recente, sto lavorando con il dimmer della luce.

Mi spiego con un esempio di ventilatore. Nel quadro elettrico, abbiamo un interruttore della ventola che può in grado di ACCENDERE / SPEGNERE il nostro REGOLATORE DI VENTOLA & che varia la velocità del nostro ventilatore. Ora, quando il nostro interruttore si accende, la nostra ventola si avvia e quindi con l'aiuto del regolatore possiamo variare la velocità della ventola. E quando spegniamo la nostra ventola si ferma e non possiamo fare nulla significa non variare la velocità della ventola. Le stesse cose che voglio nel mio dimmer. Un pulsante premuto una volta, quindi è solo avviare il mio dimmer della luce e viceversa. E quando il pulsante viene premuto di nuovo, interrompe il mio dimmer.

Ecco il mio codice completo.

  int kPinPWM = 9; // Questo pin fornisce valori PWMint kPinSW1 = 6; // PUSH BUTTON // Questo pin utilizzato per aumentare i valori PWMint kPinSW2 = 7; // PUSH BUTTON // Questo pin utilizzato per diminuire i valori PWMint kPinSw = 10; // PUSH BUTTON // Questo pin utilizzato per il pin PWM ON / OFF significa pin ON / OFF 9int i = 0; int temp = 0; // Flagvoid setup () {pinMode (kPinPWM, OUTPUT); pinMode (kPinSW1, INPUT); pinMode (kPinSW2, INPUT); digitalWrite (kPinSW1, HIGH); digitalWrite (kPinSW2, HIGH); pinMode (kPinSw, INPUT); digitalWrite (kPinSw, HIGH);} void loop () {if (digitalRead (kPinSw) == LOW && temp == 0) // Se ho premuto PUSH BUTTOPN (PIN 10) e temp = 0 {temp = 1; // Cambia il valore in 1 // temp = 1 digitalWrite (kPinPWM, HIGH); // Attiva il pin PWM (PIN 9) if (digitalRead (kPinSW1) == LOW) // Premi il PULSANTE per aumentare il valore PWM {i ++; se (i > 4) {i = 4; } while (digitalRead (kPinSW1) == LOW); // Fino a quando il PUSH BUTTON non viene premuto} if (digitalRead (kPinSW2) == LOW) // Pressed PUSH BUTTON per diminuire il valore PWM {i--; se (i < 0) {i = 0; } while (digitalRead (kPinSW2) == LOW); // Fino a quando non viene premuto il PUSH BUTTON} interruttore (i) {caso 0: analogWrite (kPinPWM, 0); // Quando il pulsante premuto non premuto invia 0 interruzione del valore;
caso 1: analogWrite (kPinPWM, 64); // Quando viene premuto il pulsante e i = 1 invia 64 interruzioni di valore; caso 2: analogWrite (kPinPWM, 128); // Quando viene premuto il pulsante e i = 2 invia 128 interruzioni di valore; caso 3: analogWrite (kPinPWM, 192); // Quando viene premuto il pulsante e i = 3 invia 192 interruzioni di valore; caso 4: analogWrite (kPinPWM, 255); // Quando viene premuto il pulsante e i = 4 invia 255 interruzioni di valore; }} if (digitalRead (kPinSw) == LOW && temp == 1) // Se ho premuto PUSH BUTTOPN (PIN 10) e temp = 1 {temp = 0; // Cambia il valore in 0 // temp = 0 digitalWrite (kPinPWM, LOW); Disattiva il pin PWM (PIN 9)}}  
Vuoi dire che vuoi che i pin 9 e 10 siano ENTRAMBI in grado di oscurare e accendere / spegnere una luce? Se è così, devi solo racchiudere il tuo codice in una funzione e prendere il numero del pin come parametro.
Vuoi dire che vuoi usare il pin 10 come ingresso per controllare l'uscita PWM, o vuoi usare il pin 10 come uscita per controllare se il segnale PWM arriva alla luce o no?
@Matt Sì, esattamente. Ok proverò.
@Majenko Voglio rendere il pin 10 come pin di ingresso che solo ON / OFF pin pwm 9. Non controllando il PWM controlla solo il pin PWM. Significa usare il pin 10 solo ON / OFF PWM pin 9. Supponiamo, ho premuto il PIN 10, quindi è ON PWM pin 9 e posso essere in grado di oscurare e vedere il verso della mia luce. E quando ho premuto di nuovo il PIN 10, il pin 9 PWM è spento e non viene eseguita alcuna operazione.
@Hasan - Per come l'ho letto, la tua risposta a me ea Majenko dice due cose diverse. Non ho ancora idea di cosa vuoi, scusa.
Spiega cosa vuoi che facciano i tre pulsanti. Spiega anche cosa sta facendo il codice. Cosa non sta facendo il codice. O cosa sta facendo il codice di sbagliato. Inoltre, la prima istruzione if all'interno della funzione loop sembra molto strana. Sembra che tu debba tenere premuto il pulsante affinché uno qualsiasi degli altri pulsanti o codice funzioni.
@matt Ok, lascia che ti spieghi alcune cose.
@Gerben Ok, capisci le tue cose. Fammi chiarire le cose.
Ti ho dato un voto positivo per i commenti. In futuro `enum` potrebbe aiutarti a correggere un codice ancora più chiaro (piuttosto che usare gli int per definire gli stati). Sto ancora esaminando il codice.
Due risposte:
Hasan
2017-01-20 18:55:21 UTC
view on stackexchange narkive permalink

Finalmente trovo la soluzione. Qui, rilevo quando l'interruttore viene premuto invece del pulsante viene premuto. Quindi, per questo ho usato StateChangeDetection. Quindi il ciclo while è appena stato rimosso dal codice. E ho fatto la funzione per eseguire il dimmer e viceversa. KSo, ora sono in grado di ON / OFF il pin PWM. E anche variare il pin PWM. Grazie a tutti per il vostro impegno.

Ecco il mio codice completo.

  const int buttonPin1 = 2; const int buttonPin2 = 3; const int buttonPin3 = 4; const int pwmPin = 9; const int onOffPin = 10; int buttonState1 = 0; int lastButtonState1 = 0; int buttonState2 = 0; int lastButtonState2 = 0; int buttonState3 = 0; int lastButtonState3 = 0; int buttonPushCounter = 0; int onOffCounter = 0; void setup () {pinMode (buttonPin1, INPUT); pinMode (buttonPin1, INPUT); pinMode (pwmPin, OUTPUT); pinMode (onOffPin, OUTPUT); Serial.begin (9600);} void loop () {buttonState3 = digitalRead (buttonPin3); if (buttonState3! = lastButtonState3) {if (buttonState3 == HIGH) {onOffCounter ++; Serial.println ("Pulsante 3 attivo"); Serial.print ("numero di pressioni del pulsante 3:"); Serial.println (onOffCounter); } else {Serial.println ("Button 3 off"); } ritardo (50); } lastButtonState3 = buttonState3; if (onOffCounter% 2 == 0) {Serial.println ("Switch is OFF"); analogWrite (pwmPin, 0); } altro {PWM_fun (); Serial.println ("Switch is ON"); }} void PWM_fun () {buttonState1 = digitalRead (buttonPin1); if (buttonState1! = lastButtonState1) {if (buttonState1 == HIGH) {buttonPushCounter ++; Serial.println ("Pulsante 1 attivato"); Serial.print ("numero di pressioni del pulsante 1:"); Serial.println (buttonPushCounter); if (buttonPushCounter > 4) {buttonPushCounter = 4; }} else {Serial.println ("Button 1 off"); } ritardo (50); } lastButtonState1 = buttonState1; buttonState2 = digitalRead (buttonPin2);
if (buttonState2! = lastButtonState2) {if (buttonState2 == HIGH) {buttonPushCounter--; Serial.println ("Pulsante 2 attivato"); Serial.print ("numero di pressioni del pulsante 2:"); Serial.println (buttonPushCounter); if (buttonPushCounter < 0) {buttonPushCounter = 0; }} else {Serial.println ("Button 2 off"); } ritardo (50); } lastButtonState2 = buttonState2; switch (buttonPushCounter) {case 0: analogWrite (pwmPin, 0); rompere; caso 1: analogWrite (pwmPin, 64); rompere; caso 2: analogWrite (pwmPin, 128); rompere; caso 3: analogWrite (pwmPin, 192); rompere; caso 4: analogWrite (pwmPin, 255); rompere; }}  
Mark Smith
2017-01-20 00:20:32 UTC
view on stackexchange narkive permalink

Grazie per il chiarimento.

Ecco un po 'di codice che dovrebbe farlo:

  int kPinPWM = 9; // Questo pin fornisce valori PWMint kPinSW1 = 6; // PUSH BUTTON // Questo pin utilizzato per aumentare i valori PWMint kPinSW2 = 7; // PUSH BUTTON // Questo pin utilizzato per diminuire i valori PWMint kPinSw = 10; // PUSH BUTTON // Questo pin utilizzato per il pin PWM ON / OFF significa pin 9 ON / OFF // Impostazioni di avvio: int level = 0; // Livello più basso booleano on = false; // Configurazione Offvoid () {pinMode (kPinPWM, OUTPUT); pinMode (kPinSW1, INPUT); pinMode (kPinSW2, INPUT); pinMode (kPinSw, INPUT); digitalWrite (kPinSW1, HIGH); digitalWrite (kPinSW2, HIGH);} void loop () {// Legge ogni pulsante a turno se (digitalRead (kPinSW1) == LOW) // Premuto il PULSANTE per aumentare il valore PWM {livello ++; if (livello > 4) {livello = 4; } while (digitalRead (kPinSW1) == LOW); // Fino al rilascio del PUSH BUTTON} if (digitalRead (kPinSW2) == LOW) // Premuto il PUSH BUTTON per diminuire il valore PWM {level--; if (livello < 0) {livello = 0; } while (digitalRead (kPinSW2) == LOW); // Fino a quando il PUSH BUTTON non viene premuto} if (digitalRead (kPinSw) == LOW) // Premuto PUSH BUTTON per accendere / spegnere {// Se siamo già accesi, spegnilo. se (acceso) acceso = falso; // Se siamo già spenti, accendili. altro su = vero; while (digitalRead (kPinSW1) == LOW); // Fino al rilascio del pulsante} // Ora imposta l'uscita PWM se (on) {// Siamo attivi, quindi imposta l'interruttore di livello (livello) {case 0: // Forse non vuoi che questo "off" livello..? analogWrite (kPinPWM, 0); rompere; caso 1: analogWrite (kPinPWM, 64); rompere; caso 2: analogWrite (kPinPWM, 128); rompere; caso 3: analogWrite (kPinPWM, 192); rompere; caso 4:
analogWrite (kPinPWM, 255); rompere; default: // Questo non dovrebbe mai accadere, ma dovremmo // gestirlo "solo nel caso" analogWrite (kPinPWM, 255); }} else {// Siamo fuori, quindi ferma il PWM analogWrite (kPinPWM, 0); }}  

Trattiamo due variabili: il livello e lo stato di attivazione / disattivazione.

I pulsanti 6 e 7 influenzano il livello e il pulsante 10 influisce sull'attivazione / disattivazione stato.

Come con un fan, questo codice ci permette di cambiare il "livello" anche quando è spento. Non ha effetto immediato, ma alla riaccensione il livello sarà cambiato.


Alcune cose da dire sulla domanda in generale:

  1. Prova per spiegare più chiaramente esattamente cosa vuoi ottenere. Ad esempio, che cosa esattamente vuoi che faccia il pulsante 10? Attivare il PWM? A che valore? Ho scelto a metà strada, ma potresti volere il valore più alto, o il valore più basso, o il valore che aveva l'ultima volta che hai premuto il pulsante 10.
  2. Non c'è bisogno di commentare il codice così letteralmente. Sappiamo letteralmente cosa fa if (temp == 0) . Sarebbe utile dare alle cose nomi propri e / o spiegare il loro significato . Cosa stai cercando di ottenere con temp ? (Non mi era del tutto chiaro, quindi l'ho rimosso.)
Ok, lasciami spiegare di più. Permettimi di aggiornare la mia domanda in modo più chiaro con una breve descrizione. Spero che sia chiaro ogni tuo dubbio.
Grazie per le modifiche, ma ancora una volta possiamo vedere cosa fa il codice * *. Per favore, prova a spiegare, in modo chiaro e senza molti dettagli non necessari, cosa * vuoi * che faccia - il comportamento che desideri. Penso che dovresti essere in grado di spiegarlo in 5 righe di testo.
Ok, ottieni il tuo punto. Mi spiego con l'esempio di fan. Nel quadro elettrico, abbiamo un interruttore della ventola che può in grado di ACCENDERE / SPEGNERE la nostra ventola e REGOLATORE DELLA VENTOLA che variano la velocità della nostra ventola. Ora, quando il nostro interruttore si accende, la nostra ventola si avvia e quindi con l'aiuto del regolatore possiamo variare la velocità della ventola. E quando spegniamo, la nostra ventola si ferma e non possiamo fare nulla significa non variare la velocità della ventola. Le stesse cose che voglio nel mio dimmer. Un pulsante premuto una volta, quindi è solo avviare il mio dimmer della luce e viceversa. E quando il pulsante viene premuto di nuovo, interrompe il dimmer. Spero che tu capisca.
Ho provato il tuo codice. Ma non funziona come voglio. Grazie ancora per il tuo impegno. Trovo la soluzione. Caricherò codice e spiegazione.
Sentiti libero di spiegare come si differenzia da ciò che desideri.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...