Forum: Mikrocontroller und Digitale Elektronik Arduino nano arbeitet ohne Display nicht.


von Käferlein (Gast)


Lesenswert?

1
#include <Wire.h>
2
#include <LiquidCrystal_I2C.h> // A4=SDA, A5=SCL https://arduinogetstarted.com/tutorials/arduino-lcd-i2c
3
LiquidCrystal_I2C lcd(0x27, 16, 2); //Brabander I2C address 0x27, 16 column and 2 rows
4
5
.
6
.
7
.
8
.
9
.
10
11
void setup() {
12
  Serial.begin(9600);
13
  lcd.begin(16, 2);
14
  lcd.init();
15
  lcd.backlight(); 
16
  lcd.setCursor(0, 0); // Stelle, Zeile
17
  lcd.print("L    M    R     ");  
18
  lcd.setCursor(0, 1); // Stelle, Zeile
19
  lcd.print("                ");
20
  plast = 0;   
21
  pinMode(resetoutpin,OUTPUT);
22
  digitalWrite(resetoutpin,HIGH);
23
  pinMode(relxpin,OUTPUT);
24
  digitalWrite(relxpin,LOW);
25
  pinMode(relypin,OUTPUT);
26
  pinMode(relzpin,OUTPUT);
27
  pinMode(boardledpin,OUTPUT);
28
  niedrig = richtwertniedrig;
29
  mittel = richtwertmittel;
30
  hoch = richtwerthoch;
31
  pinMode(inselpin,INPUT_PULLUP);
32
  pinMode(testpinniedrig,INPUT_PULLUP);
33
  pinMode(testpinmittel,INPUT_PULLUP);
34
  pinMode(testpinhoch,INPUT_PULLUP);
35
  pinMode(netzpin,INPUT_PULLUP);
36
  
37
}
38
39
void loop() {

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

von Stefan S. (chiefeinherjar)


Lesenswert?

Käferlein schrieb:
> Was kann man machen, damit er auch ohne Display arbeitet?

Den vollständigen Code, Schaltplan und Fotos vom Aufbau posten.

von H. Eggert (Gast)


Lesenswert?

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.

von Joachim B. (jar)


Lesenswert?

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?

von oszi40 (Gast)


Lesenswert?

Mal zum Test die Reihenfolge umgestellt und erst hinten das Display 
aufgerufen?

von Käferlein (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

Versuche es mal mit
1
Wire.begin();
2
Wire.setWireTimeout(3000,true);
bevor du auf das LCD zugreifst.

https://www.arduino.cc/reference/en/language/functions/communication/wire/setwiretimeout/

von EAF (Gast)


Lesenswert?

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.

von Heiner (Gast)


Lesenswert?

Mein Glückwunsch wenn Du das Problem gelöst hast 👍

von Käferlein (Gast)


Lesenswert?

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.

von Loeschbolzen (Gast)


Lesenswert?

> Die Gelegenheit, wirklich etwas zu lernen.

Die Chance haette er gehabt, wenn er sich den I2C-Kram selber
geschrieben haette. Hat er aber nicht.

von Schlaumaier (Gast)


Lesenswert?

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.

von Käferlein (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Versuche es mal mit

Kompiliert leider nicht.

exit status 1

'class TwoWire' has no member named 'setWireTimeout'
1
#include <Wire.h>
2
#include <LiquidCrystal_I2C.h> // A4=SDA, A5=SCL https://arduinogetstarted.com/tutorials/arduino-lcd-i2c
3
LiquidCrystal_I2C lcd(0x27, 16, 2); //Brabander I2C address 0x27, 16 column and 2 rows
4
.
5
.
6
.
7
.
8
void setup() {
9
  Wire.begin();
10
  Wire.setWireTimeout(3000,true);
11
  Serial.begin(9600);
12
  lcd.begin(16, 2);
13
  lcd.init();
14
  lcd.backlight(); // Beleuchtung an
15
  lcd.setCursor(0, 0); // Stelle, Zeile
16
  lcd.print("L    M    R     ");  // Solarpanel Links, Mitte, Rechts
17
  lcd.setCursor(0, 1); // Stelle, Zeile
18
  lcd.print("                ");
19
  plast = 0;   
20
  pinMode(resetoutpin,OUTPUT);
21
  digitalWrite(resetoutpin,HIGH);
22
  pinMode(relxpin,OUTPUT);
23
  digitalWrite(relxpin,LOW);
24
  pinMode(relypin,OUTPUT);
25
  pinMode(relzpin,OUTPUT);
26
  pinMode(boardledpin,OUTPUT);
27
  niedrig = richtwertniedrig;
28
  mittel = richtwertmittel;
29
  hoch = richtwerthoch;
30
  pinMode(inselpin,INPUT_PULLUP);
31
  pinMode(testpinniedrig,INPUT_PULLUP);
32
  pinMode(testpinmittel,INPUT_PULLUP);
33
  pinMode(testpinhoch,INPUT_PULLUP);
34
  pinMode(netzpin,INPUT_PULLUP);
35
  
36
}

von H. Eggert (Gast)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

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.

von Michael M. (Gast)


Lesenswert?

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ß

von Käferlein (Gast)


Lesenswert?

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.

von Michael M. (Gast)


Lesenswert?

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ß

von Andras H. (kyrk)


Lesenswert?

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.

von noiasca (Gast)


Lesenswert?

gerade die alte LiquidCrystal_I2C aus der IDE ausprobiert.

Hello World sketch kurz angepasst,
da bleibt nichts hängen, das läuft durch.
1
#include <Wire.h>
2
#include <LiquidCrystal_I2C.h>
3
4
LiquidCrystal_I2C lcd(0x27, 20, 4); // set the LCD address to 0x27 for a 16 chars and 2 line display
5
6
void setup()
7
{
8
  Serial.begin(115200);
9
  lcd.init();                      // initialize the lcd
10
  lcd.init();
11
  // Print a message to the LCD.
12
  Serial.println(F("nach init"));
13
  lcd.backlight();
14
  lcd.setCursor(3, 0);
15
  lcd.print("Hello, world!");
16
  lcd.setCursor(2, 1);
17
  lcd.print("Ywrobot Arduino!");
18
  lcd.setCursor(0, 2);
19
  lcd.print("Arduino LCM IIC 2004");
20
  lcd.setCursor(2, 3);
21
  lcd.print("Power By Ec-yuan!");
22
  Serial.println(F("ende setup"));
23
}
24
25
26
void loop()
27
{
28
}

also Käferlein, VOLLSTÄNDIGEN Sketch posten, Schaltplan posten. Dann 
kann man sich das ansehen.

von Käferlein (Gast)



Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von noiasca (Gast)


Lesenswert?

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
void setup() {
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
15
  lcd.setCursor(0, 1); // Stelle, Zeile
16
  lcd.print("                ");
17
  plast = 0; 
18
  Serial.println(F("erster Pinmode"));  
19
  pinMode(resetoutpin,OUTPUT);
20
  digitalWrite(resetoutpin,HIGH);
21
  pinMode(relxpin,OUTPUT);
22
  digitalWrite(relxpin,LOW);
23
  pinMode(relypin,OUTPUT);
24
  pinMode(relzpin,OUTPUT);
25
  pinMode(boardledpin,OUTPUT);
26
  niedrig = richtwertniedrig;
27
  mittel = richtwertmittel;
28
  hoch = richtwerthoch;
29
  pinMode(inselpin,INPUT_PULLUP);
30
  pinMode(testpinniedrig,INPUT_PULLUP);
31
  pinMode(testpinmittel,INPUT_PULLUP);
32
  pinMode(testpinhoch,INPUT_PULLUP);
33
  pinMode(netzpin,INPUT_PULLUP);
34
  Serial.println(F("Ende Setup"));
35
}

von Käferlein (Gast)


Lesenswert?

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.

von Michael M. (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Michael M. (Gast)


Lesenswert?

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ß

von Erklehr Behr (Gast)


Lesenswert?

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.

von Michael M. (Gast)


Lesenswert?

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 ?

von Käferlein (Gast)


Lesenswert?

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.

von Käferlein (Gast)


Lesenswert?

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.)

von Stefan F. (Gast)


Lesenswert?

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?

von Käferlein (Gast)


Angehängte Dateien:

Lesenswert?

Stefan ⛄ F. schrieb:
> Das ist aber mutig!

Nein nein, habe ein Oszilloskop.

Wie geschreiben, der kommt demnächst raus und wird durch die angehängte
Schaltungstopologie ersetzt Sie kommt von da:
Beitrag "Re: Buck LM25116 zu viel Drop"

von Michael M. (Gast)


Lesenswert?

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ß

von Käferlein (Gast)


Lesenswert?

Michael M. schrieb:
> im sketch_juli13b_Regent.ino oder main.ino ?

juli13b

Bei dir ist das in 200 bis 216
1
if (mv != mvvorher) {                      // Multivibratorflanken
2
    mvpuls = HIGH;
3
    strommessen();
4
    leistung();
5
    displaybeschreiben();
6
  }else {
7
    mvpuls = LOW;
8
  }
9
  mvvorher = mv;
10
  if (mvpuls == HIGH) {
11
    strommessen();
12
    leistung();
13
    displaybeschreiben();
14
  }

Ich mache da nach dem 5sek Puls alles zwei mal.
Zeitkritisch ist der nicht.

von Käferlein (Gast)


Lesenswert?

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.

von Stefan F. (Gast)


Lesenswert?

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.

von Schlaumaier (Gast)


Lesenswert?

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. ??

von Käferlein (Gast)


Lesenswert?

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.

von EAF (Gast)


Lesenswert?

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};

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.