1,8 Zoll OLED - Display

Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 1,8 Zoll OLED - Display

Beitrag von Admin »

Weißt du schon, wie das bei deinen Autos weitergeht? Also du hast jetzt den Pin. der einen günstigen Preis an der Tanke wiedergibt, aber wie oder mit was reagiert jetzt das Auto darauf. Ich habe keine Ahnung wie die Autos gesteuert sind. Die fahren doch nur auf einen Magnetband selbstständig entlang. Wie bekommen die dann die Info, dass sie jetzt in die Tankstelle rein sollen?
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: 1,8 Zoll OLED - Display

Beitrag von e69-fan »

Guten Morgen Franz,

in der Fahrbahn ist mittig ein Eisendraht oder wie bei mir ein Magnetband eingelassen. Die Lenkung hat einen Schleifer mit einem kleinen Magneten und wird vom Magnetband auf der Spur gehalten.

Als Abzweigung zur Tankstelle wird ein Servo in die Fahrbahn eingelassen. Das ankommende Magnetband wird über dem Servoarm befestigt. Am Ausgang befinden sich 2 Magnetfahrbahnen (Weiterfahrt oder zur Tanke). Je nach Servostellung fährt das Auto dorthin.

Also - billigster Preis - Servo dreht auf Abzweig und Auto fährt in die Tanke. Externe IR-LED stoppt das Auto.

Servus
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 1,8 Zoll OLED - Display

Beitrag von Admin »

e69-fan hat geschrieben: So 14. Nov 2021, 08:51 Also - billigster Preis - Servo dreht auf Abzweig und Auto fährt in die Tanke. Externe IR-LED stoppt das Auto.
Guten Morgen.
Ahhh, ok, dann könnte man ja eigentlich auch gleich den Servo in der Software vom Tankstellenschild integrieren. So dass nicht der Pin nur HIGH / LOW geschalten wird, sondern gleich ein Servo an dem Pin hängt. Und die StoppLED auch gleich integrieren?
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: 1,8 Zoll OLED - Display

Beitrag von e69-fan »

Hallo Franz,

ich habe den Sketch ein bisschen übersichtlicher formatiert und beim kompilieren wird mir folgende Warnung ausgegeben:
C:\Users\Internet\Documents\Arduino\Tankanzeige_mit_LED\Tankanzeige_mit_LED.ino: In function 'void loop()':
C:\Users\Internet\Documents\Arduino\Tankanzeige_mit_LED\Tankanzeige_mit_LED.ino:121:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (offset < lauftext.length()) {
~~~~~~~^~~~~~~~~~~~~~~~~~~

Code: Alles auswählen

/*  Tankanzeige mit LED
 *  Anpassungen für DC-Car "tanken wenn am billigsten" by e69-fan
 *   
   Steuerungsprogramm für die Tankanzeige der Aral-Tankstelle von Juergen
   Idee und erster Entwurf: Juergen
   Anpassungen fuer Lauftext: Dominik
   © Juergen und Dominik 2021

   Pinout Nano:
   VCC = 5v   GND = GND   CS  = D10
   RST = D8   DC  = D9    SDA = D11   SCK = D13   LED = 3,3V

   Pinout Mega:
   DC = 8   RST = 9   SDA = 51   SCK = 52
   CS = 10  VCC = 5V  LED = 3,3V

   SPI Display
   VCC - GND - CS - Reset - A0 - SDA - SCK - LED

*/

// ============================ Laden der notwendigen Bibliotheken ======================================================== //

#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>
#include <SPI.h>


// ============================ Definieren der PINs ====================================================================== //

#define TFT_CS        10
#define TFT_RST        8    // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC         9
#define MinPreis       7    // Kontakt bei Tiefpreis    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //
#define MGP           93    // tiefster Preis bei (93)  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

// Pin fuer die LEDs in der Tankstelle  (wenn aktiviert, Vorwiderstand nicht vergessen!! und Zeile 87 auch aktivieren
//int led = 3;


// ============================ Definition der Texte und Werte ============================================================ //

const String lauftext = "  Angebote:  Bockwurst im Brot 3,20   ***   Kaffee + Kuchen 2,20   ***   Wagenpflege 5,60   ***   Handpolitur 18,95   ***"; // Scrolltext
const uint8_t width = 24;     //Länge des Ausschnittes
int offset = 0;

// wir arbeiten mit byte und tun bei der Anzeige nur so, als wären es Kommazahlen. Das spart Speicher.
uint8_t preisBasis = 93;                                                // = LKW
uint8_t grenzeUnten = 85, grenzeOben = 132;
uint8_t diesel = 2, benzin = 4, super = 6, superplus = 12, gas = -52;   // Differenz der Kraftstoffe

/*
    Definieren der Farbe fuer den Hintergund und den Vordergrund
    Onlinetool zum umrechnen der Farbwerte
    http://www.barth-dev.de/online/rgb565-color-picker/

*/

//uint16_t TFT_BLUE = 0210;               // Hintergrundfarbe
                                          // Zum verwenden die nachfolgenden Zeilen aktivieren.
word RGBtoColor( byte R, byte G, byte B)
{
  return ( ((R & 0xF8) << 8) | ((G & 0xFC) << 3) | (B >> 3) );
}
uint16_t TFT_BLUE = RGBtoColor(65, 105, 225);


// ============================ Zeitsteuerung der Displayanzeige ========================================================== //

uint32_t aktMillis, lastUpdatePreise, lastUpdateScrollText;
const uint32_t INTERVALL = 12 * 15000UL;                      // das wären 3  Minuten
//const uint32_t INTERVALL = 60000;                           // das waere 1  Minute
const uint32_t SCROLLINTERVALL = 250;                         // Scrollabstand in Milli-Sekunden 1000 = 1 Sekunde

// ============================ setup ===================================================================================== //
// ============================ setup ===================================================================================== //
void setup(void) {

  Serial.begin(9600);
  Serial.println(F("Hello. I´m the display of your gasstation"));
  
  pinMode(MinPreis, OUTPUT);       // Pin 7

  //Juergens Display
  tft.initR(INITR_BLACKTAB);

  tft.setRotation(2);              // DREHEN DES DISPLAYS um 180° mit (0) oder (2)
  //tft.setSPISpeed(40000000);
  tft.setTextWrap(false);

  tft.fillScreen(TFT_BLUE);

  Serial.println(F("Display started"));
  Serial.print("Text: >"); Serial.print(lauftext); Serial.print("< Laenge: "); Serial.println(width);

  randomSeed(analogRead(A0));       // unbenutzter Analogeingang ????????
  schreibeNeu();
}


// ============================ loop ====================================================================================== //
// ============================ loop ====================================================================================== //
void loop() {
  //digitalWrite(3,HIGH);           // LED`s in der Tankstelle
  aktMillis = millis();

  if (aktMillis - lastUpdatePreise >= INTERVALL) {
    lastUpdatePreise = aktMillis;
    schreibeNeu();
  }

  // Zeichnen des Rahmens um den Lauftext
  tft.drawRect(0, 116, tft.width(), 13, ST7735_WHITE);      // x, y, weite, hoehe, Farbe

  // Lauftext ausgeben
  if (aktMillis - lastUpdateScrollText >= SCROLLINTERVALL) {
    lastUpdateScrollText = aktMillis;
    //Serial.println(scroll());
    if (offset < lauftext.length()) {
      offset++;
      scrollText(offset);
    } else {
      offset = 0;
    }
  }

  // Gute Fahrt
  tft.setTextSize(2);
  tft.setCursor(0, 140);
  tft.print("Gute Fahrt!");
}

// Scrolltext erstellen und ausgeben
void scrollText(int offset) {
  String t = "";
  t = lauftext.substring(offset, offset + width - 1);
  
  // Print the string for this iteration
  tft.setCursor(3, 119);
  tft.fillRect(1, 118, tft.width() - 2, 10, TFT_BLUE); // x, y, weite, hoehe, Farbe
  tft.setTextSize(1);
  tft.print(t);
  //delay(0.1);
}

// uint8_t zu scheinbarem Floatstring
char *byteToFloat(uint8_t in) {
  static char preisStr[5];
  preisStr[4] = '\0';
  preisStr[1] = '.'; // oder ','
  preisStr[3] = in % 10 + '0';
  in /= 10;
  preisStr[2] = in % 10 + '0';
  in /= 10;
  preisStr[0] = in % 10 + '0';
  
  // Serial.println(preisStr);
  return preisStr;
}
// Ausgabe eine Zeile
void schreibPreis(int y, const char* beschriftung, uint8_t preisZahl) {
  int abstandLinksText = 5;
  char *preis = byteToFloat(preisZahl);
  Serial.print(beschriftung); Serial.print(": "); Serial.println(preis);

  //Kraftstoffart klein schreiben
  tft.setTextSize(1);
  tft.setCursor(abstandLinksText, y);
  tft.print(beschriftung);

  //Preis gross schreiben
  tft.setTextSize(2);
  int abstandLinksPreis = 70;
  tft.setCursor(abstandLinksPreis, y);
  tft.print(preis);

  //eine kleine 9 schreiben
  tft.setTextSize(1);
  int abstandLinks9 = 120;
  tft.setCursor(abstandLinks9, y);
  tft.print("9");
}

// schreibe die Preise

void schreibeNeu() {

  //Hintergrund schwarz füllen
  tft.fillScreen(TFT_BLUE);
  tft.setTextColor(ST7735_WHITE);
  int y = 10;
  int zeilenHoehe = 28;

  
  // neuen Basispreis berechnen xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //
    uint8_t diff = random(6) - 3;             // 3 Cent +- Differenz
  uint8_t neu = preisBasis + diff;
  
  if (neu < grenzeUnten || neu > grenzeOben) {
    neu = preisBasis - diff;
  }
  preisBasis = neu;
  
  Serial.println(F("#################"));
  Serial.println(F("Neuer Basispreis:"));
  Serial.println(neu);
  
  // Hier wird der Niedrigpreis ermittelt xxxxxxxxxxxxxxxxxxxxx //
  // Wenn günstig dann Pin. 7 auf "HIGH"
  
  if (neu < MGP) {
    digitalWrite (MinPreis, HIGH);
  }
  else {
    digitalWrite (MinPreis, LOW);
  }

  schreibPreis(y, "Diesel", preisBasis + diesel);
  y += zeilenHoehe;
  schreibPreis(y, "Benzin", preisBasis + benzin);
  y += zeilenHoehe;
  schreibPreis(y, "Super", preisBasis + super);
  y += zeilenHoehe;
  schreibPreis(y, "Super+", preisBasis + superplus);
}

Im Sketch mit dem Du gearbeitet hast war auch noch ein Fehler vom Urheber:
void schreibPreis(int y, char* beschriftung, uint8_t preisZahl) {
ist abgeändert um const char auf:
void schreibPreis(int y, const char* beschriftung, uint8_t preisZahl) {
Ich mache mir mal ein paar krumme Gedanken, wie es mit der Tanke weitergeht - Servus
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 1,8 Zoll OLED - Display

Beitrag von Admin »

Mit den Erklärungen in dem Link komme ich noch nicht klar.
Das Buch habe ich heute bekommen.
Die Krimpzange war für heute angekündigt, aber wird wohl erst morgen kommen.
Naja, schauma mal, dann sehn wirs schon :oo:

Schönen Abend
Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 1,8 Zoll OLED - Display

Beitrag von Admin »

Krimpzange und Stecker habe ich jetzt auch. Und mein Fenster Stellmotor ist auch da. Werde ich morgen mal einbauen. Und dann gibts die erste Nacht mit der neuen Technik. :(oo): Wenn das Zeug funktioniert habe ich auch schon etwas gößere Pultgehäuse in die das alles schon reinpasst.

Servus
Franz :(V):

PS: Nur mein neues Handy war angekündigt und ist nicht gekommen. Soll jetzt morgen kommen. Meines ist beim Ausziehen der Jacke aus der Tasche geflogen und auf dem Boden gelandet. Und soooo blöd am Boden auf eine Ecke geknallt, dass das Display KO gegangen ist :O:
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: 1,8 Zoll OLED - Display

Beitrag von Admin »

Hi Wolfgang.
Jetzt ist mir wieder eingefallen was du noch ändern wolltest. Die Preisdaten für das Tankstellenschild hast du vor ewigen Zeiten mal ändern wollen. Ich wusste dass da noch was war, aber nicht mehr was es war. Jetzt im Moment ist´s mir wieder eingefallen. Aber da du in der Versenkung verschwunden bist, weiß ich nicht ob das noch aktuell ist. Vielleicht lässt du mich mal wissen, ob dich das noch interessiert? Dann könnte wir uns das mal ansehen.

Franz
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste