Wie Projekt umsetzen

Hallo miteinander.

Ich bin grade dabei ein 9 Kanaliges DMX Relais zu bauen.

Die Einzelteile funktionieren auch soweit.

Aber zusammen passt das nicht alles auf nen UNO/Nano.

Jetzt gibt es ja sicher viele Wege das umzusetzten.

Aber jede Überlegung die mir einfällt is irgendwie blöd.

Drum die Frage an die Experten.

Wie würdet ihr das lösen, wenn der Speichr Knapp wird?

LG Falko

Da wir deinen Sketch nicht kennen, können wir nur raten.

Wenn du mehrfach auftretende Anweisungen und Routinen in Funktionen unterbringst, kann Speicher eingespart werden.

Aber du solltest auch mal schreiben, welcher Speicher knapp wird.

Ich hab noch keine Sketch fertig.

Denn nach dem OLED und dem DMX waren schon 93% des Arbeitsspeichers und 40% des Programmspeichers weg.

Der Lagesensor und eine Menüstruktur um alles bedienen zu können kommt ja auch noch.

Kadara:
Ich hab noch keine Sketch fertig.

Denn nach dem OLED und dem DMX waren schon 93% des Arbeitsspeichers und 40% des Programmspeichers weg.

Der Lagesensor und eine Menüstruktur um alles bedienen zu können kommt ja auch noch.

Dann hast du doch schon einen Sketch.
Wie sollen wir helfen, wenn du ihn geheim hältst ?

Wie würdet ihr das lösen, wenn der Speichr Knapp wird

Da gibt es mindestens zwei Ansätze: Pragmatisch oder Sportlich.

Pragmatisch: Es gibt Größeres als einen atmega328 basierten Controller.
Sportlich: Genauer hinschauen. Was klemmt denn genau?

Die Einzelteile funktionieren auch soweit.

Schön, das hilft aber nicht wirklich beim Raten. Und widerspricht deiner Aussage "ich habe keinen Sketch".

Das ist ein Sketch den ich bis zu nem gewissen grad gebastelt hab. Nicht fertig, aber belegt 90% des arbeitsspeichers.

#include <DMXSerial.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
#define OLED_RESET 4 // not used / nicht genutzt bei diesem Display
Adafruit_SSD1306 display(OLED_RESET);
 
void setup()   {                
 
 // initialize with the I2C addr 0x3C / mit I2C-Adresse 0x3c initialisieren
 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
 
 // random start seed / zufälligen Startwert für Random-Funtionen initialisieren
 randomSeed(analogRead(0));

  DMXSerial.init(DMXReceiver);
  

   pinMode(2,  OUTPUT);
   pinMode(3,  OUTPUT);
   pinMode(4,  OUTPUT);
   pinMode(5,  OUTPUT);
   pinMode(6,  OUTPUT);
   pinMode(7,  OUTPUT);
   pinMode(8,  OUTPUT);
   pinMode(9,  OUTPUT);
   pinMode(10, OUTPUT);

}
 
#define DRAW_DELAY 118
#define D_NUM 47
int Adresse = 501;
int i;
 
