Mir ist aufgefallen, dass der Arduino nicht arbeitet, wenn
das Display nicht angesteckt ist.
Sogar der interne Pullup geht nicht.
Was kann man machen, damit er auch ohne Display arbeitet?
nano old bootlader
Ohne LCD angeschlossen, hängt die TWI Verbindung. Um dieses Problem zu
vermeiden. muss man einen Test machen ob die TWI Verbindung
funktioniert. Dafür gibt es TWI/I2C Scanner. Wenn der Scanner das LCD
nicht findet, dürfen diese Zeilen:
lcd.begin(16, 2);
lcd.init();
nicht aufgerufen werden und auch keine weiteren LCD Anwendungsaufrufe.
Solche Scanner gibts z.B. hier:
https://create.arduino.cc/projecthub/abdularbi17/how-to-scan-i2c-address-in-arduino-eaadda
Sobald man weiß welche Adresse Dein LCD verwendet, kann man den Test auf
das LCD alleine beziehen. Auch solltest Du die LCD Lib Doku lesen ob der
LCD.init() oder LCD.Begin() Aufruf einen Wert zurück gibt den Du
ausnutzen könntest.
Käferlein schrieb:> Was kann man machen, damit er auch ohne Display arbeitet?
andere Lib nutzen die nicht vom Display lesen will oder die Lib
verbessern mit time out versehen!
Es gibt ja LIBs die busy abfragen oder sogar lesen, aber wenn kein
Display angeschlossen ist?
oszi40 schrieb:> Mal zum Test die Reihenfolge umgestellt und erst hinten das> Display> aufgerufen?
Ja habe ich versucht.
H. Eggert schrieb:> Ohne LCD angeschlossen, hängt die TWI Verbindung. Um dieses Problem zu> vermeiden. muss man einen Test machen ob die TWI Verbindung> funktioniert. Dafür gibt es TWI/I2C Scanner. Wenn der Scanner das LCD> nicht findet, dürfen diese Zeilen:>> lcd.begin(16, 2);> lcd.init();>> nicht aufgerufen werden und auch keine weiteren LCD Anwendungsaufrufe.
Damit muss ich mich dann mal in einer ruhigen Minute befassen.
Das ist hier jetzt kein Drama. In der Regel lässt man das Display
ja dran.
Ich dachte da gäbe es was in der Art I2C geht nicht --> überspringen.
Die Lib wechseln, bitte nicht. Das ist mal eine, die an Bord ist und bis
auf dieses hier, unproblematisch ist.
Käferlein schrieb:> Ich dachte da gäbe es was in der Art I2C geht nicht --> überspringen.
Tipp:
Wenn es etwas nicht gibt, dann baut man sich das!
Das nennt sich in diesem Fall: Programmieren!
Meinen Glückwunsch: Du bist auf ein Problem gestoßen.
Die Gelegenheit, wirklich etwas zu lernen.
Stefan ⛄ F. schrieb:> Versuche es mal mit ...
Habe jetzt alles (im Keller) zusammengeschraubt.
Beim nächsten Softwareupdate werde ich das probieren
und dir berichten. Danke.
Testen
Globale Boolean-Variable deklariere und dann setzen
Und die Aufrufe dann mit IF lcd_da = true then ... " alle Aufrufe
machen.
Die alternative ist, einfach die LIB zu ändern und den Parameter da
abzufragen.
Da man aber i.d.R. ein LCD-Display nicht als "Usb" benutzt, hat der
Coder (würde ich auch nicht) ein "nicht vorhanden" nicht vorgesehen.
Immerhin sind solche Teile für "fertige Geräte" gedacht.
Käferlein schrieb:> Stefan ⛄ F. schrieb:>> Versuche es mal mit>> Kompiliert leider nicht.
Die Arduino IDE installiert normalerweise mit minimalen Fehlermeldung.
Geh mal in Preferences und ändere die Einstellung dort auf "All errors"
und poste die erhaltenen Fehler und Warnungen. Das könnte wichtig sein.
>> exit status 1>> 'class TwoWire' has no member named 'setWireTimeout'
Um das Arbeits-Environment zu testen, kompilier eines der beigelegten
Lib Examples und probiere es mit Deiner HW aus um Fehler Deinerseits zu
minimieren bzw. auszuschließen. Das könnte wichtig sein. Nach
Möglichkeit verwende dasselbe Bord Package und IDE Version des Autors.
Hin und wieder wird der GCC ausgewechselt und es kann dann
Schwierigkeiten geben. Der genannte Fehler darf bei den Beispielen nicht
auftreten.
Es ist immer wichtig dasselbe Entwicklungs-Environment zu haben wie der
Original Entwickler.
H. Eggert schrieb:> Um das Arbeits-Environment zu testen, kompilier eines der beigelegten> Lib Examples und probiere es mit Deiner HW aus um Fehler Deinerseits zu> minimieren bzw. auszuschließen. Das könnte wichtig sein.
Du hast das Problem nicht verstanden.
Es ist KEIN Arduino-Fehler. !!!
Es ist ein Logik-Denkfehler des TO den die machen des Arduino nicht
vorgesehen haben. Ergo gibt es nicht wirklich ein Fehlerprotokoll.
Er teste das ganze MIT Display. Alles prima.
Dann zieht er das Display ab, und das Arduino "hängt sich auf". Was
eigentlich nicht stimmt, er wartet eigentlich auf das Display. Bloss
niemal hört / Sieht seine Klagen das keins da ist. Deshalb ist er
schlecht gelaunt und macht gar nix mehr.
Ergo ist das ganze ein "Vorhersehbarer Fehler" den man abfangen muss.
Schlaumaier schrieb:> Und die Aufrufe dann mit IF lcd_da = true then ... " alle Aufrufe> machen.
Was für ein Unfug.
Wozu willst du bei jeder dieser Abfragen die Variable lcd_da auf true
setzen.
Lass das "= true" besser weg.
Bei einem Schimmel fragt auch keiner, ob der weiss ist.
Stefan S. schrieb:> Käferlein schrieb:>> Was kann man machen, damit er auch ohne Display arbeitet?>> Den vollständigen Code, Schaltplan und Fotos vom Aufbau posten.
kannst du das noch nachliefer? Mich interessiert das auch. Arbeite viel
mit den Displays und hatte noch nie das Problem.
Gruß
Michael M. schrieb:> und hatte noch nie das Problem.
Da hast du vollkommen Recht! Danke für den Hinweis.
Ich habe es gerade bei einer anderen Anwendung probiert.
Hier ein Setup bei dem der arduino auch ohne Display arbeitet:
1
void setup() {
2
freq1.begin(5);
3
freq2.begin(6);
4
digitalWrite(resetoutpin,HIGH);
5
pinMode(resetoutpin,OUTPUT);
6
pinMode(nsanstpin, INPUT);
7
pinMode(wapin, INPUT);
8
pinMode(linienstrompin, OUTPUT);
9
pinMode(schellepin, INPUT);
10
pinMode(zenerpin,OUTPUT);
11
pinMode(ledpin, OUTPUT);
12
Serial.begin(9600);
13
lcd.init(); //initialize the lcd
14
lcd.backlight(); //open the backlight
15
16
}
Und das Setup des Codes wo es ohne Display nicht geht.
1
void setup() {
2
Serial.begin(9600);
3
lcd.begin(16, 2);
4
lcd.init();
5
lcd.backlight(); // Beleuchtung an
6
lcd.setCursor(0, 0); // Stelle, Zeile
7
lcd.print("L M R "); // Solarpanel Links, Mitte, Rechts
8
lcd.setCursor(0, 1); // Stelle, Zeile
9
lcd.print(" ");
10
plast = 0;
11
pinMode(resetoutpin,OUTPUT);
12
digitalWrite(resetoutpin,HIGH);
13
pinMode(relxpin,OUTPUT);
14
digitalWrite(relxpin,LOW);
15
pinMode(relypin,OUTPUT);
16
pinMode(relzpin,OUTPUT);
17
pinMode(boardledpin,OUTPUT);
18
niedrig = richtwertniedrig;
19
mittel = richtwertmittel;
20
hoch = richtwerthoch;
21
pinMode(inselpin,INPUT_PULLUP);
22
pinMode(testpinniedrig,INPUT_PULLUP);
23
pinMode(testpinmittel,INPUT_PULLUP);
24
pinMode(testpinhoch,INPUT_PULLUP);
25
pinMode(netzpin,INPUT_PULLUP);
26
27
}
Zwei Dinge fallen mir auf.
Die Reihenfolge, kann ich ausschließen, hatte ich schon geändert
getestet.
Und ich beschreibe das Display im Setup.
letzteres werde ich ändern und Prüfen, ob es daran liegt.
Da der Arduino meine PV-Anlage steuert, erst heute Abend.
Hi,
könntest du bitte bitte bitte den GANZEN Quellcode als xx.cpp oder
xx.ino oder xx.c posten.
Das man deine #includes und #defines und Variable definitionen sieht.
sry so bringt das leider nichts.
Käferlein schrieb:> Da der Arduino meine PV-Anlage steuert, erst heute Abend.
bitte auch Schaltplan dazu. Foto vom Aufbau ist glaub ich zu viel
verlangt .. würde aber auch helfen.
Gruß
lcd.init();
Der wertet bestimmt auf eins der PINs der ohne display nie einen
bestimmteen pegel aufwiest. Vermutlich tut es deswegen wenn du ersmal
die PINs initialisiert und dann denn lcd init machst. Andersrum nicht.
Versuche mal den code zu debuggen. Einfach die Funktionen durchsteppen
und reingucken wo es hängt. Oder einfach laufen lassen, es wird ja
hängen. Und dann pause drücken und gucken wo du stehst. Dann hast du die
Stelle.
Würde ich in ein IDE machen wo man ordentlich debuggen kann. Sonst mit
Arduino, weiss ich nicht ob das geht. Das ist ja nur zum spielen da.
Michael M. schrieb:> Hi,> könntest du bitte
anbei.
Ist aber noch nicht ganz fertig.
Der Netzfrequenzzähler, für den PV-Wechselrichterabwurf über 51,5Hz
ab Zeile 134, ist in der Mache.
Für den Inselbetrieb wird noch die Schaltung mit dem 7805
ersetzt und geändert.
Insel ist momentan mit Jumper wählbar Zeile 148.
Die void displaybeschreiben() ist ab Zeile 408.
Was mich stutzig macht ist, dass ich in dem funktionierenden
Sketch im Setup ja die Hintergrundbeleuchtung schalte.
Trotzdem geht der ohne Display.
Käferlein schrieb:> 'class TwoWire' has no member named 'setWireTimeout'
Lies die Doku, da steht weiter unten, wie es mit älteren Arduino Cores
geht, welche diese Methode noch nicht haben.
mach den init exakt so wie in den Beispielen. Das sind zwei init(). kein
.begin(). das macht der init dann eh intern.
Statte deinen Sketch mit Serial print ausgaben aus, und verfolge, wo
genau dein Programm "stehen bleibt"
das nur als idee, du wirst weiter verfolgen müssen:
1
voidsetup(){
2
Serial.begin(9600);
3
Serial.println(F("begin setup"));
4
//lcd.begin(16, 2);
5
Serial.println(F("init 1"));
6
lcd.init();
7
Serial.println(F("init 2"));
8
lcd.init();
9
Serial.println(F("backlight"));
10
lcd.backlight();// Beleuchtung an
11
Serial.println(F("setCursor"));
12
lcd.setCursor(0,0);// Stelle, Zeile
13
Serial.println(F("erstes Print"));
14
lcd.print("L M R ");// Solarpanel Links, Mitte, Rechts
noiasca schrieb:> Das sind zwei init(). kein> .begin(). das macht der init dann eh intern.
Mit dem lcd.begin(16, 2); weglassen ist ein ganz heißer Tipp.
Die zwei init() sind nicht notwendig, sonnst würde der andere
Sketch ja nicht laufen.
Käferlein schrieb:> noiasca schrieb:>> Das sind zwei init(). kein>> .begin(). das macht der init dann eh intern.
das wurde ja schon geschrieben. Den Schaltplan hab ich mir noch nicht
ageschaut. Hab dein Code mal ein bisschen ausgeräumt um den besser lesen
zu können.
evtl. isses das gewesen zu oft .ini() und .begin() auf zu rufen.
Gruß
wär aucht gut wenn du die Analogeneingänge so definierst
// Messeingänge - Aanalog
pinMode(phasedpin,INPUT);
pinMode(phaseapin,INPUT);
pinMode(phasebpin,INPUT);
pinMode(phasecpin,INPUT);
pinMode(phaselpin,INPUT);
pinMode(phaseipin,INPUT);
kannst ja noch in die ini_IO() packen.
Gruß
Käferlein schrieb:> nano-schema-pv-20220715.png
Kondensator am Ausgang des Spannungsreglers vergessen!
Schaltung nach Empfehlung des Herstellers beachten! Ein
Spannungsregler braucht auch am Ausgang einen Kondensator,
der darf nicht irgendwo als Ersatz oder Quotenelko stecken
sondern muss am Pin des Spannungsreglers positioniert werden.
Bloss kein Bauteil zuviel einbauen, könnte ja zu teuer werden.
zum Schaltplan.
Beim Spannungsregler wird empfohlen 0.33µF Input/GND und 0.1µF
Output/GND so nah wie möglich zu platzieren.
https://www.sparkfun.com/datasheets/Components/LM7805.pdf
Q1 soll bestimmt Verpolungsschutz sein? nach einem
Brückengleichrichter??
Der R? 12K zwischen ~ und GND. Why ?
Erklehr Behr schrieb:> Kondensator am Ausgang des Spannungsreglers vergessen!
Sitzt auf dem nanoboard. Entfernung kurz genug, siehe Foto.
Der 78 Regler kommt demnächst raus und wird durch eine
diskrete Schaltung ersetzt. Drei Transistoren+TL431.
Ist dann low drop und einstellbar strombegrenzt.
Michael M. schrieb:> wär aucht gut wenn du die Analogeneingänge so definierst
OM DK2JK schreibt im Arduino Programmierhandbuch, dass man
das bei Analogeingängen nicht tun muss.
Das mit #define ist mir auch völlig fremd. ???
Was gefällt dir an meinem "Fünf-Sekunden-Schalter" nicht?
Interrupt? Flag? Keine Ahnung von. Brauche ich das?
Ich bekomme in Zeile 165 alle 5 Sekunden einen Impuls, der
einen Loop durchlauf lang ist. Mehr brauche ich nicht.
Ja, die Zeilen 164-166 werde ich löschen, weil doppeltgemoppelt
mit 173-177.
Michael M. schrieb:> Der R? 12K zwischen ~ und GND. Why ?
Ist nicht vorhanden, weil Pullup programmiert.
Michael M. schrieb:> Q1 soll bestimmt Verpolungsschutz sein? nach einem> Brückengleichrichter??
Nein. Der begrenzt den Rückstrom, wenn der Ladekondensator
leer ist und man USB reinsteckt.
(Ich habe mit so den Regler auf dem Nanoboard gekillt.
Beim Nano fehlt übrigens die Diode über dem Regler.)
Käferlein schrieb:>> Kondensator am Ausgang des Spannungsreglers vergessen!> Sitzt auf dem nanoboard.
Das ist aber mutig! Ist dir bekannt, dass diese Regler ohne richtigen
Kondensator an der richtigen Stelle ganz heftig schwingen können und
dabei nicht selten die volle Eingangsspannung durch reichen?
Käferlein schrieb:> Was gefällt dir an meinem "Fünf-Sekunden-Schalter" nicht?> Interrupt? Flag? Keine Ahnung von. Brauche ich das?> Ich bekomme in Zeile 165 alle 5 Sekunden einen Impuls, der> einen Loop durchlauf lang ist. Mehr brauche ich nicht.
geht auch so keine Frage.
Ist nur eine andere Method, die deine Main sauberer hält und genauer
ist. Bei dir bekommst du ~alle 5 Sekunden ein Impuls, halt wenn dein
Code genau passend ander Stelle ist ..sonst 5Sek + loop durchlauf.
Evtl. ist das für das Projekt nicht so entscheident aber evtl. für
andere Zeitkritische, so haste schonmal davon gehört.
Käferlein schrieb:> OM DK2JK schreibt im Arduino Programmierhandbuch, dass man> das bei Analogeingängen nicht tun muss.
schadet ja nicht wegen vollständigkeitshalber. so ist alles klar
definiert.
Käferlein schrieb:> Das mit #define ist mir auch völlig fremd. ???
kannst dir vorstellen wie mit "const" deklarierte Variablen.
Hilft der übersicht und die werden an anderen Ort gespeichert.
Käferlein schrieb:> Nein. Der begrenzt den Rückstrom, wenn der Ladekondensator> leer ist und man USB reinsteckt.
ah okay :)
Käferlein schrieb:> Ja, die Zeilen 164-166 werde ich löschen, weil doppeltgemoppelt> mit 173-177.
im sketch_juli13b_Regent.ino oder main.ino ?
Will auch nicht auf Teufel komm raus was kretisieren, nur die Sachen
sind aufgefallen ;)
Gruß
Michael M. schrieb:> kannst dir vorstellen wie mit "const" deklarierte Variablen.> Hilft der übersicht und die werden an anderen Ort gespeichert.https://www.arduino.cc/reference/de/language/structure/further-syntax/define/
Hm, da lasse ich mal besser die Finger von:
>> Dies kann jedoch einige unerwünschte Nebenwirkungen haben,>> wenn zum Beispiel ein konstanter Name, der #defined wurde,>> in einer anderen Konstanten- oder Variablenname enthalten ist.>> In diesem Fall würde der Text durch die #definierte Nummer>> (oder den Text) ersetzt.
Käferlein schrieb:> Hm, da lasse ich mal besser die Finger von: ...
Das ist eher der gewollte Effekt von #define und betrifft nicht
konstante Variablen ebenso.
Käferlein schrieb:> Angehängte Dateien:> sketch_juli13b_Regent.ino (11,9 KB)> | Codeansicht
Hübsche Gehäuse.
Darf ich fragen wo du das her hast.?? Und wie teuer. ??
Schlaumaier schrieb:> Darf ich fragen wo du das her hast.?? Und wie teuer. ??
Vor längerer Zeit bei RS gekauft. Habe zum Glück noch welche.
Ist ein Takachi TWN13-5-13W
Breite=125mm Höhe=45mm Tiefe=125mm
Käferlein schrieb:> noiasca schrieb:>> Das sind zwei init(). kein>> .begin(). das macht der init dann eh intern.>> Mit dem lcd.begin(16, 2); weglassen ist ein ganz heißer Tipp.
Ja, lcd.begin war die Ursache.
Danke Euch für die Hilfe und die Tipps. Sketch läuft.
Käferlein schrieb:> Hm, da lasse ich mal besser die Finger von:
Arduino C++ für den Anwender und in vielen Libs
Der Arduino Core ist zum großen Teil C und C++ mit einem Stratz
Assembler.
In C++ gibt es nur noch wenig Einsatz für den Präprozessor
#define laempi 13
kann durch
constexpr byte laempi {13};
ersetzt werden.
Hat den Vorteil, dass es erschrocken aufschreit, wenn man folgende
Dummheit probiert:
constexpr byte laempi {13.33};
---
const byte laempi {13};
Kann zwar meist automatisch weg optimiert werden, ist aber nicht
garantiert. Auch ist const da nur ein readonly Attribut, was durchaus
auch (aus Versehen?) Umgangen werden kann.
Optimierung abschalten, bringt solche Böcke dann ans Licht.
volatile const byte laempi {13};