Table des matières:

DS1803 Double potentiomètre numérique avec Arduino : 5 étapes
DS1803 Double potentiomètre numérique avec Arduino : 5 étapes

Vidéo: DS1803 Double potentiomètre numérique avec Arduino : 5 étapes

Vidéo: DS1803 Double potentiomètre numérique avec Arduino : 5 étapes
Vidéo: DFT_#A92 DOUBLE POTENTIOMETRE NUMERIQUE - I2C - DS1803 - ATTINY85 2024, Novembre
Anonim
DS1803 double potentiomètre numérique avec Arduino
DS1803 double potentiomètre numérique avec Arduino

J'aime partager l'utilisation d'un potmètre numérique DS1803 avec un Arduino. Ce circuit intégré contient deux potmètres numériques qui peuvent être contrôlés via une interface à deux fils, pour cela j'utilise la bibliothèque wire.h.

Ce circuit intégré peut remplacer un potmètre analogique normal. De cette façon, vous pouvez contrôler par exemple un amplificateur ou une alimentation.

Dans ce instructable, je contrôle la luminosité de deux LED pour montrer le fonctionnement.

L'arduino compte les impulsions d'un encodeur rotatif et place la valeur dans les variables pot[0] et pot[1]. Lorsque vous appuyez sur le commutateur de l'encodeur, vous pouvez basculer entre pot[0] et pot[1].

La valeur réelle des pots est lue depuis le DS1803 et placée dans les variables potValue[0] et potValue[1] et affichées sur un écran LCD.

Étape 1: Connexions du DS1803

Connexions du DS1803
Connexions du DS1803

Ici vous pouvez voir les connexions du DS1803. H est le côté haut du potentiomètre, L le côté bas et W l'essuie-glace. SCL et SDA sont les connexions de bus.

Avec la connexion A0, A1 et A2, vous pouvez donner au DS1803 sa propre adresse, de cette façon vous pouvez contrôler plus d'appareils via un seul bus. Dans mon exemple, j'ai donné au DS1803 une adresse 0 en connectant toutes les broches à la terre.

Étape 2: Octet de commande

Octet de commande
Octet de commande

Le mode de fonctionnement du DS1803 peut être utilisé dans l'octet de commande. Lorsque vous sélectionnez "écrire le potentiomètre-0", les deux potentiomètres sont sélectionnés, lorsque vous souhaitez uniquement régler le potentiomètre-0, vous n'avez qu'à envoyer le premier octet de données. "Ecrire potentiomètre-1" ajuste uniquement potmètre-1. "Ecrire sur les deux potentiomètres" donne aux deux potentiomètres la même valeur.

Étape 3: Contrôle du DS1803

Contrôle du DS1803
Contrôle du DS1803

L'octet de contrôle (figure 3) a un identifiant de périphérique, celui-ci reste toujours le même. Dans mon exemple, A0, A1 et A2 sont à 0 car nous sélectionnons les adresses en mettant toutes les broches A à la terre. Le dernier bit R/W sera mis à 0 ou 1 par la commande "Wire.beginTransmission" et "Wire.requestFrom" dans l'Arduino. Dans la figure 5, vous pouvez voir l'ensemble du télégramme. Le télégramme lu est représenté sur la figure 4.

Étape 4: configuration

D'installation
D'installation

Ce circuit montre comment tout connecter. L'écran LCD Nokia est disponible avec différentes connexions, assurez-vous de bien connecter la vôtre. Aussi l'encodeur rotatif ses différentes versions, certaines ont le point commun sur la broche du milieu d'autres pas. J'ai mis un petit filtre réseau (résistance de 470 Ohm avec cap de 100nF) pour filtrer les signaux de sortie A et B de l'encodeur. J'ai besoin de ce filtre car la sortie avait beaucoup de bruit. J'ai également mis une minuterie anti-rebond dans mon programme pour annuler certains bruits. Pour le reste je pense que le circuit est clair. L'écran LCD peut être commandé via Adafruit

