Arduino Forum

International => Deutsch => Topic started by: Alfaone79 on Aug 02, 2018, 12:31 pm

Title: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 02, 2018, 12:31 pm
Hallo zusammen, möchte mich kurz vorstellen.
Ich heiße Christoph bin 38 Jahre alt. Bin Neuling bei dem Thema Arduino und habe keine Vorkenntnissen in Sachen Programmierung.
Nein Ziel ist es irgendwann mal ein zusatzinstrumen für mein Motorrad zu bauen, in dem motortemperatur, Uhrzeit, ganganzeige, ein Logo beim starten und Evtl Reifendruck enthalten sind.
Ich habe mit ein Lehrbuch besorgt, in dem auch kleine Aufgaben gestellt werden z.b. Das ein und ausschalten der led pin13 über die serielle Schnittstelle. Das hat auch funktioniert. Nun soll die led zusätzlich mit Eingabe der „3" zum blinken gebracht werden. Das klappt nicht.
Hat da jemand nen Tipp für den Code für mich?
Bedanke mich schon mal im voraus bei euch für die Hilfe
Gruß Christoph
Title: Re: Anfänger, neu im Forum
Post by: combie on Aug 02, 2018, 12:47 pm

Wo ist dein Problem?

"klappt nicht" ist keine ausreichende Fehlerbeschreibung.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 02, 2018, 12:57 pm
Okay, das stimmt.
Die led geht einmal an und wieder aus.
Das Programm scheint die an/aus folge nicht zu wiederholen. Sonst funktioniert es.
Title: Re: Anfänger, neu im Forum
Post by: volvodani on Aug 02, 2018, 01:11 pm
Zeige mal den Sketch dann kann man anhand des Sketches dir besser helfen und/oder Tips geben.
Ist immer einfacher.
Gruß
DerDani
Title: Re: Anfänger, neu im Forum
Post by: combie on Aug 02, 2018, 01:51 pm
Das Programm scheint die an/aus folge nicht zu wiederholen. Sonst funktioniert es.
Leider sehe ich weder Programm, noch Schaltung.
Damit ist es mir nicht möglich, dir bei deinem Problem zu helfen.

Bedenke:
Du, dein Aufbau und dein Monitor, stehen auf der anderes Seite des Internets.
Zu weit weg....
Und meine telepathischen Fähigkeiten, sind auch sehr begrenzt.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 02, 2018, 10:08 pm
So,
Habe einen Arduino UNO
Sketch von der ersten Aufgabe:

const unsigned int LED_PIN = 13;
const unsigned int BAUD_RATE = 9600;
                                                                                                                                                                                                     
void setup() {
  pinMode (LED_PIN, OUTPUT);
  Serial.begin (BAUD_RATE);

}

void loop() {
  if (Serial.available() > 0) {
    int command = Serial.read();
    if (command == '1') {
      digitalWrite (LED_PIN, HIGH);
      Serial.println("LED on");
     
    } else if (command == '2') {
      digitalWrite (LED_PIN, LOW);
      Serial.println("LED off");
    } else {
      Serial.print("Unknown command: ");
      Serial.print(command);
    }
  }
}
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 02, 2018, 10:17 pm
Sketch von der zweiten Aufgabe, Zeile 22-27 habe
Ich hinzugefügt.

const unsigned int LED_PIN = 13;
const unsigned int BAUD_RATE = 9600;
const unsigned int PAUSE = 500;
                                                                                                                                                                                                     
void setup() {
  pinMode (LED_PIN, OUTPUT);
  Serial.begin (BAUD_RATE);

}

void loop() {
  if (Serial.available() > 0) {
    int command = Serial.read();
    if (command == '1') {
      digitalWrite (LED_PIN, HIGH);
      Serial.println("LED on");
   
    } else if (command == '2') {
      digitalWrite (LED_PIN, LOW);
      Serial.println("LED off");

    } if (command == '3') {
      digitalWrite(LED_PIN, HIGH);
      delay(PAUSE);
      digitalWrite(LED_PIN, LOW);
      delay(PAUSE);
      Serial.println("LED blinkt");
         
    } else {
      Serial.print("Unknown command: ");
      Serial.print(command);
      }
    }
 
Title: Re: Anfänger, neu im Forum
Post by: HotSystems on Aug 02, 2018, 10:22 pm
So wie du das machst, kann es nicht funktionieren.

Du musst das Ergebnis in einer Statusvariable zwischenspeichern und dann immer in der Loop blinken lassen.
Aber nicht mit den delays, sondern mit dem Beispiel in BlinkWithoutDelay aus der IDE.

Und setze deine Sketche in Code-Tags, dann sind die für alle besser lesbar.
So fehlt jegliche Formatierung.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 02, 2018, 10:30 pm
Danke für die Antwort,
Leider habe ich nichts verstanden von dem was du geschrieben hast
Title: Re: Anfänger, neu im Forum
Post by: combie on Aug 02, 2018, 10:35 pm
Code: [Select]
const byte LED_PIN    = 13;
bool blinkanforderung = false;

void yield()
{
  switch(Serial.read())
  {
    case '1': digitalWrite (LED_PIN, HIGH);
              blinkanforderung = false;
              break;
              
    case '2': digitalWrite (LED_PIN, LOW);
              blinkanforderung = false;
              break;
              
    case '3': blinkanforderung = true;
              break;
  }  
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  pinMode (LED_PIN, OUTPUT);
}

void loop()
{
  if(blinkanforderung) digitalWrite (LED_PIN,!digitalRead(LED_PIN));
  delay(300);
}



 :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:  :smiley-twist:
Title: Re: Anfänger, neu im Forum
Post by: HotSystems on Aug 02, 2018, 10:38 pm
Danke für die Antwort,
Leider habe ich nichts verstanden von dem was du geschrieben hast
Das ist aber sehr bedauerlich.
Habe ich mich zu undeutlich ausgedrückt ?
Title: Re: Anfänger, neu im Forum
Post by: combie on Aug 02, 2018, 10:41 pm
Eine Variante, ohne delay.
Code: [Select]
#include <INTERVAL.h>
// https://forum.arduino.cc/index.php?topic=413734.0

const byte LED_PIN    = 13;
bool blinkanforderung = false;

void serialEvent()
{
  switch(Serial.read())
  {
    case '1': digitalWrite (LED_PIN, HIGH);
              blinkanforderung = false;
              break;
             
    case '2': digitalWrite (LED_PIN, LOW);
              blinkanforderung = false;
              break;
             
    case '3': blinkanforderung = true;
              break;
  } 
}

void setup()
{
  Serial.begin(9600);
  Serial.println("Start");
  pinMode(LED_PIN,OUTPUT);
}

void loop()
{
  INTERVAL(300)if(blinkanforderung)digitalWrite(LED_PIN,!digitalRead(LED_PIN));
}

 :o  :o  :o  :o  :o  :o
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 03, 2018, 07:30 am
Ah, okay
Es gibt da also mehrere Wege zum Ziel
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 03, 2018, 07:58 am
Ohje, das wird ein langer Weg zu meinem geplanten Projekt.
Ist dieses Projekt, welches ich in meinem anfagspost beschrieben habe überhaupt realisierbar?
Wie bekomme ich die Sketche so dargestellt, das man sie im Forum lesen kann?
Title: Re: Anfänger, neu im Forum
Post by: HotSystems on Aug 03, 2018, 08:18 am
Ohje, das wird ein langer Weg zu meinem geplanten Projekt.
Ist dieses Projekt, welches ich in meinem anfagspost beschrieben habe überhaupt realisierbar?
Wie bekomme ich die Sketche so dargestellt, das man sie im Forum lesen kann?
Ja, wenn man programmieren will, muss man auch immer etwas lernen.
Damit die Sketche lesbar werden verwendest du Code-Tags, Schaltfläche </> oben links im Forumeditorfenster.

Und ja, dein Projekt ist realisierbar. Beispiele für einen Weg dahin wurden dir auch schon aufgezeigt.
Title: Re: Anfänger, neu im Forum
Post by: Johannes81 on Aug 03, 2018, 08:23 am
Ist schon realisierbar. Läuft grade hier im Forum. Schau mal nach Motorradtacho. Aber du hast schon recht. Einfach wird es nicht werden. Versuche erst mal mit den einfachen Basics klar zu kommen und dann arbeite dich Stück für Stück vor. Nicht nur hier im Forum wird es so gemacht, dass das Projekt in viele kleine Einzelprojekte zerlegt wird und wenn jedes dieser Einzelprojekte läuft werden dies dann nach und nach zu einem großen und ganzen zusammengebaut
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 03, 2018, 04:47 pm
Ahh
Title: Re: Anfänger, neu im Forum
Post by: HotSystems on Aug 03, 2018, 04:49 pm
Ahh
Ohhh...

Und ich sehe noch keine Code-Tags.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 03, 2018, 05:09 pm
Das Instrumenten Projekt ist genau  das gleiche wie ich es vor habe. Nur mit einem anderen Logo
Und in einem Rundinstrument mit einem OLED Display
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 03, 2018, 05:53 pm
Um noch einmal auf meine Frage zu den Übungen zurück zu kommen....
warum kann mein Sketch nicht fuktionieren?
Nur zum Verständniss

Code: [Select]
const unsigned int LED_PIN = 13;
const unsigned int BAUD_RATE = 9600;
const unsigned int PAUSE = 500;
                                                                                                                                                                                                     
void setup() {
  pinMode (LED_PIN, OUTPUT);
  Serial.begin (BAUD_RATE);

}

void loop() {
  if (Serial.available() > 0) {
    int command = Serial.read();
    if (command == '1') {
      digitalWrite (LED_PIN, HIGH);
      Serial.println("LED on");
   
    } else if (command == '2') {
      digitalWrite (LED_PIN, LOW);
      Serial.println("LED off");

    } else if (command == '3') {
      digitalWrite(LED_PIN, HIGH);
      delay(PAUSE);
      digitalWrite(LED_PIN, LOW);
      delay(PAUSE);
      Serial.println("LED blinkt");
         
    } else {
      Serial.print("Unknown command: ");
      Serial.print(command);
      }
    }
  }
Title: Re: Anfänger, neu im Forum
Post by: HotSystems on Aug 03, 2018, 06:06 pm
Um noch einmal auf meine Frage zu den Übungen zurück zu kommen....
warum kann mein Sketch nicht fuktionieren?
Nur zum Verständniss
Das hatte ich dir in Post #8 schon geschrieben.
Der kann nur so lange blinken (1 mal) wie er die 3 auswertet.

Das kannst du mittels Statusvariable ändern.
Diese mit der 3 auf HIGH setzen und solange blinken lassen, wie die Variable HIGH ist.

Und combie hat dir die entsprechenden Beispiele geliefert.
Was brauchst du denn noch ?
Title: Re: Anfänger, neu im Forum
Post by: postmaster-ino on Aug 03, 2018, 06:46 pm
Hi

Sein Problem wird sein, daß nach Seiner '3' noch ein CR/LF kommt und DAS ist 'Unknown command'.

Hätte der TO aber auch sagen können, daß Er immer wieder 'unbekanntes Kommando' ohne die Anzeige des unbekannten Kommando (da Steuerzeichen) bekommt ...
Würde auch direkt erklären, warum nach der 3 auch nur 1x geblinkt wird ...
Ganz nebenbei hast Du nach '1' oder '2' ebenfalls unbekannte Kommandos - wieder CR/LF

*Glaskugelmodus OFF*

MfG

PS: Klar, da nur bei anstehenden Daten auf der Seriellen überhaupt was gemacht wird, müsstest Du schon '333' schreiben, daß die Geschichte 3x blinkt.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Aug 03, 2018, 07:58 pm
Ok, kann man in dem komando „3" nicht eine Wiederholung einbauen, das es so lange blinkt bis ein neues Kommando kommt?
Wie gesagt, ich bin blutiger Anfänger..... ich versuche nur alles zu verstehen.
Nicht das das blinken der led wichtig ist, ich möchte es nur Schrott für Schritt lernen
Title: Re: Anfänger, neu im Forum
Post by: combie on Aug 03, 2018, 08:23 pm
Quote
Ok, kann man in dem komando „3" nicht eine Wiederholung einbauen,
Du hast kein Kommando 3 wo du was einbauen kannst.
Also: Bau dir ein "Kommando3", und dann bau das blinken da ein.

Ansonsten:
Ablaufsteuerung
Meine Standardantwort zu Ablaufsteuerungen:
Quote
Eine Stichworte Sammlung für Google Suchen:
Endlicher Automat,
State Machine,
Multitasking,
Coroutinen,
Ablaufsteuerung,
Schrittkette,
BlinkWithoutDelay, 
--
Blink Without Delay (https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay)
Der Wachmann (https://forum.arduino.cc/index.php?topic=423688.0)
--
Multitasking Macros  (https://forum.arduino.cc/index.php?topic=415229.msg2859554)
Intervall Macro (https://forum.arduino.cc/index.php?topic=413734.msg2848523)
Title: Re: Anfänger, neu im Forum
Post by: ElEspanol on Aug 03, 2018, 09:04 pm
einfache Lösung, anfängertauglich, aber sonst Mist:
int command global machen
die Auswertung auf die '3' aus der if rausnehmen und so in den loop
Title: Re: Anfänger, neu im Forum
Post by: postmaster-ino on Aug 03, 2018, 09:27 pm
... man könnte Das dann auch 'command'-Maschine nennen ;) (in Anspielung auf State-Maschine)

(der Status muß schon irgendwie global sein - zumindest static, was die Sache aber auch nicht besser als global macht)
Title: Re: Anfänger, neu im Forum
Post by: agmue on Aug 03, 2018, 09:38 pm
Ok, kann man in dem komando „3" nicht eine Wiederholung einbauen, das es so lange blinkt bis ein neues Kommando kommt?
Man kann, aber das Ergebnis ist nicht so erfreulich:

Code: [Select]
const unsigned int LED_PIN = 13;
const unsigned int BAUD_RATE = 9600;
const unsigned int PAUSE = 500;
int command;

void setup() {
  pinMode (LED_PIN, OUTPUT);
  Serial.begin (BAUD_RATE);
  Serial.println("Anfang");
}

void loop() {
  if (Serial.available() > 0) {
    command = Serial.read();
  }
  if (command == '1') {
    digitalWrite (LED_PIN, HIGH);
    Serial.println("LED on");

  } else if (command == '2') {
    digitalWrite (LED_PIN, LOW);
    Serial.println("LED off");

  } else if (command == '3') {
    digitalWrite(LED_PIN, HIGH);
    delay(PAUSE);
    digitalWrite(LED_PIN, LOW);
    delay(PAUSE);
    Serial.println("LED blinkt");

  } else {
    Serial.print("Unknown command: ");
    Serial.print(command);
  }
}

Die Lösung liegt im Setzen eines Merkers und der Trennung von Befehlserkennung und Blinken.
Title: Re: Anfänger, neu im Forum
Post by: ElEspanol on Aug 03, 2018, 10:13 pm
Dein Sketch funktioniert doch schon, wie es sich der TE vorstellt. Jetzt noch INTERVAL.h statt delay und es ist ein Sketch, der tut was er soll und nicht blockiert, also ein per Definition guter Sketch
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 07, 2018, 05:34 pm
Hallo, ich mal wieder.
Habe mich nun schon ein wenig eingearbeitet, habe aber nun schon wieder zwei neue Probleme:
1. Ich möchte mit drei Tastern und einem OLED SSD1327 Display verschiedene Zeichen anzeigen lassen. Z.b. Taster 1 und Taster 2 zugleich gedrückt „N", Taster 3 gedrückt „2", Taster 2 und Taster 3 gedrückt „5" usw.

2. Wie bekomme ich 2 oder mehr Sketche in einen integriert und kann diese mit einem Taster „durchschalten"?
Title: Re: Anfänger, neu im Forum
Post by: Tommy56 on Oct 07, 2018, 05:45 pm
2. Wie bekomme ich 2 oder mehr Sketche in einen integriert und kann diese mit einem Taster „durchschalten"?
Die globalen Variablen und die Inhalte von setup und loop zusammenfassen.
Aufpassen, dass keine Variablen doppelt vorhanden sind. Dann diese umbenennen.

Ansonsten möglicht die einzelnen Loop-Bestandteile in Funktionen fassen und diese in einem endlichen Automaten abhängig vom Zustand (den Du mit dem Taster einstellst) aufrufen.

Gruß Tommy
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 07, 2018, 05:49 pm
Wie sähe ein Sketch mit der Zusammenfassung mehrerer Sketch aus?
Title: Re: Anfänger, neu im Forum
Post by: Tommy56 on Oct 07, 2018, 05:57 pm
Da gibt es kein allgemeines Beispiel. Der sähe wie ein normaler Sketch aus, nur umfangreicher.

Gruß Tommy
Title: Re: Anfänger, neu im Forum
Post by: HotSystems on Oct 07, 2018, 06:03 pm
Oder du baust dir eine Menüstruktur auf, wo du entsprechend deine Funktion auswählst.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 07, 2018, 06:08 pm
Ein Beispiel für eine Menü Steuerung habe ich gefunden, leider weiß ich nicht wie ich meine Sketche dort einbinden kann
Title: Re: Anfänger, neu im Forum
Post by: HotSystems on Oct 07, 2018, 06:19 pm
Ein Beispiel für eine Menü Steuerung habe ich gefunden, leider weiß ich nicht wie ich meine Sketche dort einbinden kann
Wenn da keine Beschreibung bei ist, dann vergiss es.

Nimm besser dieses hier (http://forum.arduino.cc/index.php?topic=73816.0), das ist sehr gut beschrieben.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 07, 2018, 07:01 pm
Ahhh, ok, das werde ich mal ausprobieren
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 08, 2018, 10:07 am
Hm......
Um Nochmal zurück auf den Sketch, mit den drei Tastern zurück zu kommen...
Wie wäre denn da der beste Ansatz um dieses Projekt zu realisieren?
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 08, 2018, 01:03 pm
1. Ich möchte mit drei Tastern und einem OLED SSD1327 Display verschiedene Zeichen anzeigen lassen. Z.b. Taster 1 und Taster 2 zugleich gedrückt „N", Taster 3 gedrückt „2", Taster 2 und Taster 3 gedrückt „5" usw.
Ich habe die kleinere Variante SSD1306 128X64, macht aber sonst keinen Unterschied. Als Ausgangspunkt für weitere Überlegungen:

Code: [Select]
#include <SPI.h>
#include <Wire.h>
#include "U8g2lib.h"

U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0);

const byte T1 = 2;
const byte T2 = 3;
const byte T3 = 4;
bool t1, t2, t3;
char buf[] = "X";

void setup() {
  pinMode(T1, INPUT_PULLUP);
  pinMode(T2, INPUT_PULLUP);
  pinMode(T3, INPUT_PULLUP);

  oled.begin();

  ausgabe(buf);
}

void loop() {
  t1 = !digitalRead(T1);
  t2 = !digitalRead(T2);
  t3 = !digitalRead(T3);
  if (t1 && t2 && !t3) {
    buf[0] = 'N';
  }
  if (!t1 && !t2 && t3) {
    buf[0] = '2';
  }
  if (!t1 && t2 && t3) {
    buf[0] = '5';
  }
  ausgabe(buf);
}

void ausgabe(char * text) {
  static char vergleich[] = " ";
  if (0 != strncmp ( vergleich, text, 1 )) {
    strncpy ( vergleich, text, 1 );
    oled.firstPage();
    do {
      oled.setFont(u8g2_font_6x12_tr);
      oled.drawStr(0, 22, "Anzeige");
      oled.setFont(u8g2_font_profont29_tr);
      oled.drawStr(55, 35, text);
    } while ( oled.nextPage() );
  }
}
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 08, 2018, 06:12 pm
Hallo agmue,
Ich habe den Sketch ausprobiert, ein wenig umgeändert, so schon wie ich es mir erhofft hatte.
Leider springen die Zahlen willkürlich durcheinander und reagieren nicht auf die Taster.

Code: [Select]
#include <SPI.h>
#include <Wire.h>
#include "U8g2lib.h"

U8G2_SSD1327_EA_W128128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);

const byte T1 = 2;
const byte T2 = 3;
const byte T3 = 4;
bool t1, t2, t3;
char buf[] = "X";

void setup() {
  pinMode(T1, INPUT);
  pinMode(T2, INPUT);
  pinMode(T3, INPUT);

  u8g2.begin();

  ausgabe(buf);
}

void loop() {
  t1 = !digitalRead(T1);
  t2 = !digitalRead(T2);
  t3 = !digitalRead(T3);
  if (t1 && t2 && !t3) {
    buf[0] = 'N';
  }
  if (!t1 && !t2 && t3) {
    buf[0] = '2';
  }
  if (!t1 && t2 && t3) {
    buf[0] = '5';
  }
  ausgabe(buf);
}

void ausgabe(char * text) {
  static char vergleich[] = " ";
  if (0 != strncmp ( vergleich, text, 1 )) {
    strncpy ( vergleich, text, 1 );
    u8g2.firstPage();
    do {
      u8g2.setFont(u8g2_font_6x12_tr);
      u8g2.drawStr(0, 22, "Anzeige");
      u8g2.setFont(u8g2_font_logisoso58_tf);
      u8g2.drawStr(47, 75, text);
    } while ( u8g2.nextPage() );
  }
}
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 08, 2018, 07:46 pm
@ HotSystems
dnake für den link, doch erstens braucht man in diesem Sketch min. 3 Taster und wenn ich ihn auf mein Arduino UNO holaden möchte, sagt er mir das der Speicher zu gering ist
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 08, 2018, 08:38 pm
Spielen wir mal Jeopardy: Warum habe ich INPUT_PULLUP verwendet?
Title: Re: Anfänger, neu im Forum
Post by: HotSystems on Oct 08, 2018, 08:42 pm
@ HotSystems
dnake für den link, doch erstens braucht man in diesem Sketch min. 3 Taster und wenn ich ihn auf mein Arduino UNO holaden möchte, sagt er mir das der Speicher zu gering ist
Wenn man es richtig macht, passt der Sketch problemlos auf den Uno und noch weiteres.

Allerdings kann es bei machen Display-Libraries Probleme geben.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 08, 2018, 09:34 pm
Hi agmue,
habe es nun hin bekommen,
hatte keine Widerstände eimgebaut :smiley-yell:
jetzt funktioniert es fast genau so wie ich es haben wollte.
Aber nur fast, während eines umschalt Vorgangs, wechselt die Anzeige immer noch kurz hin und her.
kann man da mit "delay" etwas ändern?

was das INPUT_PULLUP bedeutet weiß ich leider nicht, würde mich aber sehr Interessieren.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 08, 2018, 09:40 pm
@HotSystems
gibt es da nicht eine einfachere Lösung?
ich bräuchte nur 5 Menü punkte ohne Untermenüs
welches mit einem Taster zu bedienen wäre
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 09, 2018, 01:30 pm
was das INPUT_PULLUP bedeutet weiß ich leider nicht, würde mich aber sehr Interessieren.
Das sind interne zuschaltbare PullUp-Widerstände, bei Digital Pins (https://www.arduino.cc/en/Tutorial/DigitalPins) näher beschrieben. Da ich faul bin, nehme ich immer die, nur dreht sich die Logik, gedrückt ist LOW, was ich mit einem Ausrufezeichen vor digitalRead ausgleiche.

Aber nur fast, während eines umschalt Vorgangs, wechselt die Anzeige immer noch kurz hin und her.
kann man da mit "delay" etwas ändern?
Wenn Du die Augen schließt, weil Du die Probleme der Welt nicht sehen möchtest, dann funktioniert das, wenn Du auf einer Bank sitzt. Wenn Du aber mit dem Rad fährst, kann das in der Hecke enden.

Wenn ich aber "delay" als Verzögerung zur Stabilisierung der Eingänge verstehe, realisiert mit "millis", dann ja.

@HotSystems
gibt es da nicht eine einfachere Lösung?
ich bräuchte nur 5 Menü punkte ohne Untermenüs
welches mit einem Taster zu bedienen wäre
Selber schreiben.

(https://forum.arduino.cc/index.php?action=dlattach;topic=214079.0;attach=186165)
Quelle aus dem Thema HILFE !!! Cocktailmaschine mit Arduino Uno (https://forum.arduino.cc/index.php?topic=214079.msg2988296#msg2988296).
Title: Re: Anfänger, neu im Forum
Post by: P_Extruder on Oct 09, 2018, 05:58 pm
...ich möchte es nur Schrott für Schritt lernen
Schaut bisher eher nach Schritt für Schrott aus  :smiley-twist:
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 09, 2018, 09:10 pm
 :smiley-lol:
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 12, 2018, 09:00 pm
so, mit dem Anzeigen der Zahlen funktioniert es nun schon.....
Die sache mit dem menü noch nicht.

aber nun habe ich schon wieder ein neues Problem,
möchte eine Uht mit Temperatur Anzeige haben, das 1. Problem ist das im meinem OLED SSD1327 Display
in diesem Sketch ein nur 8 pixel hoher breich angezeigt wird und ich nicht weiß warum.
2. wie bekomme ich die Temperatur in dem Sketch intigriert?

Code: [Select]
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RtcDS1307.h>
#include <RTClib.h>

RTC_DS1307 RTC;
U8G2_SSD1327_EA_W128128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);


void setup () {
  u8g2.begin();
//  Serial.begin (115200);
  Wire.begin();
}

void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
  u8g2.setCursor(24,50);
  if (now.day() < 10) { u8g2.print("0");}
  u8g2.print(now.day(), DEC);
  u8g2.print('.');
  if (now.month() < 10) { u8g2.print("0");}
  u8g2.print(now.month(), DEC);
  u8g2.print('.');
  u8g2.print(now.year(), DEC);
 
  u8g2.setFont(u8g2_font_crox2hb_tr);
  u8g2.setCursor(10,8);
  if (now.hour() < 10) { u8g2.print("0");}
  u8g2.print(now.hour(), DEC);
  u8g2.print(':');
  if (now.minute() < 10) { u8g2.print("0");}
  u8g2.print(now.minute(), DEC);
  u8g2.print(':');
  if (now.second() < 10) { u8g2.print("0");}
  u8g2.print(now.second(), DEC);

  u8g2.sendBuffer();          // transfer internal memory to the display
  delay (1000);
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 12, 2018, 09:42 pm
Du verwendest U8G2_SSD1327_EA_W128128_1_HW_I2C, was "page buffer, size = 128 bytes" bedeutet. Dann mußt Du auch seitenweise mit firstPage() und nextPage() arbeiten, siehe #38.

Alternativ kannst Du mit "full framebuffer" arbeiten, wenn Dein µC genug davon hat.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 12, 2018, 10:03 pm
Also müsste ich demnach
 u8g2.firstPage();
Nach u8g2.clearBuffer einfügen?
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 13, 2018, 12:49 am
Das reicht nicht, da muß auch noch die do/while-Schleife mit nextPage() rein.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 13, 2018, 06:59 pm
Ohje, wie füge ich die Schleife hinzu
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 13, 2018, 09:27 pm
Siehe meinen Beitrag #38. Ändere die Zeile mit meinem Display in die Zeile mit SSD1327, dann sollte es laufen. Davon ausgehend ergänzt Du die weitere Funktionalität.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 17, 2018, 06:39 pm
Ich weiß leider nicht wie ich es "umbauen" kann, es bleibt immer der schmale Streifen
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 17, 2018, 07:03 pm
Weißt Du ja doch, siehe MAX 6675 mit OLED SSD1327 128x128 (https://forum.arduino.cc/index.php?topic=574180.0)
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 17, 2018, 08:51 pm
..... aber auch der klappt nicht
Title: Re: Anfänger, neu im Forum
Post by: postmaster-ino on Oct 17, 2018, 09:10 pm
Hi

'Geht nicht' ist eine äußerst fundierte und wohl überlegte Fehlerbeschreibung.
Somit musst Du mit der Hilfe: 'Doch, bestimmt sogar' klar kommen.

MfG
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 17, 2018, 09:23 pm
Das "Umbauen", also die Sache mit den Pages, funktioniert.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 20, 2018, 09:28 am
Guten morgen zusammen,
habe den Sketch nun dem entsprechend umgebaut

Code: [Select]
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RtcDS1307.h>
#include <RTClib.h>

RTC_DS1307 RTC;

U8G2_SSD1327_EA_W128128_1_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, HW I2C with pin remapping

void setup () {
 
  //Serial.begin (115200);
  Wire.begin();
  u8g2.begin();
}

void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
  u8g2.setCursor(24,10);
  if (now.day() < 10) { u8g2.print("0");}
  u8g2.print(now.day(), DEC);
  u8g2.print('.');
  if (now.month() < 10) { u8g2.print("0");}
  u8g2.print(now.month(), DEC);
  u8g2.print('.');
  u8g2.print(now.year(), DEC);
 
  u8g2.setFont(u8g2_font_helvR24_tn);
  u8g2.setCursor(2,43);
  if (now.hour() < 10) { u8g2.print("0");}
  u8g2.print(now.hour(), DEC);
  u8g2.print(':');
  if (now.minute() < 10) { u8g2.print("0");}
  u8g2.print(now.minute(), DEC);
  u8g2.print(':');
  if (now.second() < 10) { u8g2.print("0");}
  u8g2.print(now.second(), DEC);

  u8g2.sendBuffer();          // transfer internal memory to the display
  delay (1000);
}

 
aber am Display hat sich nichts verändert.

Was ist noch falsch???
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 20, 2018, 09:55 am
Ersetze "_1_" durch "_F_", dann sollte es gehen.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 20, 2018, 10:02 am
Nun wird mir angezeigt das der Arbeitsspeicher zu wenig ist,
bedeutet das _F_ das der Speicher des UNO und nicht des Displays genutzt wird?
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 20, 2018, 11:15 am
Nun wird mir angezeigt das der Arbeitsspeicher zu wenig ist,
bedeutet das _F_ das der Speicher des UNO und nicht des Displays genutzt wird?
Der Inhalt des Displays wird erst im UNO-Speicher zusammengesetzt und dann an das Display übertragen. "_F_" steht für full, dafür reicht der UNO-Speicher offensichtlich nicht.

Daher hat Oli zwei weitere Möglichkeiten mit Teilseiten im UNO-Speicher vorgesehen, gekennzeichnet mit "_1_" und "_2_". Die Teilseiten müssen mehrfach übertragen werden, daher benötigst Du die do/while Variante.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 20, 2018, 02:13 pm
Ah, ok verstehe.
Gibt es irgendwo ein verständliches do/While tutorial? Ich habe keine Ahnung wie ich das anwenden kann
Title: Re: Anfänger, neu im Forum
Post by: combie on Oct 20, 2018, 02:20 pm
do-while loop (https://en.cppreference.com/w/cpp/language/do)
Title: Re: Anfänger, neu im Forum
Post by: agmue on Oct 20, 2018, 03:12 pm
Gibt es irgendwo ein verständliches do/While tutorial? Ich habe keine Ahnung wie ich das anwenden kann
Oli Kraus hat eine Menge geschrieben (u8g2 (https://github.com/olikraus/u8g2/wiki)), ob es für Dich verständlich ist, mußt Du selbst herausfinden.

Bei den Beispielen findest Du ein Verzeichnis full_buffer und page_buffer, nun kennst Du den Unterschied. Do/while findest Du bei page_buffer.
Title: Re: Anfänger, neu im Forum
Post by: postmaster-ino on Oct 20, 2018, 05:27 pm
Hi

Das Sparen von Speicher erkaufst Du mit x-facher Laufzeit.
Bei meinem aktuellem Sketch (Grafik-Display 128x64, U8GLIB_ST7920_128X64_4X) werden zwei Seiten übertragen (4x steht für 4-fachen Speicherverbrauch - der Sketch meckert auch schon) - das Gleiche mit 1X braucht davon nur 1/4tel an SPeicher, muß dafür aber 4 Mal die Daten häppchenweise ans Display schicken.
Der Sketch läuft in loop() wie folgt ab: (die Instanz des Display heißt hier 'u8g'
Code: [Select]

    u8g.firstPage();  //schalte auf erste Seite
    do {
      draw();  //in dieser Funktion wird die GANZE SEITE neu gezeichnet
      //Wiederhole Das solange, wie noch Seiten (Bereiche auf dem Display) verfügbar sind
      //(spart Speicher, da so nur ein x-tel der Seite im Speicher liegen muß
    } while ( u8g.nextPage() );


In der Funktion draw() wird das ganz Display gezeichnet.
Je nach gewählter Seite (firstPage() bzw. nextPage(), wobei Das so lange 'gut geht', wie Happen nötig sind um das Display voll zu bekommen) wird aber nur ein Teil des gesamten Aufbau von der Lib 'übernommen' - eben nur ein Teil-Bild.
Bei 4 Bereichen würden so
1. nur die oberen 25%
2. nur die '2.te Zeile, also 25%...50%'
3. nur die '3.te Zeile, also 50%...75%'
4. nur die unteren 25%
des Bildschirminhalt übernommen - deshalb muß man für die ganzen Pages das komplette Display neu zeichnen - was halt die x-fache Zeit kostet.

Hoffe, ich konnte Das halbwegs verständlich erklären.

MfG
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 21, 2018, 08:16 pm
Hallo, danke für dies ausführliche Erklärung,
habe den Sketch nun so verändert
Code: [Select]
#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <RtcDS1307.h>
#include <RTClib.h>

RTC_DS1307 RTC;

U8G2_SSD1327_EA_W128128_2_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); // ESP32 Thing, HW I2C with pin remapping

void setup () {
 
  //Serial.begin (115200);
  Wire.begin();
  u8g2.begin();
}

void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.firstPage();
  do {
  u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
  u8g2.setCursor(24,10);
  if (now.day() < 10) { u8g2.print("0");}
  u8g2.print(now.day(), DEC);
  u8g2.print('.');
  if (now.month() < 10) { u8g2.print("0");}
  u8g2.print(now.month(), DEC);
  u8g2.print('.');
  u8g2.print(now.year(), DEC);
  }
   while 
  (u8g2.nextPage());
  u8g2.setFont(u8g2_font_helvR24_tn);
  u8g2.setCursor(2,43);
  if (now.hour() < 10) { u8g2.print("0");}
  u8g2.print(now.hour(), DEC);
  u8g2.print(':');
  if (now.minute() < 10) { u8g2.print("0");}
  u8g2.print(now.minute(), DEC);
  u8g2.print(':');
  if (now.second() < 10) { u8g2.print("0");}
  u8g2.print(now.second(), DEC);
   }

  u8g2.sendBuffer();          // transfer internal memory to the display
  delay (1000);
}


Das Datum wird nun fast vollständig angezeigt, die Uhrzeit nur zum Teil, wen ich sie in den Bereich des Datums bringe.
Irgendwo ist immernoch der Wurm drin
Title: Re: Anfänger, neu im Forum
Post by: postmaster-ino on Oct 21, 2018, 08:36 pm
Hi

Pack Mal das
Code: [Select]
}
  while (u8g2.nextPage()); //Zeile ~36)

an das Ende von loop() - diese Page-Schleife schickt das Bild, Welches Du IN DIESER SCHLEIFE zeichnest, an das Display.
Die Änderungen außerhalb der do-while-Schleife werden nur noch die letzte page betreffen (gehe davon aus, daß die Inhalte, Die in dem Bildbereich gezeichnet werden, direkt übertragen werden - müsste man Mal austesten).

Ersetze Deine loop() Mal hier durch:
Code: [Select]
void loop () {
  DateTime now = RTC.now();
  u8g2.clearBuffer();          // clear the internal memory
  u8g2.firstPage();
  do {
    u8g2.setFont(u8g2_font_crox2hb_tr);  // choose a suitable font
    u8g2.setCursor(24, 10);
    if (now.day() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.day(), DEC);
    u8g2.print('.');
    if (now.month() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.month(), DEC);
    u8g2.print('.');
    u8g2.print(now.year(), DEC);
//hier stand das while
    u8g2.setFont(u8g2_font_helvR24_tn);
    u8g2.setCursor(2, 43);
    if (now.hour() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.hour(), DEC);
    u8g2.print(':');
    if (now.minute() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.minute(), DEC);
    u8g2.print(':');
    if (now.second() < 10) {
      u8g2.print("0");
    }
    u8g2.print(now.second(), DEC);
  } while (u8g2.nextPage());
  //u8g2.sendBuffer();          // transfer internal memory to the display - denke unnötig, da mit Pages gearbeitet wird
  delay (1000);
}


MfG

PS: Die RTC1307 ist eher ungenau, für nicht viel Mehr bekommst Du eine DS3231 - Die ist temperatur-kompensiert und soll nur wenige Sekunden IM JAHR falsch gehen.
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 21, 2018, 08:56 pm
Juhu, es klappt
Könnte ich die ds3132 einfach durch die dementsprechende Library einbinden?

Wie würde es nun laufen wenn ich noch eine Temperatur mit dem dht11 hinzu füge? Käme der Code dann auch vor das while?
Title: Re: Anfänger, neu im Forum
Post by: postmaster-ino on Oct 21, 2018, 09:39 pm
Hi

Da die Lib keine I²C-Adresse der RTC haben will, wird Sie wohl nur die 1307 bedienen können.
Somit wirst Du wohl eine andere Lib einbinden müssen.

Zumindest einen DHT22 (der 'große Bruder' des DHT11) lässt sich per Lib recht einfach einbinden.
Wert-Abfrage in der loop(), das Ergebnis dann wieder IN der While-Schleife auf das Display schreiben.

Die ersten Tests mit dem neuen Sensor sollten IMMER ein Beispiel aus der Library sein, damit man sich sicher sein kann, daß Es wirklich an einem Selbst liegt, weshalb der Kram nicht funktioniert.
Auch für die DS3231 ist Das kein falscher Weg - wenn das Beispiel funktioniert, kannst Du Das in Deinen Sketch einbauen.

MfG
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 21, 2018, 09:48 pm
Vielen Dank für deine Hilfe,
Werde es morgen mal ausprobieren.
Ich werde berichten.....
Title: Re: Anfänger, neu im Forum
Post by: Alfaone79 on Oct 24, 2018, 09:31 pm
Guten Abend zusammen,
Die DS3231 funktioniert nun auch.

Habe auch versucht den DHT11 mit einzubauen. Leider wird er auf dem Display nicht dargestellt.
Ich habe den Code vor „nextpage" eingefügt.