Schieberegister mit Poti

Servus Leute,

bin neu hier in der Microkontrollerwelt und bräuchte nun etwas Hilfe.

Ich soll ein Schieberegisterprogramm schreiben, das sich über ein Potentiometer steuern lässt. Sprich Poti auf LOW = 0V=keine Led also 0 bit Poti auf HIGH= 5V = 8Led´s also 255 bit.

Das Programm für ein Schieberegister habe ich bereits geschrieben, aber ich komme nun nicht weiter.

TIPPS

Der Analogeingang liest einen Wert zwischen 0 und 1023. wenn Du diese Zahl durch 128 teilst bekommst Du einen Wert zwischen 0 und 7. Dann setzt Du das Bit im Wert für das Schieberegister mit bitWrite() https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitwrite/

Grüße Uwe

Uwe, warum nicht anders herum ?

äh, Das war der erste Post

uwefed: äh, Das war der erste Post

Na dann...OK

Wenn ich mir die Aufgabenstellung durch den Kopf gehen lasse ( 1 Poti, Schieberegister, 8 LED ) ...

... würde ich den Poti-Wert auf 9 Bereiche teilen und 0, 1, 2, ... , 8 Led ansteuern.

// Schieberegister - Anschlusspins am Arduino
const byte DATA   = ?;
const byte CLOCK = ?;
const byte LATCH = ?;

const byte leds[9] = { 0, B1, B11, B111, B1111, B11111, B111111, B1111111, B11111111 } ; 
// Arduino Spezialschreibweise für Bitmuster 


void (loop() {
  byte value = analogRead(A0) * 9 / 1024; // liefert 0 .. 8, gleichmässig verteilt

  digitalWrite(LATCH, LOW);
  shiftOut (DATA,CLOCK, MSBFIRST, leds[value]); 
  digitalWrite(LATCH, HIGH);
}

servus,

@michael_x wieso nur 9 Bereiche? Müssten es nicht 256 Bereiche sein? Das Schieberegister soll ja nicht nur bis 8 zählen sondern bis 256:)

Ich dachte bei den 8 LED eher an so etwas als an etwas, mit dem du Binäre Bitmuster darstellst.

Aber das geht natürlich noch einfacher: byte value = analogRead( A0 ) / 4; // 0 .. 255

Das kommt nun darauf an, was die Leds anzeigen sollen. Binärwert, Pegel, VU-Meter, ...

Die sollen eine Binärwert anzeigen. Also der Poti soll wie ein Taster verwendet werden. Drehe ich, zählt das 8 Bit Schieberegister hoch.

Na denn, die Lösung hast du ja schon gekriegt.

Und viel Spass beim Anzeige Decodieren üben ;)

Also irgenwie funktioniert das nicht :/

Ich lade einfach mal meinen Sketch hoch, wenn Fehler vorhanden (was sicher welche sind sonst würde es ja funzen) bitte drauf aufmerksam machen :) und nicht lachen :D

int SHCPPin = 2;
int STCPPin = 3;
int DSPin = 4;
int counter = 0; 
int pot = A0; 

void setup() {

pinMode(STCPPin, OUTPUT);
pinMode(SHCPPin, OUTPUT);
pinMode(DSPin, OUTPUT);
pinMode(pot, INPUT);

} 

void loop () {
 byte value = analogRead( A0 ) / 4; // 0 .. 255

 digitalWrite(STCPPin, LOW);
 shiftOut(DSPin, SHCPPin, MSBFIRST, counter);  
 digitalWrite(STCPPin, HIGH);
 delay(500);
 
   }
int counter = 0;
...
  shiftOut(DSPin, SHCPPin, MSBFIRST, counter);

Du schiebst immer eine Null raus, nie einen anderen Wert. Nur wenn Du den Wert änderst, siehst Du einen Unterschied bei den LEDs.

davor hatte ich es so aber dann ist es nicht über den Potentiometer bestimmbar sondern zählt von alleine hoch .

int SHCPPin = 2;
int STCPPin = 3;
int DSPin = 4;
int counter = 0; 
int pot = A0; 

void setup() {

pinMode(STCPPin, OUTPUT);
pinMode(SHCPPin, OUTPUT);
pinMode(DSPin, OUTPUT);
pinMode(pot, INPUT);

} 

void loop () {
 byte value = analogRead( A0 ) / 4; // 0 .. 255

 digitalWrite(STCPPin, LOW);
 shiftOut(DSPin, SHCPPin, MSBFIRST, counter);  
 digitalWrite(STCPPin, HIGH);
 delay(500);
 
 counter ++;
 if(counter > 255){
   counter = 0;
   }
 
}

Setz das ganze in code tags

Foto vom Aufbau mit deutlich sichtbaren Kabeln

Ich dachte, du willst

  shiftOut(DSPin, SHCPPin, MSBFIRST, value);

machen und den Poti Wert auf das Schieberegister geben ?

Jetzt versteh ich grad nur Bahnhof :D also ich beschäftige mich jetzt seit net guten Woche mit dem Thema arduino und programmieren und bin noch nicht so tief in der Materie :D.

Ich Stelle mir das so vor, das wenn ich an dem Poti drehe, und über einen bestimmten Ohm bereich komme die erste Led an geht. Also eine 1. Dann drehe ich weiter dann nach einem bestimmten Ohm bereich geht die zweite Led an und die erste wieder aus, also eine zwei und immer so weiter .

|500x375

Du willst doch nicht einen konstanten Wert counter rausschieben, sondern den Inhalt von value, wo der Potiwert drinsteht.

Probiere mal dies:

shiftOut(DSPin, SHCPPin, MSBFIRST, value);

Irgendwie steh ich grade echt aufm Schlauch xD welchen wert gib ich denn jetzt dem value