Programm von Arduino Mega auf nano ziehen/anpassen

Hi Elektronikfreunde,

ich habe folgendes Problem und würde mich sehr über Hilfe freuen:

Wir Studenten basteln in unserer Firma an einem Projekt, einer word-clock, die Idee dazu hatten wir natürlich aus dem Internet(https://www.instructables.com/id/Und-noch-eine-Wordclock/).

Der generelle Programmcode wurde auf folgender Seite gefunden und ich habe ihn auch schon auf unsere Vorstellungen hin angepasst. Ich bin aber wirklich noch recht neu im Programmieren und komme grad schon an meine Grenzen. Der Programmcode funktioniert einwandfrei, aber wir wollen ihn von einem Arduino Mega auf einen kleinen Nano ziehen (der Mega ist einfach zu groß und unnötig teuer). Der Programmcode lässt sich problemlos compilieren, die LED-Streifen zeigen aber nichts an. Wisst ihr vielleicht woran es liegt? Ich vermute es liegt an der I2C Kommunikation mit dem DS3231 Modul.

Vielen Dank für Hilfe und Ratschläge :wink:

B_Woerter.ino (8.81 KB)

C_RTCFunktion.ino (2.48 KB)

WordClock_Zollner_v05_code.ino (15.4 KB)

Leider können nicht alle Helfer deine Sketche lesen.

Also setze den bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Das kannst du auch nachträglich machen.
Dazu den Sketch markieren und die Schaltfläche klicken, oder [code] davor und [/code] dahinter ohne *.

Damit wird dieser für alle besser lesbar.

Ich vermute es liegt an der I2C Kommunikation

Vermute ich nicht!

Hat der Nano den "Old Bootloader" drauf, dann spielt euch der WDT einen Streich.

Ja ich musste den alten Bootloader auswählen, damit ich den Sketch hochladen konnte. Es ist kein originaler Arduino nano, sondern ein chinesischer Nachbau (ist leider grad der einzige Nano in der Firma, die anderen sind erst bestellt).

Ja, dann ist doch klar, was jetzt zu tun ist....

Oder?

leider nicht wirklich,sry ::slight_smile:

kannst mir bitte erklären worauf du hinaus willst, das wäre spitze :wink:

gibt's keine Möglichkeit, den ''alten'' nano zum Laufen zu Bringen?

Möglichkeit 1:
Wenn der WDT stört, dann operiere ihn aus dem Programm raus.

Möglichkeit 2:
Wenn der alte Bootloader stört, dann mach einen neuen drauf.

Das sind die beiden offensichtlichen logischen Möglichkeiten.
Also nicht jammern, sondern tun.

ich danke dir :wink:

deine Hilfe war top, ich lese mich nur grade erst in das Thema ein, hab noch nicht allzuviel Ahnung.

bavariawars:
ich danke dir :wink:

deine Hilfe war top, ich lese mich nur grade erst in das Thema ein, hab noch nicht allzuviel Ahnung.

Und deswegen sollen viele deinen Sketch auch nicht lesen ?

Vielen Dank.

Und deswegen sollen viele deinen Sketch auch nicht lesen ?

Man sollte Sketche nicht überbewerten.
Schon gar nicht, wenn es um Fuses, (alte) Bootloader und chinesische Nanos geht.

Außerdem hat er in #0 schon den code und seinen Ursprung
instructables.com/id/Und-noch-eine-Wordclock
gepostet. Ein Sketch ergibt sich aus der Schaltung.

Ich verstehe Dein Problem nicht. Auf der verlinkten Seite wird auch ein NANO-Nachbau verwendet und kein MEGA.

Grüße Uwe

also Bootloader flashen hat leider nicht geklappt, ich konnte auch einen orginalen Arduino nano auftreiben, der funktioniert leider auch nicht (es leuchten nur die 4 dauerhaft angesteuerten LEDs für das Logo).

Mit den Megas (chinesische nachbauten) und einem Arduino Uno (Orginal) klappt es hingegen problemlos. Wie kann ich den WTD entfernen? muss der nicht im Code drinnen bleiben für die Funktion?

Hier der Code (nur ein Teil aus der Main), musste ihn ordentlich auf das Wichtigste kürzen, da zu lang >9000 Zeichen. Der Code geht aber problemlos auf anderen <<<Arduinos (auch Nachbauten, nur die Nanos wollen nicht)

#include <Wire.h>
#include <EEPROM.h>
#include "FastLED.h"
#include <avr/wdt.h>

#define NUM_LEDSz 4  // Zollnerlogo rot beleuchten
#define DATA_PINz 7
CRGB ledsz [NUM_LEDSz];         

#define RTC_ADDRESS 0x68        // I2C Address of RTC 0x68
#define STELLEN 8               // REED STELLEN Pin
#define MINUS 9                 // REED MINUS
#define PLUS 10                 // REED PLUS
#define SEKUNDEN 11             // REED SEKUNDEN
#define RTCIN 4                 // SQW Output of RTC connected here
#define TIME 750                // Split time between short and lognpress

#define DATA_PIN     5          //Ansteuerung LED Streifen
#define NUM_LEDS    114         //Anzahl LEDs 110 + 4
#define CHIPSET     WS2812B
#define COLOR_ORDER GRB 

// Dimmen der LEDs
#define BRIGHT_Hell 255   // Hellste Stufe
#define BRIGHT_Tag  100   // mit Beleuchtung
#define BRIGHT_Tag2  60    // ohne Beleuchtung 
#define BRIGHT_Abend 10   // Dämmerung
#define BRIGHT_Nacht  2    // "Nacht''
const int ldrPin = A0;          //Analogspannung LDR Eingang Mikrocontroller

CRGB leds[NUM_LEDS];

unsigned long lastReadRTC = -1;
unsigned long ptime;
unsigned long start;
boolean druck=false;
boolean ldruck=true;
boolean M_minus=false;
boolean FM_minus=true;
boolean M_plus=false;
boolean FM_plus=true;
boolean M_sek=false;
boolean FM_sek=true;
//boolean tasterlesen=true;
boolean update,last=true;
boolean sec=false;
boolean lsec=false;
boolean save,one=false;
boolean Minus,Plus=false;
boolean once=false;
boolean done=false;
boolean M_timeout=false;
byte setmode=0;
byte timeout=0;
//byte lm=0;                                  // 0=Normal 1=Display Seconds 2=Set minutes 3=Set hours
//byte lCase=0;
byte ss,mm,lmm,hh,hhdisplay,mmset,lmmset,hhset,lhhset,mm5er,mm5erRest=0;                // Save Variables for time
byte R=0,G=0,B=0;                            // Farbe für den Start alles weis
byte Rpointer,Gpointer,Bpointer;
byte PWMArray[23]={
  2,7,10,15,20,25,30,35,40,50,60,70,80,90,100,120,140,160,180,200,220,240,255};


void setup() {
  
  //wdt_enable(WDTO_2S);
  pinMode(RTCIN,INPUT);                          // SQW Output of RTC connected here
  pinMode(STELLEN,INPUT_PULLUP);                 // Taster Eingang
  pinMode(MINUS,INPUT_PULLUP);
  pinMode(PLUS,INPUT_PULLUP);
  pinMode(SEKUNDEN,INPUT_PULLUP);


  digitalWrite(RTCIN,HIGH);
  digitalWrite (STELLEN,HIGH);                    // internal Pullup
  FastLED.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS);
 // Serialbegin(115200);
  Wire.begin();                                   // Start I2C Kommunikation
  Wire.beginTransmission(RTC_ADDRESS);            // Beginn Kommunikation auf  Adresse 0x68 
  Wire.write(0x0E);                               // Pointer auf Control Register 0x07   
  Wire.write(0x00);                               // Controlbyte for RTC to set the sqw Output to 1Hz  
  Wire.endTransmission();                         // Beenden der I2C Kommunitkation
  update=true;
  Serial.begin(9600);
  Rpointer=EEPROM.read(0);
  Gpointer=EEPROM.read(1);
  Bpointer=EEPROM.read(2);
  TimeRead();
  RTC_Start();
}
//Ließt den aktuellen Zeitstempel aus dem RTC Modul.
String rtcReadTime(){
  Wire.beginTransmission(RTC_ADDRESS); //Aufbau der Verbindung zur Adresse 0x68
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(RTC_ADDRESS, 7);
 int sekunde    = bcdToDec(Wire.read() & 0x7f);
 int minute     = bcdToDec(Wire.read()); 
 int stunde     = bcdToDec(Wire.read() & 0x3f); 
  //Der Wochentag wird hier nicht ausgelesen da dieses mit 
  //dem Modul RTC DS3231 nicht über die Wire.h zuverlässig funktioniert.
  /* wochentag  =*/ bcdToDec(Wire.read());
 int tag        = bcdToDec(Wire.read());
 int monat      = bcdToDec(Wire.read());
 int jahr       = bcdToDec(Wire.read())+2000;  
 
 char timestamp[30];
 sprintf(timestamp,"%02d.%02d.%4d %02d:%02d:%02d",tag,monat,jahr,stunde,minute,sekunde);
 return timestamp;
}
//Convertiert binäre Zeichen in Dezimal Zeichen.
byte bcdToDec(byte val){
  return ( (val/16*10) + (val%16) );
}