void loop() {
  
 display.clearDisplay();
 
 // set text color / Textfarbe setzen
 display.setTextColor(WHITE);
 // set text size / Textgroesse setzen
 display.setTextSize(2);
 // set text cursor position / Textstartposition einstellen
 display.setCursor(1,0);
 // show text / Text anzeigen
 display.println("DMX");

 display.setTextSize(3);
 display.setCursor(55,40);
 display.println(Adresse);
 
 display.display();
 display.clearDisplay();
 
  
        if (DMXSerial.read(1)>127) {
        digitalWrite(2,LOW);
      } else {
        digitalWrite(2,HIGH);  
      }

      if (DMXSerial.read(2)>127) {
        digitalWrite(3,LOW);
      } else {
        digitalWrite(3,HIGH);  
      }

      if (DMXSerial.read(3)>127) {
        digitalWrite(4,LOW);
      } else {
        digitalWrite(4,HIGH);  
      }
  
      if (DMXSerial.read(4)>127) {
        digitalWrite(5,LOW);
      } else {
        digitalWrite(5,HIGH);  
      }

      if (DMXSerial.read(5)>127) {
        digitalWrite(6,LOW);
      } else {
        digitalWrite(6,HIGH);  
      }
 
      if (DMXSerial.read(6)>127) {
        digitalWrite(7,LOW);
      } else {
        digitalWrite(7,HIGH);  
      }

      if (DMXSerial.read(7)>127) {
        digitalWrite(8,LOW);
      } else {
        digitalWrite(8,HIGH);  
      }
      
       if (DMXSerial.read(8)>127) {
        digitalWrite(9,LOW);
      } else {
        digitalWrite(9,HIGH);  
      }

            if (DMXSerial.read(9)>127) {
        digitalWrite(10,LOW);
      } else {
        digitalWrite(10,HIGH);  
      }
 
}

Und ich will halt noch den Lagesensor drin haben, um auf ein umfallendes Gerät reagieren zu können.

Ich will ja nichts geheim halten. Aber ich weiß nicht ob das bei der Problemlösung hilft.

Es sollen noch eine Manuelle Relaisbedienung dazu kommen und halt diverse Optionen.

Lagesensor an/aus
Maunelle Bedienung an/aus
DMX an/aus
DMX Startadresse einstellen.

Was ein F Makro ist muss ich erst googeln.

Und wie kann ich das mit ner for Schleife Lösen? Steh grad auf dem Schlauch.

Die Karte soll nachher eben in ein Gerät, daß einerseits in einer DMX Kette eingebunden ist, aber auch manuell bedient werden kann, wenn mal keine DMX Kette da ist.

Und ob manuell oder per DMX soll das Gerät merken, wenn es umfällt.

Eigentlich nicht so abwegig.

wenn du auf dem Oled keine Grafik brauchst, nehme eine andere Lib, die nicht so speicherfressend ist.

F-Makro hilft dir bei deinem Sketch nicht wirklich.
Damit werden die Strings nicht im Ram sondern im Programmspeicher abgelegt.

Bei deiner Anwendung solltest du tatsächlich über einen größeren Controller nachdenken, oder die Arbeit aufteilen und zwei Atmega 328 verwenden.

Das Problem für mich ist an einem Master und einem Slave, daß einmal der RX belegt ist von DMX und der I2C vom Montor.
Wie könnte ich da noch Daten übertragen.
Ich hab halt wenig Ahnung von der Materie.
Ich hab meinen Arduino erst seit letzter Woche und vorher nur CNC maschinen programmiert.
Was für LIBS kämen denn da in Frage, die nicht so viel Speicher brauchen?
Um alles auf einen Nano zu kriegen sollt ich an dem Stand des Programms 50% kleiner sein als jetzt.
Das is schon ne Menge.

Generell wär ich ja schon für eine Lösung mit 2 Mikrocontrollern.
Dann kann sich einer nur auf das DMX und die Steuerung kümmern und einer um das Display und den Lagesensor.
Dann muß ich nicht einen auf allen Ports zu tode quählen.

Dein Oled ist das Hauptproblem, ich habe es eben mal getestet.
Ohne Oled werden nur 36% Speicher verbraucht.

Nimm eine andere Library, wie ardubu geschrieben, oder ein I2C-LCD.

Ich verwende mit einem Oled die U8glib.h
Die brauch deutlich weniger Speicher.

Kadara:
Das Problem für mich ist an einem Master und einem Slave, daß einmal der RX belegt ist von DMX und der I2C vom Montor.

I2C ist ein Bus, da kannst Du mehrere Geräte/Baugruppen anschließen.

Gruß Tommy

Aber geht das denn, daß der Slave informationen vom Master erhält und aber ans Dsplay welche sendet?

Kadara:
Aber geht das denn, daß der Slave informationen vom Master erhält und aber ans Dsplay welche sendet?

Warum sollte das nicht gehen, wenn du es richtig programmierst.

Informiere dich über "I2C Master Slave"

als Lib könntest du mal diese SSD1306Ascii versuchen.
Braucht für Hallo World gerade 2,6kB Flash und 49B Ram

Hi

… hmm, da wurde Das schon umgesetzt … bleibt jetzt trotzdem hier drin!

Kadara:

      if (DMXSerial.read(7)>127) {

digitalWrite(8,LOW);
     } else {
       digitalWrite(8,HIGH);  
     }

Bei jeder dieser Abfragen schaltest Du den Pin mit der Nummer EINEN höher als die Abfrage - Das schreit förmlich nach einer Schleife!
Selbst, wenn die Ausgangs-Pins wild gewürfelt werden, kannst Du Diese mit einem Array wieder in der richtigen Reihenfolge aneinander reihen.

Denke, daß für jeden Kanal ein ganzen Byte übertragen wird, liegt am DMX?
Weil für AN und AUS würde mir persönlich ein Bit reichen - also pro Kanal (wobei dann die Abfrage anders aussehen würde)

MfG

Hi

Besten Dank für die Erklärung, versteh sogar ich :slight_smile: Das verdiente Karma möge Dir gut tun.

Ist doch eigentlich gar nicht so kompliziert, das Bühnenzeugs.

MfG

Schön. Willst Du dem TO nun helfen oder nur Deine Lösung ohne Code promoten?

Gruß Tommy

Whow, hier gings ja richtig weiter.

Ich seh schon. Die Datenmengen sind sehr begrenzt. Was aber auch möglichkeiten auf tut mit kleinigkeiten viel zu erreichen.

Mit der for Schleife oben muß ich mich noch eingehender befassen. Prinzipiell Kenn ich die Funktion, aber mit den Variablen sagt mir das nichts.

Gibt halt vieles was ich noch nicht weiß, aber ich denk das is nach ner Woche ganz normal.

Meine Gyro Sensor hab ich auch soweit am laufen, daß er genau das macht was ich will.

Ich hab nur noch irgend nen Adressenkonflikt im I2C. Da gibts auch noch viel zu lesen.

Und die SSD1306Ascii Lib von gestern krieg ich irgendwie noch nicht zum laufen.

Ich bekomm immer den Fehler

"Ungültige Bibliothek C:\Program Files (x86)\Arduino\libraries\SSD1306Ascii-master in C:\Program Files (x86)\Arduino\libraries\SSD1306Ascii-master gefunden"

Das Display und den Gyro hab ich grade in einem Programm und auch wieder 79%.

An der Lib muß ich am schnellsten was ändern.

Zur Not hätt ich noch nen Mega da. Aber den Find ich einfach zu sperrig.

So ein Nano macht sich da viel besser.

Im Endeffekt entwickel ich hier einen Universal Empfänger für meine Einsatzzwecke.

Gebohren wurde die Idee aus der Not, wie so oft.

Wir machen Shows und haben also viel mit Theatertechnik und DMX zu schaffen.

Da bastelt man viel rum und ist bei vielen Sachen dem Freien Markt ausgeliefert.

So auch bei 4 Geräten mit kaputten DMX Karten.

Die einzig brauchbare lösung mit SSR und externem Display die ich gefunden habe, waren schon knapp 400 Pro Karte. Bei 4 Geräten nicht tragbar.

Außerdem ist die Konstruktion grenzwertig, da kein Notaus und reine DMX bedienung Herstellerseitig vorgesehen ist.

Einen Kippschalter besitzen die Geräte auch nicht, was ich auch sehr grenzwertig sehe.

Auf dem Markt werde ich also keine saubere Lösung finden wenn ich sie nicht selbst mach.

So kann ich später sogar das LCD Display der Geräte adaptieren und muß nur ein paar anschlüße für Notaus und manuelle bedienung dazufügen und ich habe die Geräte nicht nur repariert, sondern massiv aufgewertet.

Außerdem ist jetzt eh Winter. Bis zu Frühjahr kann ich basteln und testen.