Inhoudsopgave:
- Stap 1: Aansluitingen van de DS1803
- Stap 2: Opdrachtbyte
- Stap 3: Bediening van de DS1803
- Stap 4: Instellen
- Stap 5: Het programma
Video: DS1803 dubbele digitale potentiometer met Arduino - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:18
Ik deel graag het gebruik van een DS1803 digitale potmeter met een Arduino. Dit IC bevat twee digitale potmeters die via een tweedraads interface kunnen worden aangestuurd, hiervoor gebruik ik de wire.h bibliotheek.
Dit IC kan een normale analoge potmeter vervangen. Zo ben je in staat om bijvoorbeeld een versterker of voeding aan te sturen.
In deze instructable regel ik de helderheid van twee LED's om de werking te laten zien.
De arduino telt de pulsen van een roterende encoder en plaatst de waarde in variabele pot[0] en pot[1]. Als je de schakelaar op de encoder indrukt, kun je schakelen tussen pot[0] en pot[1].
De werkelijke waarde van de potten wordt uit de DS1803 afgelezen en in variabele potValue[0] en potValue[1] geplaatst en op een LCD weergegeven.
Stap 1: Aansluitingen van de DS1803
Hier zie je de aansluitingen van de DS1803. H is de hoge kant van de potentiometer, L de lage kant en W de wisser. SCL en SDA zijn de busverbindingen.
Met aansluiting A0, A1 en A2 kunt u de DS1803 een eigen adres geven, op deze manier kunt u meerdere apparaten via één bus aansturen. In mijn voorbeeld heb ik de DS1803 adres 0 gegeven door alle pinnen met de grond te verbinden.
Stap 2: Opdrachtbyte
De manier waarop de DS1803 werkt, kan worden gebruikt in de opdrachtbyte. Wanneer u "write potentiometer-0" selecteert, zijn beide potentiometers geselecteerd, wanneer u alleen potentiometer-0 wilt instellen, hoeft u alleen de eerste databyte te verzenden. "Schrijf potmeter-1" pas potmeter-1 aan. "Schrijf naar beide potentiometers" geeft beide potentiometers dezelfde waarde.
Stap 3: Bediening van de DS1803
De stuurbyte (figuur 3) heeft een device identifier, deze blijft altijd hetzelfde. In mijn voorbeeld zijn A0, A1 en A2 0 omdat we het adres selecteren door alle A-pinnen op massa te zetten. Het laatste bit R/W wordt op 0 of 1 gezet door het commando "Wire.beginTransmission" en "Wire.requestFrom" in de Arduino. In figuur 5 zie je het hele telegram. Het gelezen telegram is weergegeven in figuur 4.
Stap 4: Instellen
Deze schakeling laat zien hoe je alles aansluit. Het Nokia LCD-scherm is verkrijgbaar met verschillende aansluitingen, zorg ervoor dat u de uwe goed aansluit. Ook de roterende encoder zijn verschillende versies, sommige hebben de gemeenschappelijke op de middelste pin, andere niet. Ik heb een klein filternetwerk geplaatst (470 Ohm weerstand met 100nF dop) om de A en B uitgangssignalen van de encoder te filteren. Ik heb dit filter nodig omdat de uitgang veel ruis had. Ik heb ook een debounce timer in mijn programma gezet om wat ruis te onderdrukken. Voor de rest denk ik dat het circuit duidelijk is. De LCD is te bestellen via Adafruit
Stap 5: Het programma
Voor het gebruik van de 2-draads bus neem ik de Wire.h bibliotheek mee. Om het LCD-scherm te gebruiken, voeg ik de Adafruit-bibliotheek toe die u kunt downloaden van https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library. Ook de Adafruit_GFX.h-bibliotheek is hier beschikbaar https://github. com/adafruit/Adafruit-GFX-bibliotheek.
#erbij betrekken
#erbij betrekken
#erbij betrekken
Adafruit_PCD8544-display = Adafruit_PCD8544 (7, 6, 5, 4, 3);
Hier zie je alle variabelen. Besturingsbyte en opdrachtbyte zoals eerder beschreven. De deBounceTime kan worden aangepast afhankelijk van de ruis op je encoder.
byte pot [2] = {1, 1};byte controlByte = B0101000; // 7 bits, bytecommandoByte = B10101001; // laatste 2 bits is potmeter selectie. byte potWaarde [2]; int ik = 0; int deBounceTime = 10; // Pas deze waarde aan afhankelijk van de ruisconst int encoder_A = 8; const int encoder_B = 9; const int knopPin = 2; unsigned long newDebounceTime = 0; ongetekende lange oldTime; boolean ingedrukt = 0; booleaanse telling = 1;
In de setup definieer ik de juiste pinnen en zet ik de statische tekst op het LCD
void setup() { Wire.begin(); Serieel.begin(9600); pinMode (encoder_A, INPUT); pinMode (encoder_B, INPUT); pinMode (knopPin, INPUT); newDebounceTime = millis();
weergave.begin();
display.setContrast(50); display.clearDisplay(); display.setTextSize(1); display.setTextColor(ZWART); display.setCursor(0, 10); display.println("POT 1="); display.setCursor(0, 22); display.println("POT 2="); weergave.weergave();
}
In de lus controleer ik eerst of het interval meer dan 500ms is, zo ja, dan wordt het LCD-scherm bijgewerkt. Zo niet, dan is de knop op de encoder aangevinkt. Indien ingedrukt, wordt de toggleBuffer gebeld. Hierna wordt de encoder gecontroleerd. Als ingang 0 laag is (rotatie gedetecteerd) controleer ik ingang B, als ingang B 0 is, verhoog ik pot , andere verlaag ik. Hierna wordt de waarde via wire.write naar de DS1803 gestuurd.
lege lus() {
interval();
if(digitalRead(buttonPin)== 1 && (ingedrukt == 0)){toggleBuffer();} if(digitalRead(buttonPin)== 0){ingedrukt = 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;} } telling = 1; newDebounceTime = millis();
Wire.beginTransmission (controlByte); // begin met zenden
Wire.write (commandByte); // selectie van potmeters Wire.write(pot[0] * 10); // stuur 1e byte van potmetergegevens Wire.write (pot [1] * 10); // stuur 2e byte van potmetergegevens Wire.endTransmission (); // stop met verzenden }else if (digitalRead(encoder_A) == 1 && digitalRead(encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)){ count = 0; newDebounceTime = millis(); } }
void toggleBuffer(){ ingedrukt = 1; als (i == 0){i = 1;}anders{i = 0;} }
Eerst wis ik het gebied waar ik de variabelen moet schrijven. Ik doe dit om een rechthoek in dit gebied te tekenen. Daarna schrijf ik de variabelen naar het scherm.
void writeToLCD(){ Wire.requestFrom(controlByte, 2); potValue[0] = Wire.read(); // lees eerste potmeterbyte potValue [1] = Wire.read (); // lees tweede potmeterbyte display.fillRect (40, 0, 40, 45, WIT); // wis variabel scherm op LCD-display.setCursor (40, 10); display.print(potValue[0]); // schrijf de 1e potmeterwaarde naar het LCD-scherm.setCursor (40, 22); display.print(potValue[1]); // schrijf de 2e potmeterwaarde naar het LCD-scherm.setCursor (60, (10 + i * 12)); display.print("<"); weergave.weergave(); }
void interval () { // intervaltimer om gegevens naar het LCD-scherm te schrijven als ((millis () - oldTime)> 500) {writeToLCD(); oldTime = millis(); } }
Aanbevolen:
Dubbele luidsprekers op hout: 3 stappen
Dubbele luidsprekers op hout: deze Instructable laat je zien wat er gebeurt als je een paar luidsprekers op een stuk hout plaatst. Je kunt het zelf proberen en de veranderingen in de geluidsuitvoer zien. De video laat zien dat de verandering in geluid niet merkbaar is. Echter, speakers op hout zetten
Laserbeveiligingsalarmsysteem (DUBBELE MODUS): 5 stappen
Laserbeveiligingsalarmsysteem (DUAL MODE): als er iets met beveiliging aan de hand is, hebben we absoluut een goed idee nodig en in dit geval is een laserbeveiligingsalarm de beste optie om thuis op een zeer eenvoudige manier te creëren. Dus in deze tutorial gaan we leren hoe om dit project op een zeer gemakkelijke manier te maken
Digitale klok met netwerktijd met behulp van de ESP8266: 4 stappen (met afbeeldingen)
Digitale netwerkklok met de ESP8266: we leren hoe we een schattige kleine digitale klok kunnen bouwen die communiceert met NTP-servers en de netwerk- of internettijd weergeeft. We gebruiken de WeMos D1 mini om verbinding te maken met een wifi-netwerk, de NTP-tijd te verkrijgen en deze weer te geven op een OLED-module. De video hierboven
Een digitale schuifmaat afbreken en hoe werkt een digitale schuifmaat: 4 stappen
Een digitale schuifmaat afbreken en hoe werkt een digitale schuifmaat: Veel mensen weten hoe ze een schuifmaat moeten gebruiken om te meten. Deze tutorial leert je hoe je een digitale schuifmaat afbreekt en een uitleg over hoe de digitale schuifmaat werkt
Hoe dubbele monitors in te stellen met Microsoft Vista: 6 stappen
Hoe twee monitoren in te stellen met Microsoft Vista: In deze instructable laat ik je zien hoe je twee (of meer) monitoren instelt met Microsoft Windows Vista. Dit is een handige truc om te weten of u meer ruimte nodig heeft om mee te werken en kan uw productieve gebruik van uw computer echt vergroten. Wat we