Étape 5: Le programme

Pour l'utilisation du bus 2 fils, j'inclus la bibliothèque Wire.h. Pour utiliser l'écran LCD, j'inclus la bibliothèque Adafruit que vous pouvez télécharger à partir de https://github.com/adafruit/Adafruit-PCD8544-Nokia-5110-LCD-library. La bibliothèque Adafruit_GFX.h est également disponible ici https://github. com/adafruit/Adafruit-GFX-Library.

#comprendre

#comprendre

#comprendre

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

Ici vous pouvez voir toutes les variables. Octet de contrôle et octet de commande comme décrit précédemment. Le deBounceTime peut être ajusté en fonction du bruit sur votre encodeur.

octet pot[2] = {1, 1};octet controlByte = B0101000; // 7 bits, octet commandByte = B10101001; // les 2 derniers bits correspondent à la sélection du potentiomètre. octet potValue[2]; entier je = 0; int deBounceTime = 10; // Ajuster cette valeur en fonction du bruit const int encoder_A = 8; const int encoder_B = 9; const int buttonPin = 2; non signé long newDebounceTime = 0; oldTime long non signé; booléen enfoncé = 0; nombre booléen = 1;

Dans la configuration, je définis les bonnes broches et mets le texte statique sur l'écran LCD

void setup() { Wire.begin(); Serial.begin(9600); pinMode(encodeur_A, INPUT); pinMode(encodeur_B, INPUT); pinMode(boutonPin, 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();

}

Dans la boucle, je vérifie d'abord si l'intervalle est supérieur à 500 ms, si oui, l'écran LCD est mis à jour. Sinon, le bouton de l'encodeur est coché. Si vous appuyez dessus, le toggleBuffer est appelé. Après cela, l'encodeur est vérifié. Si l'entrée 0 est basse (rotation détectée) je vérifie l'entrée B, si l'entrée B est à 0 j'incrémente pot, les autres je décrémente. Après cela, la valeur sera envoyée au DS1803 via wire.write.

boucle vide() {

intervalle();

if(digitalRead(buttonPin)== 1 && (appuyé == 0)){toggleBuffer();} if(digitalRead(buttonPin)== 0){pressed = 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;} } compte = 1; newDebounceTime = millis();

Wire.beginTransmission(controlByte); // commencer à transmettre

Wire.write(commandByte); // sélection des potmètres Wire.write(pot[0] * 10); // envoie le 1er octet des données du potentiomètre Wire.write(pot[1] * 10); // envoie le 2ème octet des données du potentiomètre Wire.endTransmission(); // arrête de transmettre } else if (digitalRead(encoder_A) == 1 && digitalRead(encoder_B) == 1 && count == 1 && (millis() - newDebounceTime > deBounceTime)){ count = 0; newDebounceTime = millis(); } }

void toggleBuffer(){ pressé = 1; si (i == 0){i = 1;}else{i = 0;} }

J'efface d'abord la zone où je dois écrire les variables. Je fais cela pour dessiner un rectangle dans cette zone. Après cela, j'écris les variables à l'écran.

void writeToLCD(){ Wire.requestFrom(controlByte, 2); potValue[0] = Wire.read(); // lit le premier octet du potentiomètre potValue[1] = Wire.read(); // lit le deuxième octet du potentiomètre display.fillRect (40, 0, 40, 45, WHITE); // efface l'écran des variables sur l'affichage LCD.setCursor (40, 10); display.print(potValue[0]); // écrit la 1ère valeur du potentiomètre sur l'affichage LCD.setCursor (40, 22); display.print(potValue[1]); // écrit la 2ème valeur du potentiomètre sur l'affichage LCD.setCursor(60, (10 + i * 12)); display.print("<"); display.display(); }

void interval(){ // intervalle de temps pour écrire les données sur l'écran LCD if ((millis() - oldTime) > 500) { writeToLCD(); oldTime = millis(); } }

Conseillé: