Fehlerhaftes Gerät?

Hallo,

ich habe eine Frage ich verwende ein arduino elegoo super sowie teilweise arduino nanos.

Jetzt habe ich schon relativ lange folgendes Problem. Die Geräte führen die Codes die ich uploade richtig aus. Lade ich den Code ein zweites mal drauf funktioniert es nicht mehr richtig. Es werden teilweise if statements übergangen oder auch z.b. eine Distance völlig falsch gemessen.

Das passiert mir bei zwei Geräten ich dachte jetzt zuerst an Hardware defekt, aber komischerweise geht ein anderes Gerät immer welches an einem Raspberry angeschlossen ist. Wenn ich die Nanos aber austausche, das selbe Problem.

Das seltsame ist, dass die Geräte teilweise den Code wieder richtig ausführen ohne, dass ich den Code veränder.

Jetzt dacht ich den EEPROM eventuel komplett zu löschen? Was kann es sein?

Hallo,

viel String Objekt Verarbeitung drin ? Da können die dollsten Sachen passieeren.

In Deinem geheimen Sketch ist wohl die Zeile 42 falsch.

Setze Deinen Sketch bitte in Codetags (</>-Button oben links im Forumseditor) hier ein.

Gruß Tommy

Was hat das EEPROM mit dem Sketch zu tun?
Grüße Uwe

Ich vermute, du hast ein Spannungsproblem und der Spannungsregler auf dem Board wird zu heiß.

Da der TO orginale und nachgebaute Platinen nicht unterscheidet (elegoo produziert keine Platinen die den Namen "Arduino" führen dürfen) können die NANOs auch solche der untersten Preiskategorie sein, bei denen man wegen des Preises schwere Zweifel bezüglich der Qualität der verwendeten Bauteile hat.
Ohne genaue Infos können wir nur im Nebel herumstochern.
Grüße Uwe

Vielen dank für die Antworten. Es handelt sich um Boards der unteren Preiskategorie.

Es ist nur so, dass speziell codes wo etwas aktiv gemacht wird z.b. einen Pin HIGH schreiben, dieser dann nur zu 15% HIGH geschrieben wird. Das seltsame ist dass sie manchmal doch wieder ganz normal HIGH schreiben.

Ein String befindet sich nicht im Code. Mein Code enthält ganz viel Text ist aber im Grunde ganz simple.
Ich habe einfach 2 Varianten eine mit einer Boolean und eine ohne. Kann man ein Arduino auch häcken so dass 2 codes auf einem board gespeichert sind also auf dem EEPROM?

// Add libraries
  #include <SPI.h>
  #include <Wire.h>
  #include "RTClib.h"
  #include <Adafruit_GFX.h>
  #include <Adafruit_SSD1306.h>
  #include <Adafruit_Sensor.h>
  #include "DHT.h" //DHT Bibliothek laden
//
// setup OLED display
  #define OLED_RESET 4
  Adafruit_SSD1306 display(OLED_RESET);
  #if (SSD1306_LCDHEIGHT != 64)
  #endif
//
  #define DHTPIN            6  
  #define DHTTYPE           DHT11
  DHT dht(DHTPIN, DHTTYPE);
const int buttonPin = 3;
int buttonState = 0;   
// Setup RTC
  RTC_DS1307 RTC;
  char monthString[37]= {"JanFebMarAprMayJunJulAugSepOctNovDec"};
  int  monthIndex[122] ={0,3,6,9,12,15,18,21,24,27,30,33};
//
//TMP36 Pin Variables
  boolean useTMP36 = true;  // set this to false if you don not use TMP36
//boolean useTMP36 = false;
  #define aref_voltage 3.3 // we tie 3.3V to ARef and measure it with a multimeter!
  int tempPin = 1; //the analog pin that the TMP36's Vout (sense) pin is connected to
//the resolution is 10 mV / degree centigrade with a
//500 mV offset to allow for negative temperatures
  int tempReading; // the analog reading from the sensor
//
#define trigPin 12
#define echoPin 11
int aktivpin = 7;
int sensorPin = 0;     // Connect sensor to a0
int sensorReading;
//
void setup() {
  Serial.begin(9600);
  // If you want to set the aref to something other than 5v
  dht.begin();
  analogReference(EXTERNAL);
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  // Use I2C Scanner to check the address, if necessary change the 0x3C in the line below
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x64)
  // init done
  // set font size
  display.setTextSize(1);  // small font size
  display.setTextColor(WHITE);
  display.clearDisplay();
  pinMode(buttonPin, INPUT);
  //
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(aktivpin, OUTPUT);
  pinMode(sensorPin, INPUT);
}
void loop() {

  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH)
  {
  display.ssd1306_command(SSD1306_SETCONTRAST);
  display.ssd1306_command(150); // Where c is a value from 0 to 255 (sets contrast e.g. brightness)
 //***** RTC **********
  DateTime now = RTC.now();
  display.setCursor(10,24);  
  display.print(now.day(), DEC);
  display.print('/');
  for (int i=0; i<=2; i++){
    display.print(monthString[monthIndex[now.month()-1]+i]);
  }
  display.print('/');
  display.print(now.year(), DEC);   
 // ********************* 

  //
  // display time in digital format
  display.setCursor(10,2); 
  display.print(now.hour(), DEC);
  printDigits(now.minute());
  printDigits(now.second());

  display.setCursor(10,10); 
  float Temperatur = dht.readTemperature();
  display.println(Temperatur);
  display.setCursor(36,10);
  display.print(" *C");

  display.setCursor(10,17); 
  float Luftfeuchtigkeit = dht.readHumidity();
  display.println(Luftfeuchtigkeit);
  display.setCursor(36,17); 
  display.print("%");

  display.setCursor(50,17);
  sensorReading = analogRead(sensorPin); 
  display.println(sensorReading);
  display.setCursor(76,17); 
  display.print("L"); 
 
  // update display with all data
  display.display();
  delay(100);
  display.clearDisplay();
}
else
{
  Serial.print("aa");
  display.ssd1306_command(SSD1306_SETCONTRAST);
  display.ssd1306_command(0); // Where c is a value from 0 to 255 (sets contrast e.g. brightness)
  pump();
}
}

// **************** End Main Loop *****************

void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0
  display.print(":");
  if(digits < 10)
    display.print('0');
    display.print(digits);
  }
void pump() {
  long duration, distance;
  digitalWrite(trigPin, LOW);  // Added this line
  delayMicroseconds(2); // Added this line
  digitalWrite(trigPin, HIGH);
//  delayMicroseconds(1000); - Removed this line
  delayMicroseconds(10); // Added this line
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  if (distance < 15) {  // This is where the LED On/Off happens
  digitalWrite(aktivpin, HIGH);
  delay(1000);
  digitalWrite(aktivpin, LOW);
  }
  else
  {
    Serial.print(distance);
    Serial.println(" cm");
  delay(1000);
}
}

dieser Code hatte mal ne zeit funktioniert

andi_86x:
Vielen dank für die Antworten. Es handelt sich um Boards der unteren Preiskategorie.

Es ist nur so, dass speziell codes wo etwas aktiv gemacht wird z.b. einen Pin HIGH schreiben, dieser dann nur zu 15% HIGH geschrieben wird. Das seltsame ist dass sie manchmal doch wieder ganz normal HIGH schreiben.

Ein String befindet sich nicht im Code. Mein Code enthält ganz viel Text ist aber im Grunde ganz simple.
Ich habe einfach 2 Varianten eine mit einer Boolean und eine ohne. Kann man ein Arduino auch häcken so dass 2 codes auf einem board gespeichert sind also auf dem EEPROM?
.....
dieser Code hatte mal ne zeit funktioniert

Und um welche Pins handelt es sich da genau ?

Unübersichtlicher geht es mit dem Sketch kaum.

Es fehlt jetzt noch ein Schaltbild, wie du deinen "Billig-Clone" verdrahtet hast.

Pin 11 und 12 werden schon von SPI genutzt.

Ist mir gar nicht aufgefallen. Ich weiß gar nicht genau was spi ist. Ich habe diese ganzen libraries einfach übernommen und der code war dadurch total unübersichtlich.

Ich musste den Pin 11 und 12 für den distance sensor verwenden.

Das ganze ist ein Bewässerungssystem, bei dem ein Wasserstand gemessen wird und je nach Verdunstung einfach ein Behälter nachgefüllt wird, welcher dann überläuft und dann in ein Multischlauchsystem läuft und bewässert.

Noch eine andere Frage das Programm geht in die pump Funktion und danach wieder in den Anfang loop. Bzw. nur wenn nicht der Knopf gedrückt wird. Wird die Pump Funktion doppelt und dreifach ausgeführt?

Ich hatte noch eine Version mit einer Flagge gemacht, da ich anfangs dachte hier ist ein Problem

andi_86x:
Ich musste den Pin 11 und 12 für den distance sensor verwenden.

Das musst du nicht, du kannst auch andere, freie digitale Pins verwenden.

Ich habe diese ganzen libraries einfach übernommen und der code war dadurch total unübersichtlich.

Ich würde sagen...
Es wäre schon ganz gut, wenn du verstehen würdest, was du da tust......

Klares Denken, und sorgfältige Arbeit, macht auch die Programme übersichtlich!
:smiling_imp: :smiling_imp:

Ich weiß gar nicht genau was spi ist.

Könntest du herausfinden....
Nutzt du es denn überhaupt?
Wenn nein, nimm die Lib raus, dann sind die Pins frei.

Also ich verstehe sehr genau was ich tue.
Nur ich hab weiterhin das Problem dass der Distance Sensor einfach völlig flasche Werte liefert. Ich habe jetzt die Pins einfach mal anders Belegt aber es werden weiterhin einfach total falsche Werte abgebildet.

Also ist jetzt die Library fehlerhaft oder ist es doch möglich das Arduino so zu häcken, dass ich hier solche Werte bekomme? Ich habe leider auch in anderen Programmen völlige Aussetzer. Also einfache Formeln werden einfach mal ganz anders ausgerechnet.

Trotzdem vielen dank für die Antworten.

Hi

Beispiele?
Welcher Sketch macht nachweisbar 'Was völlig Anderes', als der Code vorgibt?
Auf Dein 'Ist aber so' kommt halt von mir ein 'bei mir aber nicht' - beiden Seiten ist damit nicht geholfen, die Zeit hätten wir uns auch gleich sparen können.

Bei 'total falschen Werten' denke ich an einen Variablen-Überlauf, wo halt eben Informationen verloren gehen.

Mir wäre ein - zum Nachbauen möglichst einfach gestricktes Beispiel - von Interesse, Das bei Dir fehlerhaft läuft/falsche Werte liefert mit Erklärung/Kommentaren, was Du eigentlich wie erwartest - vll. ist hier schon 'der Hund begraben', daß Du einem logischem Fehler hinterher rennst, Den es nur in Deinem Kopf gibt.
Je weniger Hardware dabei benötigt wird, desto kleiner die die Nachbau-Schwelle - beim Reduzieren des Code (z.B. statt LCD nur Ausgabe im Terminal) könnte der Fehler schon verschwinden - Du also ein Problem im Zusammenspiel diverser Libs haben könntest (Timer mehrfach benutzt oder was).

MfG

Da du dir den in Post #6 gezeigten Sketch ohne ihn zu verstehen, zusammenkopiert hast, solltest du einfach mal von vorn anfangen und einen Beispielsketch aus der Library zum Ultraschall-Sensor verwenden.

Du solltest erstmal davon ausgehen, dass es nicht an der Library liegt, sondern an deinem fehlerhaften Sketch.
Also von vorn anfangen und daraus lernen.

Also ich verstehe sehr genau was ich tue.

Was man schon daran erkennen kann:

ich weiß gar nicht genau was spi ist.

:smiling_imp: :smiling_imp:

Und hier dran, natürlich auch:

Ich habe leider auch in anderen Programmen völlige Aussetzer. Also einfache Formeln werden einfach mal ganz anders ausgerechnet

Ich ziehe daraus den logischen Schluss, dass du da was falsch machst, aber leider keine Ahnung hast, was das sein könnte.

Das ist nicht schlimm.
Alles das kann man lernen.
Und wir helfen dir auch gerne dabei.

Aber gegen deine inneren Widerstände werde ich nicht ankämpfen.
Das überlasse ich dir.
Das ist deine Baustelle.

Seht ihr einen Fehler in dem Sketch ich nicht. Naja ich habe einfach mal einfach nur ein Distance Sensor Programm ablaufen lassen. Hier gab es falsche Werte und manchmal nicht? Vielleicht sollte ich nochmal in irgendeiner standart Library suchen.

Was ist das eigentlich genau Variablen Überlauf?

Ich habe nochmal etwas nachgeforscht also der I²C Bus wird von der rtc clock genutzt.
Die Archtiektur des Atmel AVR lautet :

32 größtenteils gleichwertige Register
davon 1–3 16-bit-Zeigerregister (paarweise)
ca. 110 Befehle, die meist 1–2 Taktzyklen dauern
Taktfrequenz bis 32 MHz
Betriebsspannung von 1,8 – 5,5 V
Speicher
1–256 kB Flash-ROM
0–4 kB EEPROM
0–16 kB RAM
Peripherie: AD-Wandler 10 bit, 8- und 16-Bit-Timer mit PWM, SPI, I²C (TWI), UART, Analog-Komparator, Watchdog
64kB Externer SRAM (ATmega128, ATmega64, ATmega8515/162); (Bei den XMEGAs bis zu 16 MB (128 Mbit) externer SDRAM)
JTAG bei den größeren ATmegas
debugWire bei den neueren AVRs

0-4kB EEPROM

Der EEPROM ist doch dieser kleine CHIP? Auf diesem werden doch die Sketches als Hex-Datei draufgeschrieben?

Was ich eigentlich nicht versteh ist :

SPI EEPROM? ich hatte es einfach reinkopiert

Wie würde eine einfaches LED an aus als Hex datei aussehen?

Der EEPROM ist doch dieser kleine CHIP?

Du hast ein, im µC, eingebautes EEPROM!
Weder SPI noch I2C.

Und evtl ein EEPROM mit auf dem RTC Board.
Dieses ist dann ein I2C EEPROM

Auf diesem werden doch die Sketches als Hex-Datei draufgeschrieben?

Auch dieses nicht.
Die Programme landen im Flash.

Offensichtlich hast du 4 verschiedene Speicher:
EEPROM extern
EEPROM intern
Flash intern
RAM intern

Das Datenblatt zum jeweiligen Baustein gibt genauere Auskunft, über Größe und Ansprechmethode.

Was ist das eigentlich genau Variablen Überlauf?

Wenn du versuchst größere Werte in eine Variable zu stopfen, als rein passt.

// Beispiel fuer einen Variablen Ueberlauf

void setup()
{
  Serial.begin(9600);
  byte testVariable = 250;
  Serial.println(testVariable);
  testVariable += 6; 
  Serial.println(testVariable);
}

void loop(){}

Haben sie vielleicht ein Erklärung wie ich mein Arduino bzw. die Software zum ausführen Sketches von hacks befreien kann. Weil bei mir funktionieren die einfachsten sketches nicht . Zum Beispiel einfach pin HIGH und wieder LOW schreiben . Sie funktionieren und dann beim zweiten mal hoch laden oder während ein Gerät an ist funktionieren sie nicht mehr.

Software neu installieren oder wie kann man sowas rausfinden . Es ist als ob sich der Pinout einfach mal im Hintergrund dreht?

Kann man die ganzen Geräte auch mit einer anderen Software nutzen?

Haben sie vielleicht ein Erklärung wie ich mein Arduino bzw. die Software zum ausführen Sketches von hacks befreien kann.

Leider nicht!
Denn dummer weise reichen meine telepathischen Fähigkeiten nicht bis bei dir auf den Basteltisch.
(soweit mir bisher bekannt)