Anfängerfrage: LEDs und Poti

Hallo,

mich hat nach ca. 15 Jahren mal wieder das Bastellfieber gepackt und nun habe ich mir einen Arduino Duemilanove geholt und bringe mir das ganz nach dem Motto "Learning by Doing" bei.

Jetzt hab ich schon 2 kleine projekte gemacht siehe (video) zieseniss.eu die Programmcodes sind teilweise veränderte beispielcodes.

Jetzt würde ich es gerne bei dem aufbau mit den Blauen LEDs so machen das wenn ich das Poti drehe, das immer nur eine LED leuchtet.

Hier mal der Code:

int led1 = 0; 
int led2 = 2; 
int led3 = 4; 
int led4 = 6; 
int led5 = 8; 
int led6 = 10; 
int apin = 1;
int value = 0;

 
void setup() 
{
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);

}

 
void loop()                       // Staendige Wiederholung
 {   
  value =  analogRead(apin);  // setzt 'value' gleich mit 'pin' 
  value /= 4;                // wandelt 0-1023 in 0-255 um 
  digitalWrite(led1, value <255);
  digitalWrite(led2, value <200);
  digitalWrite(led3, value <150);
  digitalWrite(led4, value <100);
  digitalWrite(led5, value <60);
  digitalWrite(led6, value <5); 
 }

Kann man diesen Code so umbauen das, das so möglich ist?

Gruß Sven

frei nach "der leasing vertrag" von gerhard polt:

ja, das geht :wink:

if ( (wert > grenze_1) && (wert < grenze_2) ) {
digitalWrite(.........);
....
....
}

Kannst du mir das etwas genauer erklären, ich habe leider von der ganzen Programiererei überhaupt keine ahnung. Aber weiß auch leider nicht genau wie ich das in meinen Schädel bekommen soll. Hab schon zig Tuts durch.

Gruß Sven

#define grenze1 146  // darunter ist alles aus
#define grenze2 292
#define grenze3 438
#define grenze4 584
#define grenze5 730
#define grenze6 777
byte leds[] = {0,2,4,6,8,10}; // array - leds an pins 0,2,4 .... - elemente zaehlen von 0 an !
byte apin = 1;
int value = 0; // byte ist zu klein, analogRead() liefert 0...1023

void setup()
{
  byte zaehler;
  for(zaehler=0; zaehler < 6; zaehler++) { // laeuft von 0 bis 5
    pinMode(leds[zaehler],OUTPUT);
  }
}

void loop()                       // Staendige Wiederholung
{
  value =  analogRead(apin);  // setzt 'value' gleich mit 'pin'
  led_setzen(value);  
}

void led_setzen(int eingabe) {
  if( eingabe < grenze1 ) {
    alle_leds_aus();
  }
  if( (eingabe > grenze1) &&  (eingabe < grenze2) ) {
    alle_leds_aus();
    digitalWrite(leds[0],HIGH); // led 0 an
  }
  if( (eingabe > grenze2) &&  (eingabe < grenze3) ) {
    alle_leds_aus();
    digitalWrite(leds[1],HIGH); // led 1 an
  }
  if( (eingabe > grenze3) &&  (eingabe < grenze4) ) {
    alle_leds_aus();
    digitalWrite(leds[2],HIGH); // led 2 an
  }
  if( (eingabe > grenze4) &&  (eingabe < grenze5) ) {
    alle_leds_aus();
    digitalWrite(leds[3],HIGH); // led 3 an
  }
  if( (eingabe > grenze5) &&  (eingabe < grenze6) ) {
    alle_leds_aus();
    digitalWrite(leds[4],HIGH); // led 4 an
  }
  if( (eingabe > grenze6) ) {
    alle_leds_aus();
    digitalWrite(leds[5],HIGH); // led 5 an
  }

}

void alle_leds_aus(void) {
  byte zaehler;
  for(zaehler=0; zaehler < 6; zaehler++) {
    digitalWrite(leds[zaehler],LOW); // alles aus
  }
}

da hilft es nur ueben, ueben, ueben... die alte leier :wink:

und wie immer: "teile und herrsche", problem so lange in kleinere probleme zerteilen, bis alles trivial wird :wink:

Hallo Nordwork, willkommen im Forum.
Von wo kommst Du?

Zu Deiner Frage: eigentlich hat madworm sie schon ausreichend beantwortet, aber vielleicht ist das hier auch hilfreich:

Anstelle von

digitalWrite(led1, value <255);

kannst Du, um nur eine LED einzuschalten, schreiben:

digitalWrite(led1, (value <=255)&&(value >200) );

Und entprechend führst Du das für alle anderen Werte fort, also z.B. auch

digitalWrite(led2, (value <=200)&&(value >150) );

Ich habe das zwar jetzt nicht getestet, aber von der Idee her sollte es doch klappen. Sicher kennst Du den && Operator, der das logische UND bezeichnet.

Erstmal vielen Dank euch beiden.

Ich komme aus dem schönen kleinen Werne das liegt zwischen Dortmund und Münster.

Leider hat der Code von Madworm nicht so ganz funktioniert, wobei der fehler sicherlich bei mir liegt, aber es hat immer nur die erste LED geblinkt.

Jetzt habe ich meinen Code mit dem Code von bohne umgebaut und es funktioniert so wie ich wollte :smiley:

Naja ich glaube ich werde mir nochmal das Tutorial von (Lady Ada) so 3-7 mal reinhauen.

Wie gesagt das ist für mich der erste Kontakt mit einer Programiersprache (die Basic sachen aus der schule mal weggelassen weil die sowieso alle wieder vergessen sind.)

Ich mach das ganze auch nur weil mir die finger jucken und ich mal wieder etwas "Basteln" muss.

Wenn ihr noch tips habt wie ich den kram in mein kopf bekomme bin ich immer offen, mein system hat nicht so ganz geklappt weil ich das mit dem && Operator nicht wusste und auch so nirgens gefunden habe.

Danke und gn8

Schön, dass es klappt.

Alle Infos findest Du in der Reference. Den && Operator kannst Du beispielsweise hier studieren:

Die Tutorials wurden heute erst komplett überarbeitet, die findest Du hier:

Ansonsten empfehle ich das LadyAda Tutorial, bzw. die deutsche Übersetzung von gatonero aus diesem Forum:
http://www.freeduino.de/de/books/arduino-tutorial-lady-ada

Hallo Nordwind,

eine deutschsprachige Übersetzung des Lady-Ada-Tutorials findest Du unter http://www.freeduino.de/en/books/arduino-tutorial-lady-ada. Dort findest Du auch noch weitere deutschsprachige Tutorials.

Viel Spaß und Erfolg :smiley:

@ gatonero

vielen Dank kenn ich aber schon.

Nur ist es schon wirklich schwierig sich die Sprache in den Kopf zu kloppen ::slight_smile:

Ich werd jetzt auf jeden fall die Tuts mal komplett durcharbeiten bis der Stoff sitzt.

Ein bischen was von meinen ergebnissen gibt es auf: www.zieseniss.eu

Gruß Sven

@nordwork: fehler ist korrigiert. hatte "value" als byte definiert, das ist zu klein. als "int" sollte es gehen.

grinz

und genau mit dem Byte konnte ich mit meinem wissen "noch" gar nichts anfangen.

Danke für den hinweis.

Gruß Sven

offiziell gibt es den daten typ "byte" auch nicht, eigentlich ist das ein "unsigned char" :wink:

bei dem wenigen arbeitsspeicher von der cpu habe ich mir angewoehnt, alle datentype so "klein" wie moeglich zu definieren und da haben mich deine ganzen "ints" dazu verleitet, alles nach byte zu wandeln. das war dann 1x zu viel...

durch das "byte value" hat das analogRead() zwar von 0..1023 ausgelesen, aber es wurden die oberen 8 bits abgesaegt ( ein arduino int ist 2 bytes lang ), so dass nur maximal 255 uebrig bleiben konnte. daher hat die ganze if-logik dann korrekterweise nur hoechstens die erste led angeschaltet.