Morgen zusammen , Morge @Rentner .
Hab in den letzten zwei drei Tage vesucht den oberen code mit den 3 Button Menue auf Basis der OneButton Lib in mein Foederband Projekt einzubinden haber irgenwie gelingt es mir nicht so ganz. Ich stosse immer wieder auf unterschiedliche Problemen wegen meinen geringen C++ Kentnisse.
Den oberen Code ab ich schon auf mein 128x32 anpepasst, so das halles lesbar ist und so das man zwischen den verschiedenen menu wandern kann. Folgt der angepasster Code fuer mein Dispaly.
#include <EEPROM.h>
#include <OneButton.h>
#include <SPI.h>
#include <Wire.h>//This library allows you to communicate with I2C / TWI devices
#include <Adafruit_SSD1306.h>//This is a library for our Monochrome OLEDs based on SSD1306 drivers
#define SCREEN_WIDTH 128// OLED display width, in pixels
#define SCREEN_HEIGHT 32// OLED display height, in pixels
#define display_RESET -1
// Definition der Texte legt die Anzahl fest
const char*Vartext[] {"Zyklen:", "W.Zeit_1:", "W.Zeit_2:",
"W.Zeit_3:", "W.Zeit_4:"
};
// Anzahl berechnen
const byte maxAnz = sizeof(Vartext) / sizeof(Vartext[0]);
unsigned long mindata[maxAnz] {0, 0, 0, 0, 0}; // Anzahl beachten
unsigned long maxdata[maxAnz] {80000, 200, 300, 500, 1000};
uint32_t longstart;
byte Varindex;
byte Seite = 0;
bool eingabe; // Modus Eingabe der Werte
bool changed; // displaylay geändert neu schreiben
bool datachanged ;// Daten wurden geändert -> auf Epprom
// Daten in Struct um sie auf EEprom zu speichern
struct mydaten {
long VarData[maxAnz];
} daten;
// Pins festlegen
const byte upPin = 6; // Select Button
const byte downPin = 7; // Plus Button
const byte selectPin = 8; // Minus Button
// Instanzen
OneButton Btnsel(selectPin, true);
OneButton Btnup(upPin, true);
OneButton Btndown(downPin, true);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, display_RESET);
//-------------------------------------------------
void setup() {
// Setup-Code hier eingeben, um ihn einmal auszuführen:
Serial.begin(9600);
EEPROM.get(0, daten); // Daten aus Eprom lesen
for (byte i = 0; i < maxAnz; i++) {
checkminmax();
}
changed = true;
//button Ereignisse festlegen
Btnsel.attachClick(selClick);
Btnsel.attachDoubleClick(selDblClick);
Btnup.attachClick(plusClick);
Btnup.attachDuringLongPress(plusDurPress);
Btnup.attachLongPressStart(LongStart);
Btndown.attachClick(minusClick);
Btndown.attachDuringLongPress(minusDurPress);
Btndown.attachLongPressStart(LongStart);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay(); // Begrüßung
display.setTextWrap(false);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0); display.print(F("3-Button"));
display.setCursor(10, 20); display.print(F("Menue"));
display.setTextSize(1);
display.display();
delay(2000);
}
//-------------------------------------------------
void loop() {
//Hier den Hauptcode eingeben, um ihn wiederholt auszuführen:
Btnsel.tick();
Btnup.tick();
Btndown.tick();
if (eingabe)AnzeigeEingabe();
else Anzeige(Seite);
}
// ------one Button Ereignisse auswerten-------
//-------------------------------------------------
void selClick() {
changed = true;
if (eingabe) { // Variable wechseln
Varindex++;
if (Varindex >= maxAnz) Varindex = 0;
}
else { // Seite wechseln
Seite++;
if (Seite >= 4) Seite = 0;
}
}
//-------------------------------------------------
void selDblClick() {
if (eingabe) saveEEprom(); // Eingabe ist beendet
eingabe = !eingabe; // toggle Mode
changed = true;
#ifdef debug
for (byte i = 0; i < maxAnz; i++)
#endif
}
//-------------------------------------------------
void plusClick() {
click(1);
}
void minusClick() {
click(-1);
}
void plusDurPress() {
longclick(1);
}
void minusDurPress() {
longclick(-1);
}
void LongStart() {
longstart = millis();
}
//-------------------------------------------------
void click(int inc) {
if (eingabe) {
changed = true;
datachanged = true;
daten.VarData[Varindex] += inc;
checkminmax();
Serausgabe();
}
}
//-------------------------------------------------
void longclick(int richtung) {
static uint32_t altzeit;
int inc = 100;
if (millis() - longstart > 3000) inc = 500;
if (millis() - altzeit >= 100 && eingabe) {
altzeit = millis();
changed = true;
datachanged = true;
daten.VarData[Varindex] += inc * richtung;
checkminmax();
Serausgabe();
}
}
//-------------------------------------------------
void Serausgabe() {
#ifdef debug
Serial.print(Vartext[Varindex]);
Serial.print ("\t"); Serial.println(daten.VarData[Varindex]);
#endif
}
//-------------------------------------------------
void checkminmax() {
if (daten.VarData[Varindex] < mindata[Varindex]) {
daten.VarData[Varindex] = mindata[Varindex];
}
if (daten.VarData[Varindex] > maxdata[Varindex]) {
daten.VarData[Varindex] = maxdata[Varindex];
}
}
//-------------------------------------------------
void AnzeigeEingabe() { // Anzeige bei Eingabe
if (changed ) {
changed = false;
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0); display.print("(EINGABE)");
display.setTextSize(1);
display.setCursor(2, 20); display.print(Vartext[Varindex]);
display.setTextSize(2);
display.setCursor(60, 12); display.print(daten.VarData[Varindex]);
display.display();
}
}
//-------------------------------------------------
void Anzeige(byte seite) { // Anzeige Seiten
if (changed) { // wenn sich werte geändert haben
changed = false;
display.clearDisplay();
if (seite == 0) { // Anzeige Liste der Werte
for (byte i = 0; i < maxAnz; i++) {
display.setTextSize(1);
display.setCursor(0, 0);
display.print(Vartext[0]);
display.setTextSize(2);
display.setCursor(35, 10 );
display.print(daten.VarData[0]);
}
}
else if (seite == 1) { // Beliebige Werte
display.setTextSize(1);
display.setCursor(0, 0); display.print("Start");
}
else if (seite == 2) { // Beliebige Werte
display.setTextSize(1);
display.setCursor(0, 0); display.print("Stop");
}
else if (seite == 3) { // Beliebige Werte
display.setTextSize(1);
display.setCursor(0, 0); display.print("Info");
}
display.display();
}
}
//-------------------------------------------------
void saveEEprom() {
if (datachanged) {
datachanged = false;
#ifdef debug
Serial.println("Save in EEprom");
#endif
EEPROM.put(0, daten);
}
}
Wie gesagt, dah ich es nicht inkriege den Code in mein Projekt einzubenden wegen meinen geringen C++ Kentnissen, habe ich versucht selber ein Menu fuers Display zu erstellen . Wo ich eine Zyklenzahl am Display ablesen kann , die gewunschte Zyklenzahl mit buttons verhandern und zuruckstellen kann. Folgender Code ist dabei rausgekommen und der Arbeitet bei mir. Folgt Code.
#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define LOGO_HEIGHT 16
#define LOGO_WIDTH 100
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
#define sensorleft 2
#define sensorright 3
#define startbutton 4
#define stopbutton 5
#define upbutton 6
#define downbutton 7
#define selectbutton 8
const byte relaisLinks = 11;
const byte relaisRechts = 12;
enum {relaisAn, relaisAus};
enum {warten, on, rechts, haltrechts, links, haltlinks, off, zyklusstoppen, stoppen};
enum {hauptmenu, maxmenu};
byte schrittmenu = hauptmenu;
byte schritt = warten;
byte zyklus = 0;
//void Setup
void setup() {
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3C for 128x62
Serial.println(F("SSD1306 allocation failed"));
for (;;); // Don't proceed, loop forever
}
Serial.begin(9600);
pinMode(sensorleft, INPUT_PULLUP);
pinMode(sensorright, INPUT_PULLUP);
pinMode(startbutton, INPUT_PULLUP);
pinMode(stopbutton, INPUT_PULLUP);
pinMode(upbutton, INPUT_PULLUP);
pinMode(downbutton, INPUT_PULLUP);
pinMode(selectbutton, INPUT_PULLUP);
pinMode(relaisLinks, OUTPUT);
digitalWrite(relaisLinks, relaisAus);
pinMode(relaisRechts, OUTPUT);
digitalWrite(relaisRechts, relaisAus);
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
}
int mehr = 0;
int weniger = 0;
int mehrState = 0;
int wenigerState = 0;
int lastmehrState = 0;
int lastwenigerState = 0;
unsigned long maxzyklus = 40000;
//Void loop
void loop() {
oledzyklenUpDown();
schrittkette();
}
//Oled Menu Anzeige
void oledzyklenUpDown(){
switch (schrittmenu) {
case hauptmenu:
if (zyklus < maxzyklus) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println("Zyklen");
display.println(maxzyklus);
display.println(zyklus);
display.display();
}
zyklenUpDown();
schrittmenu = maxmenu;
break;
case maxmenu:
if (zyklus == maxzyklus) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(15, 0);
display.print(F(":::Maxzyklus:::"));
display.setCursor(0, 10);
display.println(maxzyklus);
display.setCursor(0, 20);
display.println(F("Reset = EnterButton"));
display.display();
}
reset();
schrittmenu = hauptmenu;
break;
}
}
//Zyklenzähler auf Null stellen
void reset() {
int selectPin = digitalRead(selectbutton);
if (selectPin == LOW) {
zyklus = 0;
}
}
//Zyklenzahl verhändern
void zyklenUpDown() {
int upPin = digitalRead(upbutton);
int downPin = digitalRead(downbutton);
mehrState = (upPin == LOW);
if (mehrState != lastmehrState) {
if (mehrState == LOW) {
maxzyklus += 1;
}
}
lastmehrState = mehrState;
wenigerState = (downPin == LOW);
if (wenigerState != lastwenigerState) {
if (wenigerState == LOW) {
maxzyklus -= 1;
}
}
lastwenigerState = wenigerState;
}
//Foederband Schritkette
void schrittkette() {
int startPin = digitalRead(startbutton);
int stopPin = digitalRead(stopbutton);
int sensorLinksEnd = digitalRead(sensorleft);
int sensorRechtsEnd = digitalRead(sensorright);
static unsigned long lastmillis;
const unsigned long pauseZeit = 2000; // in ms
if (stopPin == LOW )
{
schritt = off;
}
switch (schritt)
{
case warten: //Überwachung von Anlage Warten
if (startPin == LOW )
{
schritt = on;
}
anhalten();
break;
case on: //Überwachung von Anlage An
digitalWrite(LED_BUILTIN, HIGH);
schritt = rechts;
break;
case rechts: //Überwachung von Rechtslauf
nachrechts();
if (sensorRechtsEnd == LOW )
{
schritt = haltrechts;
lastmillis = millis();
}
break;
case haltrechts: //Überwachung von Haltrechts
anhalten();
if (millis() - lastmillis > pauseZeit)
{
schritt = links;
}
break;
case links: //Überwachung von Linkslauf
nachlinks();
if (sensorLinksEnd == LOW )
{
schritt = haltlinks;
lastmillis = millis();
}
break;
case haltlinks: //Überwachung von Haltlinks
anhalten();
if (millis() - lastmillis > pauseZeit)
{
if (zyklus == maxzyklus)
{
schritt = zyklusstoppen;
}
else
{
zyklus++;
schritt = rechts;
}
}
break;
case off: // Anlage ausgeschaltet
digitalWrite(LED_BUILTIN, LOW);
schritt = warten;
break;
case zyklusstoppen: // Überwachung von Maximun Zyklen
anhalten();{
if (zyklus == 0) {
schritt = rechts;
}
else
{
schritt = off;
}
}
break;
}
}
//Motoren Anhalten
void anhalten() {
digitalWrite(relaisRechts, relaisAus);
digitalWrite(relaisLinks, relaisAus);
}
//Motoren Links laufend
void nachlinks() {
digitalWrite(relaisRechts, relaisAus);
digitalWrite(relaisLinks, relaisAn);
}
//Motoren Rechts laufend
void nachrechts() {
digitalWrite(relaisLinks, relaisAus);
digitalWrite(relaisRechts, relaisAn);
}
Haber ich wurde gerne auf den Code vom @Rentner aufbauen so das die one Button Lib und das abspeichern auf der Eeprom erfolgt.
Kann mir jemand dabei helfen.
Danke in vorraus