Arduino Nano

Die Fahrtzielanzeige in der D9 wurde mit einem Arduino Nano realisiert. Als Display habe ich ein MakerHawk OLED 2x I2C Display  0,91 Zoll 128x32 Pixel 30x12mm verwendet.

Um das Signal zum Umschalten vom Decoder zum Arduino zu realisieren, habe ich auf einen Optokoppler zurück gegriffen. 
Hier zu sehen, der Probeaufbau auf einem Entwicklerboard.

 


Ich baue das meiste auf Lochrasterplatine. Und noch eine Zeichnung meines Schaltplans. Tolle, schicke Schaltpläne brauche ich nicht. Meistens nur eine Skizze.

 Platine    Zeichnung

 

Hinter der linken Scheibe platziert, zeigt sie die verschiedenen Endstationen, wahlweise mit Zwischenhalt oder das Logo an.

 

Als Stromversorgung nutze ich gern ein StepDown Modul (links im Bild). Hier kann man sehr genau die nötigen 5V einstellen und das kleine Ding versorgt hier den Arduino und die Servos zuverlässig mit bis zu 1A mit Strom.

 

Zurück zur "Elektronik" Seite

Der Arduino Sketch, für alle die das privat auch versuchen wollen! Die Namen der Stationen müssten natürlich angepasst werden!

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

const int taster=2;
int tasterStatus = 0;
int text = 0; // Variable für den Ablauf
bool geschaltet = false;
bool taster_state, taster_state_alt;// Variablendeklaration (global)
#define debounce_delay 15 //Entprellzeit für den Taster

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

#define OLED_RESET     4 // Reset pin # (or -1 wenn Sie den Arduino-Reset-Pin teilen)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(9600);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x32
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); 
  }
  display.display();
  delay(2000); 

   display.clearDisplay();

  
  display.drawPixel(10, 10, SSD1306_WHITE); // ein einzelnes Pixel in Weiß

  display.display();
  delay(2000);
  pinMode(taster, INPUT_PULLUP); //wir definieren den tasterPin als Eingang mit Pull Up


}

void loop() {
  
   static uint32_t debounce_time;
 if (millis()-debounce_time>debounce_delay)taster_state = digitalRead(taster); //einlesen des Tasters
   
 if (taster_state != taster_state_alt) // bei Pegelwechsel
    {
     debounce_time=millis();
     taster_state_alt = taster_state;
     if(!taster_state)//wenn Taster gedrückt
    {
      text++;         //Text +1
      if (text >5) text = 0; //nach dem letzten Text fängt das ganze bei "0" an
    }
    if (text  == 0)         // Text 1 - einmal drücken
    {
    void text(void); 
  display.clearDisplay();

  display.setTextSize(2);    // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10,0);   // Position Text
  display.println(F("Schnecken"));
  display.setCursor(15,15);  // Position Text
  display.println(F("bergbahn"));
  display.display();        // Anfangstext anzeigen
    }
  }

  else if (text  == 1)      // Text 2
  {    
    void text(void); 
  display.clearDisplay();

  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(2, 15);
  display.println(F("R1"));
  display.drawRect (0,12,25,20,SSD1306_WHITE);    //Rahmen  um "R1" (Rechteck [drawRect (xEcke, yEcke, Breite, Höhe)]
  
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(20, 0);
  display.println("Schnecken");
  display.setCursor(50,15);
  display.println("berg");
  display.display(); 
    
  }
  else if (text  == 2)       // Text 3
  {    

    void text(void); 
  display.clearDisplay();
  
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(2, 15);
  display.println(F("R1"));
  display.drawRect (0,12,25,20, SSD1306_WHITE); 
  
  display.setTextSize(2); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(50, 0);
  display.println(F("Lotsch"));

  display.display();      // Anfangstext anzeigen
    
  }
  else if (text  == 3)   // Text 4 Wechselanzeige
  {    
    void wechselanzeige(void); 
    {switch ((millis()/2500)%2)//millis(Millisikunden)2500=2,5Sekunden
    {                           //%2 = 2 Anzeigen, %3 = 3 Anzeigen usw.
case 0:
  display.clearDisplay();
  
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(2, 15);
  display.println(F("R2"));
  display.drawRect (0,12,25,20, SSD1306_WHITE); 
  
  display.setTextSize(2); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(40, 0);
  display.println("Gunters");
  display.setCursor(50,15);
  display.println("berge");break;

case 1:
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(2, 15);
  display.println(F("R2"));
  display.drawRect (0,12,25,20, SSD1306_WHITE); 
  
  display.setTextSize(1); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(50, 0);
  display.println(F("Guntersberge"));

  display.setTextSize(1); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(50, 10);
  display.println(F("via Stausee"));

  display.setTextSize(1); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(50, 20);
  display.println(F("und Bruecke"));break;
  default: display.println("Error");}
    
  display.display();      // Anfangstext anzeigen
  }
  }
    
    
    else if (text  == 4)    // Text 5 Wechelanzeige
  {    
    void wechselanzeige(void); //Wechselanzeige Serial
    {switch ((millis()/2500)%2)//millis(Millisikunden)2500=2,5Sekunden
                               //%2 = 2 Anzeigen, %3 = 3 Anzeigen usw.
    {
case 0:
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(2, 15);
  display.println(F("R2"));
  display.drawRect (0,12,25,20, SSD1306_WHITE); 
  
  display.setTextSize(1); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(50, 0);
  display.println(F("Schneckenberg"));

  display.setTextSize(1); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(50, 10);
  display.println(F("via Bruecke"));

  display.setTextSize(1); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(50, 20);
  display.println(F("und Stausee"));break;


case 1:
  display.clearDisplay();
  display.setTextSize(2);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(2, 15);
  display.println(F("R2"));
  display.drawRect (0,12,25,20, SSD1306_WHITE); 
  
  display.setTextSize(2); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(20, 0);
  display.println("Schnecken");
  display.setCursor(50,15);
  display.println("berg");break;
  default: display.println("Error");
  }
  display.display();      // Anfangstext anzeigen
    }
  }
  else if (text  == 5)       // Text 6 "Logo"
  {    

    void logo(void); 
  display.clearDisplay();
   
  display.drawLine (0,30,128,30, SSD1306_WHITE);   // untere Linie - drawLine(xAnfang, yAnfang, xEnde, yEnde, Farbe); (128x32)
  display.drawLine (0,31,128,31, SSD1306_WHITE);   // untere Linie
  
  display.drawRect (33,0,65,30, SSD1306_WHITE);    //Rahmen  um "SEG" (Rechteck [drawRect (xEcke, yEcke, Breite, Höhe)x=von links; y=von oben]
 
  display.drawLine (10,0,33,0, SSD1306_WHITE);      //1. Linie links 
  display.drawLine (10,1,118,1, SSD1306_WHITE);     //  Linie 1 unten geht durch
  display.drawLine (15,4,33,4, SSD1306_WHITE);      //2. Linie links
  display.drawLine (15,5,33,5, SSD1306_WHITE);
  display.drawLine (20,8,33,8, SSD1306_WHITE);      //3. Linie links
  display.drawLine (20,9,33,9, SSD1306_WHITE);
  display.drawLine (98,0,118,0, SSD1306_WHITE);      //1. Linie rechts
 
  display.drawLine (98,4,113,4, SSD1306_WHITE);      //2. Linie rechts
  display.drawLine (98,5,113,5, SSD1306_WHITE);
  display.drawLine (98,8,108,8, SSD1306_WHITE);      //3. Linie rechts
  display.drawLine (98,9,108,9, SSD1306_WHITE);

  display.drawLine (10,26,33,26, SSD1306_WHITE);      //2. Linie von unten links 
  display.drawLine (10,25,33,25, SSD1306_WHITE);
  display.drawLine (98,26,118,26, SSD1306_WHITE);      //2. Linie von unten rechts
  display.drawLine (98,25,118,25, SSD1306_WHITE);
  
  display.setTextSize(3); // Textgröße
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(40, 5);
  display.println(F("SEG"));

  display.display();      // Anfangstext anzeigen
    
  }
  
   
}

 

Zurück zur "Elektronik" Seite