Sommario:

DS1803 Doppio potenziometro digitale con Arduino: 5 passaggi
DS1803 Doppio potenziometro digitale con Arduino: 5 passaggi

Video: DS1803 Doppio potenziometro digitale con Arduino: 5 passaggi

Video: DS1803 Doppio potenziometro digitale con Arduino: 5 passaggi
Video: Почтовый мешок! Цифровой потенциометр DS1803 и другой кремний 2024, Settembre
Anonim
DS1803 Doppio potenziometro digitale con Arduino
DS1803 Doppio potenziometro digitale con Arduino

Mi piace condividere l'utilizzo di un potmeter digitale DS1803 con un Arduino. Questo circuito integrato contiene due potmeter digitali che possono essere controllati tramite un'interfaccia a due fili, per questo utilizzo la libreria wire.h.

Questo circuito integrato può sostituire un normale potmeter analogico. In questo modo puoi controllare ad esempio un amplificatore o un alimentatore.

In questa istruzione controllo la luminosità di due LED per mostrare il funzionamento.

L'arduino conta gli impulsi di un encoder rotativo e posiziona il valore nella variabile pot[0] e pot[1]. Quando si preme l'interruttore sull'encoder, è possibile passare da pot[0] a pot[1].

Il valore effettivo delle pentole viene letto dal DS1803 e posto nelle variabili potValue[0] e potValue[1] e visualizzato su un LCD.

Passaggio 1: collegamenti del DS1803

Connessioni del DS1803
Connessioni del DS1803

Qui puoi vedere le connessioni del DS1803. H è il lato alto del potenziometro, L il lato basso e W il tergicristallo. SCL e SDA sono i collegamenti bus.

Con la connessione A0, A1 e A2 puoi dare al DS1803 il proprio indirizzo, in questo modo puoi controllare più dispositivi tramite un bus. Nel mio esempio ho assegnato al DS1803 l'indirizzo 0 collegando tutti i pin a terra.

Passaggio 2: byte di comando

Byte di comando
Byte di comando

Il modo in cui opera il DS1803 può essere utilizzato nel byte di comando. Quando si seleziona "scrivi potenziometro-0" vengono selezionati entrambi i potenziometri, quando si desidera regolare solo il potenziometro-0, è sufficiente inviare il primo byte di dati. "Scrivi potenziometro-1" regola solo il potenziometro-1. "Scrivi su entrambi i potenziometri" fornisce a entrambi i potenziometri lo stesso valore.

Passaggio 3: controllo del DS1803

Controllo del DS1803
Controllo del DS1803

Il byte di controllo (figura 3) ha un identificatore di dispositivo, questo rimane sempre lo stesso. Nel mio esempio A0, A1 e A2 sono 0 perché selezioniamo adres mettendo a massa tutti i pin A. L'ultimo bit R/W sarà impostato su 0 o 1 dal comando "Wire.beginTransmission" e "Wire.requestFrom" in Arduino. Nella figura 5 si vede l'intero telegramma. Il telegramma letto è mostrato in figura 4.

Passaggio 4: configurazione

Impostare
Impostare

Questo circuito mostra come collegare tutto. Il Nokia LCD è disponibile con diverse connessioni, assicurati di collegare correttamente la tua. Anche l'encoder rotativo ha le sue diverse versioni, alcune hanno il comune sul pin centrale altre no. Ho messo una piccola rete di filtri (resistenza da 470 Ohm con cappuccio da 100 nF) per filtrare i segnali di uscita A e B dell'encoder. Ho bisogno di questo filtro perché l'uscita ha avuto molto rumore. Ho anche inserito un timer antirimbalzo nel mio programma per eliminare un po' di rumore. Per il resto penso che il circuito sia sgombro. Il display LCD può essere ordinato tramite Adafruit

Passaggio 5: il programma

Per l'utilizzo del bus a 2 fili includo la libreria Wire.h. Per utilizzare l'LCD includo la libreria Adafruit che puoi scaricare da https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library anche la libreria Adafruit_GFX.h è disponibile qui https://github. com/adafruit/Adafruit-GFX-Library.

#includere

#includere

#includere

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);

Qui puoi vedere tutte le variabili. Byte di controllo e byte di comando come descritto in precedenza. Il deBounceTime può essere regolato in base al rumore sull'encoder.

byte pot[2] = {1, 1}; byte controlByte = B0101000; // 7 bit, byte commandByte = B10101001; // gli ultimi 2 bit sono la selezione del potmeter. byte potValue[2]; int i = 0; int deBounceTime = 10; // Regola questo valore in base al rumore const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; unsigned lungo newDebounceTime = 0; OldTime lungo non firmato; booleano premuto = 0; conteggio booleano = 1;

Nel setup definisco i pin giusti e metto il testo statico sull'LCD

void setup() { Wire.begin(); Serial.begin(9600); pinMode(encoder_A, INPUT); pinMode(encoder_B, INPUT); pinMode(pulsantePin, INPUT); newDebounceTime = millis();

display.begin();

display.setContrast(50); display.clearDisplay(); display.setTextSize(1); display.setTextColor(BLACK); display.setCursor(0, 10); display.println("POT 1="); display.setCursor(0, 22); display.println("POT 2="); display.display();

}

Nel ciclo prima controllo se l'intervallo è superiore a 500 ms, in caso affermativo il display LCD viene aggiornato. In caso contrario, il pulsante sull'encoder è selezionato. Se premuto il toggleBuffer viene chiamato. Successivamente viene controllato l'encoder. Se l'ingresso 0 è basso (rilevata rotazione) controllo l'ingresso B, se l'ingresso B è 0 incremento pot, gli altri diminuisco. Dopodiché il valore sarà inviato al DS1803 tramite wire.write.

ciclo vuoto() {

intervallo();

if(digitalRead(buttonPin)== 1 && (premuto == 0)){toggleBuffer();} if(digitalRead(buttonPin)== 0){premuto = 0;}

if (digitalRead(encoder_A) == 0 && count == 0 && (millis() - newDebounceTime > deBounceTime)){ if (digitalRead(encoder_B) == 0){ pot++; if(pot > 25){pot = 25;} }else{ pot--; if(pot < 1){pot = 1;} } conteggio = 1; newDebounceTime = millis();

Wire.beginTransmission(controlByte); // inizia a trasmettere

Wire.write(commandByte); // selezione potmeter Wire.write(pot[0] * 10); // invia il primo byte dei dati del potenziometro Wire.write(pot[1] * 10); // invia il secondo byte dei dati del potenziometro Wire.endTransmission(); // interrompe la trasmissione }else if (digitalRead(encoder_A) == 1 && digitalRead(encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)){ count = 0; newDebounceTime = millis(); } }

void toggleBuffer(){ premuto = 1; if (i == 0){i = 1;}else{i = 0;} }

Per prima cosa pulisco l'area in cui devo scrivere le variabili. Lo faccio per disegnare un rettangolo in quest'area. Dopodiché scrivo le variabili sullo schermo.

void writeToLCD(){ Wire.requestFrom(controlByte, 2); potValue[0] = Wire.read(); // legge il primo byte potValue[1] = Wire.read(); // legge il secondo byte del potenziometro display.fillRect(40, 0, 40, 45, WHITE); // cancella lo schermo variabile sul display LCD.setCursor(40, 10); display.print(potValue[0]); // scrive il primo valore del potenziometro sul display LCD.setCursor(40, 22); display.print(potValue[1]); // scrive il secondo valore del potenziometro sul display LCD.setCursor(60, (10 + i * 12)); display.print("<"); display.display(); }

void interval(){ // timer a intervalli per scrivere dati su LCD if ((millis() - oldTime) > 500) { writeToLCD(); oldTime = millis(); } }

Consigliato: