Zum Inhalt springen
Arduino Programmieren

Arduino programmieren

    Du willst Arduino programmieren? Dann bist du hier beim Arduino Programmierkurs genau richtig. Dieser Grundlagenkurs richtet sich an Anfänger. Für alle Programmbeispiele benötigen wir nur eine Schaltung.

    Gliederung

    Schaltung

    Für die Vorbereitung baue bitte die folgende Schaltung auf:

    Arduino Programmieren Lernen

    Wir haben nun einen Taster am digitalen Pin 8, eine rote LED am digitalen Pin 5 und eine grüne am digitalen Pin 6.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Was ist ein Programm?

    Ein Programm besteht aus aufeinander folgenden Befehlen. Sie werden der Reihe nach von oben nach unten ausgeführt.

    Was sind Befehle?

    Befehle sind Programmanweisungen, die bestimmte Funktionen auslösen. Der Befehl

    pinMode(6, OUTPUT);

    legt den digitalen Pin 6 als Output fest. Mit dem Befehl

    digitalWrite(6, HIGH);

    lassen sich so 5V+ auf den digitalen Pin 6 schalten. Jeder Befehl muss mit einem Semikolon enden!

    Das probieren wir gleich aus. Lade das folgende Programm auf das Arduino:

    void setup() {
      pinMode(6, OUTPUT);
    }
    void loop() {
      digitalWrite(6, HIGH);
    }

    Die grüne LED leuchtet auf.

    Programmiersprache von Arduino

    Arduino programmiert man in der Programmiersprache C/C++. Diese ist in der Hardware-Programmierung weit verbreitet. Wenn man also sehr spezielle Funktionen sucht, kann man in einer C/C++ Referenz nachschlagen.

    Arduino programmieren: die Programmstruktur

    Ein Arduino-Programm hat eine bestimmte Programmstruktur. Im einfachsten Fall handelt es sich um die zwei Hauptmethoden setup() und loop(). Alles, was man in den geschweiften Klammern {} schreibt, gehört zu der jeweiligen Methode.

    void setup() {
    }
    void loop() {
    }

    Während die setup()-Methode nur beim Programmstart ausgeführt wird, wird die loop()-Methode kontinuierlich wiederholt.

    Lade das folgende Programm auf das Arduino:

    void setup() {
      pinMode(6, OUTPUT);
    }
    void loop() {
      digitalWrite(6, HIGH);
      delay(1000);
      digitalWrite(6, LOW);
      delay(1000);
    }

    Der Befehl delay(1000); hält das Programm kurzzeitig an. Die Zahl in den runden Klammern gibt an, wie lange in Millisekunden das Programm angehalten werden soll. Hier sind es 1000 Millisekunden, also eine Sekunde.

    Solche mit Befehlen übertragenen Werte nennt man Argumente. Bei delay(1000); ist das Argument also 1000, bei digitalWrite(6,HIGH); wären die Argumente 6 und HIGH.

    Was sind Variablen?

    Nun haben wir in unserem Programm an drei Stellen eine 6 eingetragen. Wenn wir nun statt der grünen lieber die rote LED leuchten lassen wollten, müssten wir das also an drei Stellen ändern. Das ist nicht sehr komfortabel. Besser ist es, die Information über die Pinnummer in einer Variablen zu speichern.

    Eine Variable ist ein kleiner Speicher, in den eine Information einer bestimmten Form passt. Die Form wird durch den sogenannten Variablentyp bestimmt.

    VariablentypBedeutungBeschreibung
    intganze Zahlen-32.768 bis 32.767
    longganze Zahlen-2.147.483.648 bis 2.147.483.647
    floatFließkommazahlgebrochene Zahlen
    charCharacterAlphanumerische Zeichen (Buchstaben, Zahlen, Sonderzeichen)

    Bei der Pinnummer handelt es sich um eine ganze Zahl. Mit der Anweisung

    int ledPin=6;

    legen wir eine Variable vom Typ int an. Sie heißt ledPin und bekommt einen Wert von 6 zugewiesen. Überall, wo wir nun den Variablennamen angeben, wird er durch den Variablenwert ersetzt.

    int ledPin=6;
    void setup() {
      pinMode(ledPin, OUTPUT);
    }
    void loop() {
      digitalWrite(ledPin, HIGH);
      delay(1000);
      digitalWrite(ledPin, LOW);
      delay(1000);
    }

    Nun lässt sich auch schnell ein Programm schreiben, dass die andere LED blinken lässt.

    int ledPin=5;
    void setup() {
      pinMode(ledPin, OUTPUT);
    }
    void loop() {
      digitalWrite(ledPin, HIGH);
      delay(1000);
      digitalWrite(ledPin, LOW);
      delay(1000);
    }

    if-Abfrage

    Um einen Taster auszulesen, können wir den Befehl digitalRead(); verwenden. Er liefert einen Wert zurück, den man auslesen und vergleichen kann. Zum Vergleichen lässt sich die if-Abfrage nutzen:

    int ledPin=5;
    int buttonPin=8;
    void setup() {
      pinMode(buttonPin, INPUT);
      pinMode(ledPin, OUTPUT);
    }
    void loop() {
      if (digitalRead(buttonPin)==HIGH){
        digitalWrite(ledPin, HIGH);
      } else {
        digitalWrite(ledPin, LOW);
      }
    }

    Um den Befehl digitalRead(); nutzen zu können, muss der entsprechende Pin vorher als Input deklariert worden sein: pinMode(buttonPin, INPUT);

    Die Konstruktion if (digitalRead(buttonPin)==HIGH) prüft, ob der ausgelesene Zustand des Tasters gleich HIGH ist. In unserer Beispielschaltung wird HIGH ausgegeben, wenn der Pin irgendwie eine Verbindung zum 5V+ hat. Ist der Taster gedrückt, besteht diese. Das doppelte Gleichheitszeichen ist zwingend erforderlich! Ist die Bedingung in den Klammern der if-Abfrage richtig, also wahr, wird der Teil in den geschweiften Klammern ausgeführt. Ist er nicht wahr, wird der Teil ausgeführt, der hinter else steht.

    Mehr zur if-Abfrage

    for-Schleife

    Manchmal möchte man bestimmte Vorgänge ein paar Mal wiederholen. Dafür bietet sich die for-Schleife an:

    int greenPin=6;
    int redPin=5;
    void setup() {
      pinMode(greenPin, OUTPUT);
      pinMode(redPin, OUTPUT);
    }
    void loop() {
      for (int i=0; i<3; i=i+1){
        digitalWrite(greenPin, HIGH);
        delay(250);
        digitalWrite(greenPin, LOW);
        delay(250);
      }
      for (int i=0; i<6; i=i+1){
        digitalWrite(redPin, HIGH);
        delay(250);
        digitalWrite(redPin, LOW);
        delay(250);
      }
    }

    Dieses Programm lässt erst die grüne LED dreimal blinken, dann die rote sechsmal. Die Konstruktion for (int i=0; i<3; i=i+1){} wiederholt alles in den geschweiften Klammern, solange die Fortsetzungsbedingung i<3 wahr ist. Bei i handelt es sich um eine Zählervariable, die beim Start angelegt und auf 0 gesetzt wird: int i=0. Bei jedem Schleifendurchlauf wird i um 1 erhöht: i=i+1. (Normalerweise schreibt man dies verkürzt durch i++).

    Mehr zu for-Schleifen

    Methoden

    Dieser Programmtext ist noch relativ lang und lässt sich durch das Anlegen einer eigenen Methode verkürzen. Immer wenn man gleiche Befehlsfolgen wiederholen will, bietet sich das an:

    int greenPin=6;
    int redPin=5;
    void setup() {
      pinMode(greenPin, OUTPUT);
      pinMode(redPin, OUTPUT);
    }
    void blinken(int thePin, int wiederholungen){
      for (int i=0; i<wiederholungen; i=i+1){
        digitalWrite(thePin, HIGH);
        delay(250);
        digitalWrite(thePin, LOW);
        delay(250);  
      }
    }
    void loop() {
      blinken(greenPin,3);
      blinken(redPin,6);
    }

    Die Methode void blinken() {} lässt eine LED eine bestimmte Anzahl oft blinken. Sie benötigt zwei Informationen: Welche LED soll blinken? Wie oft soll sie blinken? Beide Informationen sind ganzzahlig und werden in den runden Klammern als Argumente angelegt blinken(int thePin, int wiederholungen). Innerhalb der Methode kann man nun die Variablen „thePin“ und „wiederholungen“ verwenden.

    Aus der loop()-Methode rufen wir die blinken()-Methode zweimal auf und übergeben jeweils die LED und die Anzahl der Wiederholungen.

    blinken(greenPin,3);
    blinken(redPin,6);

    Damit sind wir erstmal am Ende dieses Schnelleinstiegs angekommen. Ich hoffe, die Ausführungen waren verständlich und ich würde mich natürlich sehr über Kommentare dazu freuen.


    Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    2.8 4 votes
    Article Rating
    Abonnieren
    Benachrichtige mich bei

    Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..

    58 Comments
    Newest
    Oldest Most Voted
    Inline Feedbacks
    Alle Kommentare anzeigen
    STEFAN
    4 Monate zuvor

    arduino ist richtig cool aber auch sehr schwierig

    10 Monate zuvor

    Funktioniert alles Super
    Wie teuer ist die Ardoino box?#

    10 Monate zuvor

    Funktioniert alles

    andreas
    1 Jahr zuvor

    cool! hast du auch ein code fuer ein haustier,das gehen kann?

    Laposlocos
    2 Jahre zuvor

    hallo an alle ich hab ein kleines problem und hoffe ihr könnt mir helfen ich arbeite mit dem led ring von arduino und ich bekomme den grosen ring mit 40 led´s nicht komplett belechtet den 24 led ring aber schon weis jemand wie mann das löst danke schon mal im vorraus

    2 Jahre zuvor

    was ist hier falsch?

    #include
    Servo Sl;
    int messwert;
    int sensor(A0);
    int Temperatur;
    int knopf;
    int trigger=7;
    int echo=6;
    long dauer;
    long entfernung;

    void setup() {
    pinMode(12, INPUT);
    pinMode(11, OUTPUT);
    Sl.attach(9);
    pinMode(6,INPUT_PULLUP);
    }
    {
    pinMode(trigger, OUTPUT);
    pinMode(echo, INPUT);
    }
    {

    Serial.begin(9600)
    knopf = digitalRead(6);
    if (knopf == 0){
    if (digitalRead 12==1) {
    analogWrite(11, 450);
    delay(500);
    analogWrite(11, 10);
    delay(500);
    }
    else {
    analogWrite(11, LOW);
    }
    }
    }

    void loop() {
    messwert=analogRead(sensor);
    Temperatur=map(messwert,20,179,-40,62);

    if(Temperatur>05152030= 500 || entfernung <= 0)
    {
    Serial.println("Kein Messwert");
    }
    else

    Serial.print(entfernung);
    Serial.println(" cm");
    }
    delay(1000);
    }
    }

    Jennifer Bratzel
    Antworte an  DVaK
    6 Monate zuvor

    Probiers mal mit dem:
    #include
    Servo Sl;
    int messwert;
    const int sensor = A0;
    int Temperatur;
    int knopf;
    int trigger = 7;
    int echo = 6;
    long dauer;
    long entfernung;

    void setup() {
    pinMode(12, INPUT);
    pinMode(11, OUTPUT);
    Sl.attach(9);
    pinMode(6, INPUT_PULLUP);
    pinMode(trigger, OUTPUT);
    pinMode(echo, INPUT);

    Serial.begin(9600);
    }

    void loop() {
    knopf = digitalRead(6);
    if (knopf == 0) {
    if (digitalRead(12) == 1) {
    analogWrite(11, 255); // Adjusted PWM value
    delay(500);
    analogWrite(11, 10);
    delay(500);
    } else {
    analogWrite(11, LOW);
    }
    }

    messwert = analogRead(sensor);
    Temperatur = map(messwert, 20, 179, -40, 62);

    if (Temperatur > 50 || entfernung <= 0) {
    Serial.println("Kein Messwert");
    } else {
    Serial.print(entfernung);
    Serial.println(" cm");
    }
    delay(1000);
    }

    Leon
    3 Jahre zuvor

    Sehr gut erklärt, vielen Dank für die Hilfe!

    Thomas
    3 Jahre zuvor

    Sehr gut erklärt, danke für deine Arbeit!!
    Ich bin zum dem Thema Arduino gekommen, da ich gerne ein Pferderennen bauen möchte wie auf der Kirmes. ich habe mir überlegt ich würde gerne die Stepmotoren mit kontaktschalter ansteuern, sodass der motor bei kontakt eine umdrehung macht oder vll auch mehr muss ich später mal schauen. Dies ist denke ich mit einer If formel zu lösen nun möchte ich aber auch, dass der motor je nach getroffenen Loch mal 3 umdrehungen macht mal nur 2 oder 1. Ich würde gerne wissen, ob meine Idee überhaupt umzusetzten ist oder ich vll der Einfachheit halber es so löse, dass ich mehrere Kontaktschalter anbaue also bei einem 3 Punkte loch einfach 3 Kontaktschalter.
    vielen Dank schon mal im voraus

    4 Jahre zuvor

    int i=0;
    void setup() {
    Serial.begin(8200);
    }
    void loop() {
    for (i; i<5; i=i+1) {
    Serial.print(+);
    }
    for (i; i<=9; i=i+1) {
    Serial.print("?");
    }
    delay (1000);
    i=1;
    }
    Könnten sie mir helfen hier 4 Fehler zu finden?

    xsold_
    Antworte an  Mika
    3 Jahre zuvor

    ist dieser code valide?
    MFG,
    xsold_

    #include

    using namespace std;

    class Ard {
    public:
    void setup()
    {
    pinMode(6, OUTPUT);
    }
    void loop(int num)
    {

    }
    void _blink(int pin, int repeats)
    {
    for (int i = 0; i < repeats; i++)
    {
    digitalWrite(pin, HIGH);
    delay(250);
    digitalWrite(pin, LOW);
    delay(250);
    }
    }
    }

    int main()
    {
    Ard arduino;

    int _led = 5;

    arduino.setup();
    arduino._blink(_led, 10);
    }

    Antworte an  Mika
    2 Jahre zuvor

    int i=0;

    void setup()
    {
    Serial.begin(9200);
    }

    void loop()
    {
    for (i; i<5; i=i+1)
    {
    Serial.print("+");
    }
    for (i; i<=9; i=i+1)
    {
    Serial.print("?");
    }
    delay (1000);
    i=1;
    }

    Die Geschwindigkeit ist schon mal falsch angegeben, vermutlich ein Tippfehler.
    Zweiter Fehler: Serial.print erfolgt die Angabe in der Klammer immer mit Anführungszeichen.
    Bei Fragezeichen ist es ja richtig gemacht…..

    58
    0
    Ich würde mich über deine Meinung freuen.x