Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
talit:electronics:arduno [2023-03-03 08:46] – [2.2 Blinkende LED mit stufenlos verstellbarer Frequenz] gratalit:electronics:arduno [2025-02-19 12:41] (aktuell) – [3.3 Chronometer 3] gra
Zeile 8: Zeile 8:
   * Halterung für Arduino   * Halterung für Arduino
   * Breadboard   * Breadboard
-  * Display- und Batteriehlaterung +  * Display- und Batteriehlaterung (Batterie mit Kabel optional)
-  * 9-V-Batterie und Batteriekabel+
   * LCD (Display) und Display-Kabel   * LCD (Display) und Display-Kabel
   * USB-A-Kabel für die Verbindung zwischen Arduino und PC   * USB-A-Kabel für die Verbindung zwischen Arduino und PC
  
 Die Idee der Box: Du kannst auf dem Breadboard elektronische Bauteile aufbringen und mit dem Arduino verbinden. Diesen Aufbau kannst du jederzeit mitnehmen: USB-Kabel rein, Box verschliessen und in den Rucksack! Die Idee der Box: Du kannst auf dem Breadboard elektronische Bauteile aufbringen und mit dem Arduino verbinden. Diesen Aufbau kannst du jederzeit mitnehmen: USB-Kabel rein, Box verschliessen und in den Rucksack!
-  - Baue die Box zusammen. **Überlege zuerst gut**, wie du Breadboard, Arduino- und Display-Halterung auf dem Deckel der Plastick-Box platzierst, sodass es praktisch zum Arbeiten ist (Verbindung zum Laptop, Batterie-Anschluss, Display-Verbindung etc.). Klebe dann die drei Komponenten mit doppelseitigem Klebenband fest.+  - Baue die Box zusammen. **Überlege zuerst gut**, wie du die Teile auf dem Deckel der Box platzierst, sodass es praktisch zum Arbeiten ist (Verbindung zum Laptop, Display-Verbindung etc.). Klebe dann die Teile mit doppelseitigem Klebenband oder Heissleim fest.
   - Informiere dich über die Arduino-Programmierung in der Programmiersprache C\+\+ hier: [[informatik:arduino_programmieren|Arduino programmieren]]   - Informiere dich über die Arduino-Programmierung in der Programmiersprache C\+\+ hier: [[informatik:arduino_programmieren|Arduino programmieren]]
   - Verbinde das Display und teste es: Dein Display soll "Hello World" zeigen.    - Verbinde das Display und teste es: Dein Display soll "Hello World" zeigen. 
Zeile 27: Zeile 26:
 //Tipp:// Du benötigst die Funktionen ''pinMode()'', ''digitalWrite()'' und ''delay()''. //Tipp:// Du benötigst die Funktionen ''pinMode()'', ''digitalWrite()'' und ''delay()''.
  
-<nodisp 1>+<nodisp 2>
 ++++Lösung mit delay()| ++++Lösung mit delay()|
 <code c++ Blink.ino> <code c++ Blink.ino>
Zeile 46: Zeile 45:
 </nodisp> </nodisp>
  
-<nodisp 1>+<nodisp 2>
 ++++Lösung mit millis()| ++++Lösung mit millis()|
 <code c++ BlinkMillis.ino> <code c++ BlinkMillis.ino>
Zeile 81: Zeile 80:
 //Tipp:// Du benötigst u. a. die Funktion ''analogRead()''. Informiere dich erst über diese Funktion: [[https://reference.arduino.cc/reference/en/|Arduino-Referenz]]  //Tipp:// Du benötigst u. a. die Funktion ''analogRead()''. Informiere dich erst über diese Funktion: [[https://reference.arduino.cc/reference/en/|Arduino-Referenz]] 
  
-<nodisp 1>+<nodisp 2>
 ++++Lösung| ++++Lösung|
 <code c++ BlinkTune.ino> <code c++ BlinkTune.ino>
Zeile 114: Zeile 113:
   * Verwende für die Tasten den pinMode INPUT_PULLUP. Wenn dir nichg ganz klar ist, weshalb das nötig ist: Lehrperson fragen.   * Verwende für die Tasten den pinMode INPUT_PULLUP. Wenn dir nichg ganz klar ist, weshalb das nötig ist: Lehrperson fragen.
   * Ob eine Taste gedrückt ist oder nicht, fragst du innerhalb der loop()-Schleife mit If-Verzweigungen ab (z.B.: if (digitalRead(freqUpPin) == LOW){...}). Da die loop-Schleife mehrere zehntausend Male pro Sekunde durchlaufen wird, ist es gut möglich, dass auch eine sehr kurze Betätigung der Taste mehrmals erkannt wird und damit wie mehrere Betägtigungen wirkt. Das kannst du verhindern, indem du kurz nach Eintritt in die Verzweigung einige Millisekunden wartest (''delay()''). Alles klar? Falls nicht ganz: Lehrperson fragen!   * Ob eine Taste gedrückt ist oder nicht, fragst du innerhalb der loop()-Schleife mit If-Verzweigungen ab (z.B.: if (digitalRead(freqUpPin) == LOW){...}). Da die loop-Schleife mehrere zehntausend Male pro Sekunde durchlaufen wird, ist es gut möglich, dass auch eine sehr kurze Betätigung der Taste mehrmals erkannt wird und damit wie mehrere Betägtigungen wirkt. Das kannst du verhindern, indem du kurz nach Eintritt in die Verzweigung einige Millisekunden wartest (''delay()''). Alles klar? Falls nicht ganz: Lehrperson fragen!
 +
 +<nodisp 2>
 +++++Lösung|
 +<code c++ BlinkSteps.ino>
 +#define ledPin 2   // LED+ über Widerstand auf an Pin 13, LED- auf GND
 +#define downPin 4  // Taste "down" verbindet Pin 4 mit GND
 +#define upPin 5  // Taste "up" verbindet Pin 4 mit GND
 +#define debounce 200 // Wartezeit (in ms) zur "Entprellung" der Tasten
 +
 +bool ledOn = false;     // Umschalt-Flag: schalte ein, wenn false – schalte aus, wenn true
 +int waitTime = 1020;    // setze Wartezeit auf Initialwert
 +int waitTime_max = 2020;
 +int waitTime_min = 20;
 +int waitTime_step = 200;
 +long time1;
 +
 +void setup() {
 +    Serial.begin(9600);  
 +    pinMode(ledPin, OUTPUT);
 +    pinMode(downPin, INPUT_PULLUP);
 +    pinMode(upPin, INPUT_PULLUP);
 +    time1 = millis();
 +}
 +
 +void loop() {
 +  if (!digitalRead(downPin)){
 +    delay(debounce);
 +    if(waitTime > waitTime_min){
 +      waitTime -= waitTime_step;
 +    }
 +    Serial.println(waitTime);
 +  }
 +  if (!digitalRead(upPin)){
 +    delay(debounce);
 +    if(waitTime < waitTime_max){
 +      waitTime += waitTime_step;
 +    }
 +    Serial.println(waitTime);
 +  }
 +  if(millis()-time1 >= waitTime){
 +    if(ledOn){
 +      digitalWrite(ledPin, LOW);
 +      ledOn = false;
 +    }
 +    else{
 +      digitalWrite(ledPin, HIGH);
 +      ledOn = true;
 +    }
 +    time1 = millis();
 +  }
 +}
 +</code>
 +++++
 +</nodisp>
 +
 ==== - RGB-LED ==== ==== - RGB-LED ====
   * Verbinde folgende Bauteile mit dem Arduino:   * Verbinde folgende Bauteile mit dem Arduino:
-    * [[https://www.adafruit.com/product/848|RGB-LED]]+    * [[https://www.adafruit.com/product/848|RGB-LED 10mm]] oder [[https://www.mouser.ch/datasheet/2/180/HV_5RGBXX_5mm_Full_Color_Series-1489147.pdf|RGB-LED 5mm]]
     * Potentiometer     * Potentiometer
     * drei Tasten     * drei Tasten
Zeile 127: Zeile 181:
   * Welche Pins geeignet sind, siehst du in der [[informatik:arduino_programmieren#einfuehrung|Überischt hier]].   * Welche Pins geeignet sind, siehst du in der [[informatik:arduino_programmieren#einfuehrung|Überischt hier]].
   * Du sollst wissen, was PWM ist und wie es funktioniert: Lese [[https://docs.arduino.cc/learn/microcontrollers/analog-output|diese Beschreibung]] und frage nach, wenn etwas nicht ganz klar ist.   * Du sollst wissen, was PWM ist und wie es funktioniert: Lese [[https://docs.arduino.cc/learn/microcontrollers/analog-output|diese Beschreibung]] und frage nach, wenn etwas nicht ganz klar ist.
 +
 +<nodisp 2>
 +++++Lösung|
 +<code c++ RGB-LED.ino>
 +/* RGB-LED mit gemeinsamer Annode --> Anode auf +5V.
 +Kathoden für red, green, blue über Widerstand auf 
 +folgende PWM-Pins (für green ginge auch anderer Pin,
 +da grün bloss ein/ausgeschaltet wird): */
 +#define ledRedPin 9
 +#define ledGreenPin 10
 +#define ledBluePin 11
 +
 +#define potiPin A0  // Abriff des Potentiometers --> 0...5 V, auf Pin A0.
 +#define downPin 4  // Taste "down" verbindet Pin 4 mit GND
 +#define upPin 5  // Taste "up" verbindet Pin 5 mit GND
 +#define onOffPin 6  // Taste "onOff" verbindet Pin 6 mit GND
 +
 +#define debounce 200 // Wartezeit (in ms) zur "Entprellung" der Tasten
 +
 +uint8_t red = 255;  // Werte auf HIGH, sodass LED dunkel
 +bool green = 1;
 +uint8_t blue = 255;
 +uint8_t blueStep = 5;
 +
 +void setup() {
 +  pinMode(ledRedPin, OUTPUT);
 +  pinMode(ledGreenPin, OUTPUT);
 +  pinMode(ledBluePin, OUTPUT);
 +  pinMode(potiPin, INPUT);
 +  pinMode(downPin, INPUT_PULLUP);
 +  pinMode(upPin, INPUT_PULLUP);
 +  pinMode(onOffPin, INPUT_PULLUP);
 +}
 +
 +void loop() {
 +  red = analogRead(potiPin);
 +  if(!digitalRead(onOffPin)){
 +    delay(debounce);
 +    green = !green;
 +  }
 +  if(!digitalRead(downPin)){
 +    delay(debounce);
 +    if(blue > 0){
 +      blue -= blueStep;
 +    }
 +  }
 +  if(!digitalRead(upPin)){
 +    delay(debounce);
 +    if(blue < 255){
 +      blue += blueStep;
 +    }
 +  }
 +  analogWrite(ledRedPin, red);
 +  digitalWrite(ledGreenPin, green);
 +  analogWrite(ledBluePin, blue);
 +}
 +</code>
 +++++
 +</nodisp>
 +
 === Zusatzaufgaben === === Zusatzaufgaben ===
   - Zeige auf dem Display die aktuellen Farbwerte an.   - Zeige auf dem Display die aktuellen Farbwerte an.
Zeile 133: Zeile 247:
  
 ===== - Chronometer ===== ===== - Chronometer =====
-<color #7092be>**Lernziele:** Zeitmessung mit millis(), Strings und Formatierungen verwenden, Arrays verwenden, EEPROM beschreiben und auslesen. </color>+<color #7092be>**Lernziele:** Zeitmessung mit millis(), Strings und Formatierungen verwenden, Arrays verwenden, EEPROM beschreiben und auslesen, Bit-Operatoren verwenden.</color>
 ==== - Chronometer 1 ==== ==== - Chronometer 1 ====
 Programmiere den Arduino so, dass du die Zeit stoppen kannst: Programmiere den Arduino so, dass du die Zeit stoppen kannst:
   * Bestimmme zwei Eingänge //Start// und //Stop// an die du Tasten zum Starten und Stoppen anschliesst. Verwende die internen Pull-up-Widerstände.   * Bestimmme zwei Eingänge //Start// und //Stop// an die du Tasten zum Starten und Stoppen anschliesst. Verwende die internen Pull-up-Widerstände.
   * Wenn der Eingang //Start// LOW wird, beginnt die Zeitmessung, wenn //Stop// LOW wird, stoppt sie.   * Wenn der Eingang //Start// LOW wird, beginnt die Zeitmessung, wenn //Stop// LOW wird, stoppt sie.
-  * Das LCD zeigt die aktuelle laufende/gestoppte Zeit im Format MM:SS:HH (M=Minuten, S=Sekunden, H=Hundertstelsekunden). //Tipp:// Erstelle hierfür eine Funktion z. B. //showTime//, der du eine Zeit in Millisekunden übergeben kannst und die diese Zeit im geünschten Format aufs Display schreibt.+  * Die Zeit misst du mit der Funktion [[https://www.arduino.cc/reference/de/language/functions/time/millis/|millis()]]. 
 +  * Das LCD zeigt die aktuelle laufende/gestoppte Zeit im Format MM:SS:HH (M=Minuten, S=Sekunden, H=Hundertstelsekunden). 
 +    * Erstelle hierfür eine Funktion z. B. //showTime//, der du eine Zeit in Millisekunden übergeben kannst und die diese Zeit im gewünschten Format aufs Display schreibt. Nutze die Funktion ''sprintf'' für Formatierungen, siehe Beispiele [[https://gist.github.com/ArduinoBasics/6517378fc2ef9e851773837f301b1d55|hier]] und [[https://forum.arduino.cc/t/convert-int-to-sring-with-leading-zero/629313|hier]].
  
 <nodisp 2> <nodisp 2>
-++++Musterlösung|+++++Lösung|
 <code c++ CrhonoMeter01.cpp>  <code c++ CrhonoMeter01.cpp> 
 /* Chronometer gemäss Aufgabe 1: /* Chronometer gemäss Aufgabe 1:
Zeile 235: Zeile 351:
  
 <nodisp 2> <nodisp 2>
-++++Musterlösung|+++++Lösung|
 <code c++ ChronoMeter02.cpp> <code c++ ChronoMeter02.cpp>
 /* Chronometer gemäss Aufgabe 2: /* Chronometer gemäss Aufgabe 2:
Zeile 364: Zeile 480:
   * Erstelle folgende Funktionen:   * Erstelle folgende Funktionen:
     * Eine Funktion //sortTimes//, die die Zeiten sortiert, sodass die kürzeste jeweils an erster Stelle im Array steht.     * Eine Funktion //sortTimes//, die die Zeiten sortiert, sodass die kürzeste jeweils an erster Stelle im Array steht.
-    * Zwei Funktionen //writeTimesEEP// und //readTimesEEP//, die alle fünf Bestzeiten im EEPROM speichern bzw. daraus auslesen. **Challengee:** Verwende nur die EEPROM-Funktionen //EEPROM.write// und //EEPROM.read//, welche jeweils nur ein Byte schreiben/lesen. Nutze [[https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitshiftleft/|Bit-Schiebe-]] und [[https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitwiseand/|Bit-Maskierungs]]-Operatoren, um Variablen von längeren Datentypen in mehrere Bytes aufzuteilen bzw. aus meherern Bytes zusammenzusetzen.+    * Zwei Funktionen //writeTimesEEP// und //readTimesEEP//, die alle fünf Bestzeiten im EEPROM speichern bzw. daraus auslesen. **Challenge:** Verwende nur die EEPROM-Funktionen //EEPROM.write// und //EEPROM.read//, welche jeweils nur ein Byte schreiben/lesen. Nutze [[https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitshiftleft/|Bit-Schiebe-]] und [[https://www.arduino.cc/reference/en/language/structure/bitwise-operators/bitwiseand/|Bit-Maskierungs]]-Operatoren, um Variablen von längeren Datentypen in mehrere Bytes aufzuteilen bzw. aus meherern Bytes zusammenzusetzen.
       * Alternative zu //EEPROM.write// und //EEPROM.read//: Betrachte EEPROM als ein Array, dessen Elemente 1 Byte gross sind: mit EEPROM[2] greifst du auf Adresse 2 zu.       * Alternative zu //EEPROM.write// und //EEPROM.read//: Betrachte EEPROM als ein Array, dessen Elemente 1 Byte gross sind: mit EEPROM[2] greifst du auf Adresse 2 zu.
  
 <nodisp 2> <nodisp 2>
-++++Musterlösung|+++++Lösung|
 <code c++ ChronoMeter03.cpp> <code c++ ChronoMeter03.cpp>
 /* Chronometer gemäss Aufgabe 3: /* Chronometer gemäss Aufgabe 3:
  • talit/electronics/arduno.1677833217.txt.gz
  • Zuletzt geändert: 2023-03-03 08:46
  • von gra