// Start Main Loop
void loop() {

FastLED.addLeds<WS2812B, DATA_PINz, RGB>(ledsz, NUM_LEDSz);
    
ledsz[0] = CRGB (0,255,0);                        //Zollnerlogo rot beleuchten
ledsz[1] = CRGB (0,255,0);                        //Zollnerlogo rot beleuchten
ledsz[2] = CRGB (0,255,0);                        //Zollnerlogo rot beleuchten
ledsz[3] = CRGB (0,255,0);                        //Zollnerlogo rot beleuchten
FastLED.show();

  //wdt_reset();                      // Watchdog timer falls sich der Controller mal aufhängt
  /*=>Routine OneButton Control<=*/
  druck=digitalRead(STELLEN);
  M_minus=digitalRead(MINUS);
  M_plus=digitalRead(PLUS);
  M_sek=digitalRead(SEKUNDEN);
  R=PWMArray[Rpointer];
  G=PWMArray[Gpointer];
  B=PWMArray[Bpointer];
  /*One Button End*/

int ldrStatus = analogRead(ldrPin);               // LEDs dimmen

if (ldrStatus>550) {                              //verschiedene Helligkeitsstufen
  LEDS.setBrightness(BRIGHT_Nacht);}

else if (ldrStatus>400) {
  LEDS.setBrightness(BRIGHT_Abend);}

else if (ldrStatus>250) {
  LEDS.setBrightness(BRIGHT_Tag2);}

else if (ldrStatus>100) {
  LEDS.setBrightness(BRIGHT_Tag);}

else if (ldrStatus >= 0) { LEDS.setBrightness(BRIGHT_Hell);}

Serial.println(ldrStatus);

{
  //alle 5 Sekunden den Wert der RTC ausgeben.
  unsigned long currentMilliseconds = millis(); 
  if((lastReadRTC + 5000) < currentMilliseconds){
    lastReadRTC = currentMilliseconds;
    Serial.println(rtcReadTime());
  }
}


  sec=digitalRead(RTCIN);                          // Read the RTC SQWPulse 
  digitalWrite(13,sec);
  if (sec==true && lsec==false){
    ++ss;                                          // Sekunden Zähler aufadieren 
    if (ss==60){                                   // Bei 60 Sekunden eine Minute weiter
      ss=0;
      mm=mm+1;
    }
    if (setmode==1){                                // Im Setmode=1 werden hier die Sekunden angezeigt
      ++timeout;
      FastLED.clear();
      print_numbers(ss);                            // Sekunden Anezige Funktion mir übergabe der Sekunden
      FastLED.show();
      if (timeout>=15){
        setmode=0;
        timeout=0;
        update=true;  
      }  
    } 
    lsec=true;  
  }

uwefed:
Ich verstehe Dein Problem nicht. Auf der verlinkten Seite wird auch ein NANO-Nachbau verwendet und kein MEGA.

Grüße Uwe

Das verstehe ich eben auch nicht, nur die Nanos gehen nicht. Woran zum Teufel kann das liegen? Ich finde den Fehler nicht…

Lässt sich denn der Nano auch flashen, oder gibt es Fehlermeldungen die auf ein Problem hinweisen ?

Wie kann ich den WTD entfernen?

Die Frage ist jetzt nicht ernst gemeint, oder?

Vorschlag: Kommentarzeichen davor.

muss der nicht im Code drinnen bleiben für die Funktion?

Wenn man Wert auf den WDT legt, wenn es im Pflichtenheft eingefordert wird, dann hat man keine Wahl.
Aber sonst?

also Bootloader flashen hat leider nicht geklappt,

Diese Fehlermeldung kann ich nicht in der Arduino Dokumentation finden.

combie:
Die Frage ist jetzt nicht ernst gemeint, oder?

Vorschlag: Kommentarzeichen davor.
Wenn man Wert auf den WDT legt, wenn es im Pflichtenheft eingefordert wird, dann hat man keine Wahl.
Aber sonst?

Diese Fehlermeldung kann ich nicht in der Arduino Dokumentation finden.

nein, meinte ich natürlich nicht so, nur falsch ausgedrückt :slight_smile:

also das Flashen hat an sich problemlos funktioniert. Er bringt mir: Brennvorgang abgeschlossen.
Hab mich an diese Anleitung gehalten: https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/az-delivery-nano-v3-bootloader-flashen

Das Problem besteht aber weiterhin, also der Arduino steuert die 10x11 Leds nicht an. Das Logo leuchtet.
Das Problem besteht halt wirklich nur bei den Nanos, ich hab zufällig welche zu Hause, die probier ich mal morgen aus.

Das Pojekt ist btw nur zum Üben für uns Dualis (sind meine ersten paar Gehversuche mit Arduino), vielleicht wird mal ein Projekt für die Azubis draus.

Wie und womit versorgst du die Leds mit Spannung ?

extern mit einem einstellbaren Netzteil (kann bis 5A liefern, reicht also locker).
Ich hab schon ne Ausbildung als Elektroniker, in der Hardware bin ich also fit. Das ist eher ein Softwareproblem, kann mir nicht vorstellen, dass beide Nanos einen Hardwaredefekt haben.

Schöne Grüße :wink: