Einen Arduino Nano programmieren Neuling hierbei , nicht generell

Beitrag #8110541 wurde von einem Moderator gelöscht.
#8110542

Gerhard O. schrieb:

Ein T. schrieb:

Der Erfahrung nach kommt es auch auf das Bedienende an. Ich kenne Menschen, die mit dem Paddel sehr zärtlich das Wasser streicheln und sich dann wundern, warum das Boot nicht vorankommen will... und ähnliches habe ich auch schon bei Stakstangen gesehen

Aller Anfang ist schwer;-)

Das ist natürlich wahr, allerdings... eine meine liebsten Wasserstreichlerinnen ist seit 1990 die Chefin einer Segelschule. Ich habe noch nicht herausgefunden, ob sie das Wasser absichtlich so liebevoll behandelt, damit sich einer von uns Segellehrern ihrer erbarmt, oder ob sie wirklich so eine zärtliche Beziehung zum Wasser pflegt. :-)

#8110546

Frank O. schrieb:

Das war mal wieder so ein richtig Puckliger.

Du erinnerst mich immer wieder an den totalen Techniklaien, der per Zufall für sein Fahrzeug rausgefunden oder erfahren hat, dass seine Motorprobleme an einem defekten Zündkabel lag.
Und anschliessend schwätzt Du jedem Fahrzeugbesitzer bei jedem Problem auf, erst einmal nach den Zündkabeln zu schauen, ggf. auch bei Diesel- oder E-Antrieb.
Für mich ein roter Faden bei Dir.

#8110548

Ralf X. schrieb:

Du erinnerst mich immer wieder an den totalen Techniklaien, der per Zufall für sein Fahrzeug rausgefunden oder erfahren hat, dass seine Motorprobleme an einem defekten Zündkabel lag.

Das liegt dann aber leider an dir.
Was ist eigentlich los, heute Stänkertag?
Die Wochenenden scheinen manchen nicht zu bekommen.

#8110550

Ein T. schrieb:

Das ist natürlich wahr, allerdings... eine meine liebsten Wasserstreichlerinnen ist seit 1990 die Chefin einer Segelschule. Ich habe noch nicht herausgefunden, ob sie das Wasser absichtlich so liebevoll behandelt, damit sich einer von uns Segellehrern ihrer erbarmt, oder ob sie wirklich so eine zärtliche Beziehung zum Wasser pflegt. :-)

Hmmm. Am Besten erörtert man solche Themen bei Kerzenlicht und Gläsern Wein;-)

#8110553

Frank O. schrieb:

Ralf X. schrieb:

Du erinnerst mich immer wieder an den totalen Techniklaien, der per Zufall für sein Fahrzeug rausgefunden oder erfahren hat, dass seine Motorprobleme an einem defekten Zündkabel lag.

Das liegt dann aber leider an dir. Was ist eigentlich los, heute Stänkertag? Die Wochenenden scheinen manchen nicht zu bekommen.

Bei mir ist alles ok und bei Dir scheint auch alles so zu sein, wie immer.
Egal ob in der Woche oder WE.
Du bist zu zart besaitet und kannst mit Kritik schlecht umgehen, so gut wie von keinem hier.

Beitrag #8110554 wurde von einem Moderator gelöscht.
#8110556

Frank O. schrieb:

Ralf eigentlich möchte ich diese Diskussion gar nicht führen. Der Pucklige pisst dauernd, wahrscheinlich immer dann, wenn seine Alte ihn im Keller eingesperrt hat, Leute an.

Typisch für Dich, dann sogar unter die Gürtellinie zu treten!

Auf mich hat er sich eine Zeit lang besonders eingeschossen.

Vielleicht, weil Du immer mehr im Bereich um Arduino rumlaberst und das Thema zerfledderst, wobei er sich damit zumindest bedeutend besser als Du auskennt?

Dass du auf den Zug aufgesprungen bist, verstehe ich ehrlich gesagt nicht.

Quatsch!
Mehrfach hatten wir in den vergangenen Jahre vergleichbare und an sich sinnlose "Diskussionen", sachliche Argumente interessieren Dich oft nicht und da Du eh immer das letzte Wort und Recht haben musst, beende ich das dann und denke dann lange einfach bei mir: Was ein.....

Aber dennoch, dein Beitrag war schon, wenn auch knapp, über die Kritik hinaus, ins anpissen hinein.

Mimose, aber beim Austeilen nicht zimperlich..

Mag ja sein, dass du genug Leute kennst, die auch die andere Wange hin halten, ich mache das nicht. Jedenfalls nicht, wenn es ums Anpissen geht. Aber eigentlich habe ich keine Probleme mit dir und deshalb ist mir das relativ egal. Bin ich dir denn auf den Schlips getreten? Dann tut mir das leid!

Wegen völliger Sinnlosigkeit breche ich das hiermit mal ab.

#8110559

... und mit dem letzten Satz dein Gegenüber mundtod machen. 😂
Für mich ist das nur ein Forum und so wichtig wie es dir zu sein scheint, ist es für mich nicht. Mein Leben spielt sich draußen ab.
Ist zwar schade, aber man kann nicht jedermanns Freund sein. Deinen Namen kenne ich aus dem Forum, aber dass wir so heftige Diskussionen hatten, war für mich nicht so, denn sonst würde ich mich dran erinnern. Es tut mir leid, wenn ich dir weh getan habe!

#8110576

Also, Asche auf mein Haupt. Ich hatte mich zu sehr an der "Kontrollleuchte" orientiert, die selbstverständlich direkt nach dem Anlegen der Betriebsspannung zu blinken beginnt. Je nach Bootloader etwas kürzer oder länger.
Kurzum, nehme ich einen anderen Port, so wie es auch im Originalprogramm angegeben ist, "flitzt" nichts am Anfang. Die LED bleibt dunkel, so lange, bis ich den Wert am Poti einstelle.
Da ich gestern zu faul war, habe ich es dann doch heute Morgen zusammengeschustert. Siehe Bild.
Statt 2 habe ich Port A4 genommen. OK. Der ist für I2C schon reserviert, aber da wir ja keinerlei Libraries in der Hinsicht deklariert hatten, funktioniert der Port auch als normaler Output.
In dem Zusammenhang ist es vielleicht interessant, sich das Bild mit der Portzuordnung anzuschauen.
Dann noch der Copyrighthinweis: Die Prozedur zum Laden eines "neuen" Bootloaders steht auf der Seite:

https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/az-delivery-nano-v3-bootloader-flashen

Viel Spaß weiterhin! Schönen Sonntag noch.

ciao
gustav

Angehängte Dateien:
: Bearbeitet durch User
#8110586

Thorsten P. schrieb:

Wer könnte mich unterstützen in der Sache einen Arduino nano zu programmieren? Also so ganz von Anfang an? Einfach und eingängig gehalten Welche Software , Hardware . Die Programmierung möchte ich am PC / Lapptop Windows 11 vornehmen. Wer kann und möchte mir helfen? Das soll auch alles kein Reaktionstest werden, das Projekt läuft nebenbei und liegt schon länger in der Schublade , jetzt möchte ich irgendwie dieses Jahr dann Platinen routen und bestellen. Ist M&V noch OK? PS: Ich kenne die ganzen Abkürzungen nicht welche in Foren so verwendet werden. Grüße Thorsten

Unbedingt ChatGPT! Ich lasse mir mittlerweile alles von ChatGPT programmieren. Bin so um Zehnerfaktoren schneller als ein Berufsprogrammierer.

Habe mir eine Heizungszungssteurerung sowie die Steuerung rund um den Swimming-Pool komplett (mit Web-Oberflächen) von ChatGPT programmieren lassen (C++ und Python) .... 5.000 Zeilen Scripting ... fehlerfrei!

Die eingesparten Stunden sind echte Lebensqualität ...!

#8110598

Ralf X. schrieb:

Typisch für Dich, dann sogar unter die Gürtellinie zu treten!

Ein Deutscher und ein Niederländer diskutieren, wer Schmerzen besser aushalten kann. Plötzlich kommt dem Niederländer eine Idee: "Du, wir treten uns gegenseitig mit aller Kraft in die Nüsse, und wer schneller wieder aufstehen kann, hat gewonnen." Die beiden einigen sich auf einen Wetteinsatz von zwanzig Euro, und weil er die Idee hatte, darf der Niederländer anfangen. Er nimmt Anlauf und tritt dem Deutschen mit aller Kraft ins Skrotum, der Deutsche fällt um und krümmt sich vor Schmerzen. Nach zehn Minuten steht er wieder auf und will dem Niederländer in dessen Familienplanung treten. Da sagt der Niederländer: "Nee, hast gewonnen, hier hast Du Deine zwanzig Euro."

Jungs, haben wir es jetzt? Danke.

#8110607

Hendrik L. schrieb:

Unbedingt ChatGPT! Ich lasse mir mittlerweile alles von ChatGPT programmieren. Bin so um Zehnerfaktoren schneller als ein Berufsprogrammierer.

Eher nicht... denn die kennen die LLMs ja auch. :-)

Irgendwo habe ich gelesen, mit LLMs zu arbeiten sei als hätte man eine Gruppe sehr schneller Juniorentwickler. Man muß zwar alles überprüfen und kontrollieren, aber am Ende sparen die LLMs viel Zeit, die man für sinnvollere Dinge nutzen kann.

#8110620

Hendrik L. schrieb:

Die eingesparten Stunden sind echte Lebensqualität ...!

Auch wenn es einigen nicht gefallen wird, da geht es hin. Und ich habe das schon früher gesagt, dem Mikrocontroller siehst du nicht an in welcher Sprache das Programm geschrieben wurde und ob es ein schönes Programm ist. Am Ende zählt nur, tut das Programm was es soll. Womöglich gibt es bald Mikrocontroller mit Eingang für ein Mikrofon, mit dem du dann dem Mikrocontroller sagen kannst was er machen soll.
Die meisten Autofahrer wissen auch nur wie sie ein Auto fahren müssen und es interessiert sie nicht wie die Technik funktioniert.

(Firma: Gast) #8110678

Habe das Ki generierte Programm mal leicht umgeformt. Funktion und Kommentare beibehalten.
Statt const constexpr verwendet.
Für die Pins uint8_t verwendet, wie es auch die Arduino Funktionen tun.
Statt BEZEICHNER_IN_GROSSSCHRIFT die KamelHöckerSchreibweise verwendet.
Unterstriche in Bezeichner sind eher nicht mehr üblich.
So wie Bezeichner in Großschrift defines vorbehalten bleiben sollten.

Zusätzlich die einzustellenden Parameter mit static_assert auf Plausibilität überprüft, damit der Compiler da falsche Zahlen besser erkennen kann.

1
// ==========================================
2
// EINSTELLUNGEN (Hier kannst du Werte ändern)
3
// ==========================================
4

5
constexpr uint8_t potiPin   = A0;   // Hier steckt der Schleifer vom Poti drin
6
constexpr uint8_t relaisPin =  2;   // Hier steuerst du dein Relais / Ausgang an
7

8
// Schwellenwerte für das Poti (Bereich geht von 0 bis 1023)
9
// 512 entspricht genau der Mitte (ca. 12 Uhr Stellung / 2,5V)
10
constexpr int einschaltWert = 530;  // Schaltet erst ein, wenn leicht über Mitte gedreht wird
11
constexpr int ausschaltWert = 490;  // Schaltet erst aus, wenn wieder leicht unter Mitte gedreht wird
12

13
static_assert(ausschaltWert>=0,"ausschaltWert zu klein");
14
static_assert(einschaltWert<=1023,"einschaltWert zu groß");
15
static_assert((einschaltWert-ausschaltWert)>1,"Hysterese zu klein");
16

17

18
// ==========================================
19
// START-ROUTINE (Läuft nur 1x beim Einschalten)
20
// ==========================================
21
void setup() 
22
{
23
  digitalWrite(relaisPin, LOW); // Sicherstellen, dass das Relais anfangs AUS ist
24
  pinMode(relaisPin, OUTPUT);   // Definiert den Ausgang für das Relais
25
}
26

27
// ==========================================
28
// HAUPTSCHLEIFE (Läuft endlos im Kreis)
29
// ==========================================
30
void loop() 
31
{
32
  // 1. Poti-Wert einlesen (Ergebnis ist eine Zahl zwischen 0 und 1023)
33
  switch(analogRead(potiPin))
34
  {
35
    case einschaltWert ... 1023:
36
       digitalWrite(relaisPin, HIGH); // Schaltet den Ausgang sauber EIN
37
       break;
38
       
39
   case 0 ... ausschaltWert:
40
       digitalWrite(relaisPin, LOW);  // Schaltet den Ausgang sauber AUS
41
       break;
42
  }
43
  // Liegt der Wert dazwischen (z.B. bei 500), bleibt einfach der aktuelle Zustand erhalten!
44

45
  // Kurze Pause, um den Prozessor nicht im Mikrosekunden-Takt zu stressen
46
  delay(50); 
47
}

KA, ob das so jedem schmeckt.... Ist mir auch völlig wumpe.

Ach ja:
µC lassen sich nicht stressen.
Und trampeln selbst im Delay mit Vollgas vor sich hin.

: Bearbeitet durch User
#8110705

Mir stellt sich gerade die Frage, ob man für alte Geräte, für die man neue Hardware und Software braucht, die KI das aufzeichnen lassen könnte? Wie müsste man so etwas anstellen? Könnte die Kamera alles aufzeichnen was mit dem alten Programm ausgeführt wird und die KI würde, unter menschlicher Mithilfe- daraus ein passendes Programm schreiben? Wenn man in diese Richtung ginge, würde daraus ein ganz neuer Geschäftszweig entstehen, wenn auch nur ein kleiner.

#8110714

Mit switch...case sollte doch auch das Ursprungsproblem des TO auf digitale Weise gelöst werden können: Relais stufenweise ein- und ausschalten, jeweils im Fensterbereich. Mehrere "Fensterkomparatoren" in Reihe.

Denk mal so.

ciao
gustav

#8110732

Arduino F. schrieb:

Habe das Ki generierte Programm mal leicht umgeformt.

Das ist doch PillePalle!
Warum wird denn diese Banalität immer wiederholt? Der TO hat ganz andere Anforderungen, die man auch direkt dem KI-Programm vor die Füsse werfen könnte, und sichtbar würde, ob das Ergenis etwas taugt, oder angesagt wird, daß die Vorgaben widersprüchlich oder unerfüllbar sind.

#8110847

Arduino F. schrieb:

Mi N. schrieb:

ob das Ergenis etwas taugt

Genau das kann der TO offensichtlich nicht beurteilen. Er fühlt sich unsicher, weil er nicht weiß was er tut, bzw. tun kann.

Ich musste leider auch schon beim Gerhard anecken, den ich als erfahren und stets freundlich wahrnehme: Dieses ganze KI-Geschwafel und die Selbstdarstellung der beteiligten Clowns hilft niemandem.

Wie ich schon sagte, muß der TO Thorsten sich einen Arduino nehmen und Grundfunktionen durchspielen. Wenn er dazu nicht gewillt ist, andere Beschäftigung suchen.

Wenn er dann, hoffentlich, irgendwann ein Grundverständnis der Materie entwickelt hat, kann er mit KI spielen und versuchen, abzuschätzen, ob irgendwas aus dem Forum für ihn taugt.

#8110985

Arduino F. schrieb:

Ach ja: µC lassen sich nicht stressen. Und trampeln selbst im Delay mit Vollgas vor sich hin.

Arduino F. schrieb:

Ich rate dazu, das Datenblatt des µC zu lesen, das brauchst du um Strom zu sparen.

Eine rechte Hand, eine linke Hand und nur eine Nase. Welche darf zufassen?

Wer hat eigentlich die Kommentare geschrieben? Oder anders gefragt, kann man statt 'sauber' auch 'schmutzig' ein-/ausschalten?

#8111033

Die Sache ist doch bereits geklärt:
Ich Doofi habe aus Faulheit die "Betriebsanzeigeled" als Port für das Relais als Ersatz genommen. Die blinkt absichtlich, um anzuzeigen, dass der Bootloader funktioniert.
Update:
Habe jetzt auch auf "2" als Port umgelötet.
Dabei ist mir aufgefallen, dass "D2" als Angabe als Fehler interpretiert wird.
Irgendwie inkonsequent. "A0" als Port wird beim Compilieren akzepiert, "D2" als Port nicht.
Man muss "2" eingeben. Aber welche 2?

Ob angehängte Datei der Portbezeichnungen für den Anfänger wirklich eine "Osram-Lampenfabrik" aufgehen lässt, wage ich zu bezweifeln.
(Übrigens scheinen die 6 ISP-Pins spiegelverkehrt benannt worden zu sein. Muss ich noch einmal nachprüfen. Also keine Gewähr für Richtigkeit der Übermittlung.)

Hätte eigentlich insgeheim erwartet, dass hier von fortgeschrittenen Kennern ein Beispiel geliefert wird für die "switch - case" Anweisung, noch auf mehrere "Fälle", also mehrere Potistellungen erweitert.

Und: Syntaxhinweise gibt Arduino als Kontextmenü offensichtlich (manchmal) auch aus.
Die sieht dann schon C++ mäßiger aus.
Wie gesagt, die "einfachen" Beispiele sind eher Sujets, die dann der Feinstrukturierung harren.

ciao
gustav

Angehängte Dateien:
#8111036

Arduino F. schrieb:

Du hast den Sinn nicht verstanden.

In der Tat habe ich nicht verstanden, warum Du hier Probleme erfindest und 'löst', die niemand sonst hat.
ARDUINO hat zunächst nichts damit zu tun, ein Datenblatt zu lesen, Strom zu sparen oder erst einen C++ Wälzer zu lesen. Das hilft dem TO absolut nichts. Ein Link auf eine Befehlsliste nebst Beschreibung ist zielführender.

Mich interessiert schon, wo in dem gezeigten Programm die Beschreibung 'sauber' herkommt. Das ist kein technischer Begriff. Ausnahme: Das Buch "Küchentechnik" von Clementine, wo sehr detailiert zwischen sauber und rein unterschieden wird.
Wenn KI der Ursprung sein soll, dann muß es doch eine Quelle geben, wo das abgeschrieben wurde.

Aber vielleicht ist das in der ARDUINO-Welt so, seine Programme zu vermenschlichen.

OP #8111040

Karl B. schrieb:

Also, Asche auf mein Haupt. Ich hatte mich zu sehr an der "Kontrollleuchte" orientiert, die selbstverständlich direkt nach dem Anlegen der Betriebsspannung zu blinken beginnt. Je nach Bootloader etwas kürzer oder länger. Kurzum, nehme ich einen anderen Port, so wie es auch im Originalprogramm angegeben ist, "flitzt" nichts am Anfang. Die LED bleibt dunkel, so lange, bis ich den Wert am Poti einstelle. Da ich gestern zu faul war, habe ich es dann doch heute Morgen zusammengeschustert. Siehe Bild. Statt 2 habe ich Port A4 genommen. OK. Der ist für I2C schon reserviert, aber da wir ja keinerlei Libraries in der Hinsicht deklariert hatten, funktioniert der Port auch als normaler Output. In dem Zusammenhang ist es vielleicht interessant, sich das Bild mit der Portzuordnung anzuschauen. Dann noch der Copyrighthinweis: Die Prozedur zum Laden eines "neuen" Bootloaders steht auf der Seite: https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/az-delivery-nano-v3-bootloader-flashen Viel Spaß weiterhin! Schönen Sonntag noch. ciao gustav

WOW Hut ab , tolle Sache. 1.Software Die Port Problematik ist mir derzeit zwar noch unklar , aber das werde ich dann vielleicht merken. 2.Nano Die (Nano) Spannungsregelung von 5V auf Chip Niveau ( Andere Info hier) nimmt natürlich etwas Strom auf. Da bin ich auch nie fündig geworden was man da alternativ ohne Querstrom nehmen könnte. Erstmal egal 3.SMD Mir wäre am Ende eine Onboard Lösung natürlich lieber,wenn ich SMD vermeiden möchte benötige ich auch wieder etwas mehr Fläche, wenn überhaupt alles Konventionell möglich ist.SMD ist schon wunderbar klein. Das von Hand aufzubauen macht das allerdings wenig Freude. 4. Software Mir ist da jetzt noch die Idee gekommen das man vielleicht im Verhältnis arbeiten kann? Wenn man zB nur noch 4,5V hat bekomme ich oben raus ja Probleme. Klar wenn ich eh 12V benötige( Relais bistabil) sind stabile 5V auch kein Problem. Mir ging es auch nur um die Idee habe ich 4,8V ist die Mitte eben 2,4V . Möchte damit sagen bzw. die Idee bringen das verhältnismäßig zu organisieren. Bei älteren Anpassungen (Anderer Fall) gab es die Möglichkeit von einer Eingangsspannung ausgehend die benötigten Sollwerte aus dem Verhältnis zu setzen.(Fehlervermeidung) Qusi Prozentual statt festem SOllwert in mV. Ich war das WE leider mehr in KH ern als beim Hobby die ersten Ansätze haben funtioniert aber ohne das gewünschte Ergebnis , heute begebe ich mich weiter an die Praxis. Wie gesagt sind meine Arbeitszeiten leider immer spontan gelagert.

Danke für die tolle Hilfe derer mit echten Ansätzen.

[Mod: Textformatierung "-----" entfernt]

: Bearbeitet durch Moderator
#8111042

Wenn jemand gerne seine Kenntnisse zum Besten geben möchte, sollte er es ruhig tun können hier.
Und der Erkenntnisgewinn liegt in der Tat darin, dass "vor" dem "eigentlichen Kompilieren" bereits "Syntaxfehler" erkannt werden können mit dem Statement:

static_assert

Ob das für ein "Sujet", wie ich es oben bezeichnete, unbedingt crucial ist, sei einstweilen dahingestellt.

Aber der zweite Verbesserungsvorschlag die "if - else" durch "switch - case - break" zu ersetzen, führt dem Ziel doch schon wesentlich näher.

Schönen Dank schon einmal für diesen Vorschlag an @Arduino.F.

So könnte es weitergehen, wenn auch andere Forenuser Verbesserungsvorschläge einbrächten.

ciao
gustav

(Firma: Gast) #8111047

Karl B. schrieb:

Man muss "2" eingeben. Aber welche 2?

Es gibt nur eine 2! Der auf das Board gedruckte Pin Bezeichner.

D2 gibt es nur wenn sich die GPIO Nummern, von dem Arduino Pin unterscheidet. z.B. bei einigen(allen?) ESP

Mi N. schrieb:

In der Tat habe ich nicht verstanden, warum Du hier Probleme erfindest und 'löst', die niemand sonst hat.

Wenn du das nicht verstehst hast du Pech gehabt. Und falsch gedacht: Viele hatten/haben das Problem, bis sie es verstanden und eingesehen haben.
Du brauchst offenbar noch eine Weile dazu.

Mi N. schrieb:

ARDUINO hat zunächst nichts damit zu tun, ein Datenblatt zu lesen, Strom zu sparen oder erst einen C++ Wälzer zu lesen. Das hilft dem TO absolut nichts.

Der TO will Strom sparen, also wohl den sleep Mode nutzen. Da ist Ende mit den mitgelieferten Arduino Zeuges und man brauch das Datenblett, weil dort alle Möglichkeiten beschrieben sind. Ein C++ Buch ist durchaus Hilfreich um die Sprache zu verstehen, die man versendet. Ohne wird man nicht Sattelfest und das ist genau das, was der TO sucht.

Danach kommt man mit der https://cppreference.com/ klar.

: Bearbeitet durch User
#8111051

Habe ich schon erwähnt, dass ich dieses Pin-Mapping von Arduino für eine Schnapsidee halte? Und dann auch noch eine Stiftleiste um einen Millimeter versetzen. Vermutlich war zu viel Alkohol beteiligt.

: Bearbeitet durch User
#8111057

Arduino F. schrieb:

Habe ich schon erwähnt, dass ich dieses Pin-Mapping von Arduino für eine Schnapsidee halte?

Welchen Verbesserungsvorschlag hättest du da?

Die Pins gemäß Datenblatt des Mikrocontrollers benennen. So wie es der Rest der Welt tut.

Arduino F. schrieb:

Eine Codierung damit man Shields nicht falsch rum drauf stecken kann.

Das halte ich für eine faule Ausrede. Dafür gibt es elegantere Lösungen.

: Bearbeitet durch User
#8111062

Moritz L. schrieb:

Arduino F. schrieb:

Eine Codierung damit man Shields nicht falsch rum drauf stecken kann.

Das halte ich für eine faule Ausrede. Dafür gibt es elegantere Lösungen.

Ja, diese historische Verklärung wurde schon vor vielen Jahren zum Thema gemacht und verworfen. Und es gab damals sogar die Aussage von den Machern, dass sie da einfach Mist gebaut haben. Aber nun, nachdem schon 3rd party Zeug gebastelt wurde, nicht mehr zurück können.

#8111073

Moritz L. schrieb:

Mit Ausnahme von A0.

Die A-Nummern sind Aliase. Eigentlich haben die Portpins auch eine D-Nummer, und die wird ohne D geschrieben. Zur Unterscheidung ob man A2 oder D2 meint schreibt man daher ein A an die 2 wenn man A2 meint.

Thorsten P. schrieb:

  1. Software Mir ist da jetzt noch die Idee gekommen das man vielleicht im Verhältnis arbeiten kann?

Das nennt man ratiometrische Messung und das macht der ADC im Controller ganz alleine wenn du Vcc als Referenz benutzt. Du musst nur dafür sorgen, das VCC am Controller und am Poti gleich ist, z.B. in dem du das parallel schaltest. Sollte das Poti bzw. die 14,3 km lange Fadendünne Leitung dahin einen relevanten Spannungsabfall produzieren, kannst du mit einer zusätzlichen Leitung die Spannung am Poti abgreifen und auf den VRef führen. Der Spannungsabfall der GND-Leitung ist dann aber unberücksichtigt. Oder: du setzt an beiden Enden einen Präzisionsspannungsregler ein, der das Poti bzw. VRef versorgt.

Moritz L. schrieb:

Habe ich schon erwähnt, dass ich dieses Pin-Mapping von Arduino für eine Schnapsidee halte? Und dann auch noch eine Stiftleiste um einen Millimeter versetzen. Vermutlich war zu viel Alkohol beteiligt.

Verpolsicherung für Künstler, die absolut sowas von keine Ahnung von Technik haben. Dafür war "Wiring" mal gedacht.

(Firma: Gast) #8111089

Moritz L. schrieb:

So einen Vorschlag hätte ich nur von einem Arduino Basher erwartet.

Wieso?

digitalWrite() braucht für manche Zwecke ein paar Takte zu viel.
Dann wählt man die schnellere Variante.

Das ist kein Bashing, sondern Realismus.

Wie Basher sich verhalten, kann man bei unserem Sheeva P. (sheevaplug) ganz gut sehen.
Lügen, und beleidigen.

: Bearbeitet durch User
#8111144

In der Zwischenzeit weitergebastelt. Das Programm habe ich sinngemäß von Google (im KI-Modus) übernommen. Das Drehen des Potis geht nicht so schnell, deswegen dauert das Video etwa 20 Sekunden. Tatsächlich hat das Einschalten der 5V Betriebsspannung (und Netzsteckerziehen) keinerlei unerwünschte Effekte, wie oben befürchtet.

Die rote LED schaltet sich beim unteren Spannungswert ein usw. usf. Bleibt also zunächst dunkel. Und wird auch beim Zurückdrehen des Potis wieder ausgeschaltet.

So, mit "drei Relais" scheint ja das Problem des TO als halbwegs gelöst zu bezeichnen zu sein. Und ich habe auch wieder etwas dazugelernt.

Viel Spaß weiterhin!

ciao
gustav

Angehängte Dateien:
#8111149

Karl B. schrieb:

Das Programm habe ich sinngemäß von Google (im KI-Modus) übernommen.

Teile Google (im KI-Modus) bitte mit, dass das wirklich die umständlichste und am wenigsten flexible Lösung ist. Sowohl in Python als auch in C lässt sich so etwas in wenigen Zeilen formulieren und die Anzahl der Schritte dabei auch noch automatisch parametrisieren.

Im Anhang eine ›Tattergreis+Störungen‹ Simulation für zB. sechs Relais.

Angehängte Dateien:
: Bearbeitet durch User
#8111160

Norbert schrieb:

Sowohl in Python als auch in C lässt sich so etwas in wenigen Zeilen formulieren und die Anzahl der Schritte dabei auch noch automatisch parametrisieren.

Klar, kann mir gut vorstellen, dass DU das aus dem Ärmel schütteln kannst.
Mich würde nur interessieren, wie es "arduinomäßig" aussieht.

Das war ja der Knackpunkt:
Verwendung eines Arduino Nano, etc. pp.

Oben hatte ich nicht umsonst die Formulierung gewählt:

Karl B. schrieb:

Wie gesagt, die "einfachen" Beispiele sind eher Sujets, die dann der Feinstrukturierung harren.

Der TO wird es bestimmt begrüßen, wenn Ihr herzlichst eingeladen werdet, an der "Wer-schreibt-den-besten-Sketch-Challenge" teilzunehmen.

Oh je, komme mir fast vor, als hätte ich seinen Thread gekapert. Aber der Thread Opener hat das ja schon mit Wohlwollen quittiert.

Thorsten P. schrieb:

Danke für die tolle Hilfe derer mit echten Ansätzen.

ciao
gustav

#8111161

Karl B. schrieb:

Klar, kann mir gut vorstellen, dass DU das aus dem Ärmel schütteln kannst. Mich würde nur interessieren, wie es "arduinomäßig" aussieht.

Wie ich eingangs schrieb, wenige Zeilen C-Code.
Ob Arduino oder nicht ergibt da keinen Unterschied.

Vorne wird der ADC Wert in die Funktion hinein geschüttet, hinten kommt ein Index heraus.

: Bearbeitet durch User
Beitrag #8111165 wurde von einem Moderator gelöscht.
#8111169

Mit so etwas? (Nur mal so schnell aus der Hüfte) … Hmmm, OK…
Hat übrigens jeweils 1/4 Schritt Hysterese.

In Python elegant als closure, in C mit eher unschöner static/local Variablen. Ginge mit 'ner Klasse sicher viel schöner. Tut aber der zugrunde liegenden Logik keinen Abbruch.

1
#include <stdio.h>
2
#include <stdint.h>
3
#include <stdlib.h>
4
#include <math.h>
5

6
#define NUM_POSITIONS (6+1)             // AUS plus sechs Positionen
7
#define ADCSTEPS 1024                   // 10 Bit ADC
8

9
int switcher(int adc_in) {
10
    static uint16_t out = 0;
11
    uint16_t x = 4 * adc_in * NUM_POSITIONS / ADCSTEPS;
12
    int i = x / 4;
13
    int f = x % 4;
14
    int sp = abs(i-out);
15
    if (sp > 0) {                       // Bei Änderungsmöglichkeit…
16
        if (sp >= 2)                    // Weite Sprünge **IMMER**
17
            out = i;
18
        // Ansonsten bei Bewegungen über Schwelle
19
        else if ((i > out) && (f > 0))  // zum höheren Nachbarn…
20
            out = i;
21
        else if ((i < out) && (f < 3))  // zum niedrigeren Nachbarn…
22
            out = i;
23
    }
24
    return out;                         // Hier gültige Position liefern
25
}
26

27
int main(void) {
28
    for (int i = 0; i < 1024; i++) {
29
        printf("%6d %6d\n", i, switcher(i));
30
    }
31
    for (int i = 1023; i >= 0; i--) {
32
        printf("%6d %6d\n", i, switcher(i));
33
    }
34
    return 0;
35
}
Beitrag #8111170 wurde von einem Moderator gelöscht.
Beitrag #8111175 wurde von einem Moderator gelöscht.
Beitrag #8111179 wurde von einem Moderator gelöscht.
Beitrag #8111181 wurde von einem Moderator gelöscht.
Beitrag #8111185 wurde von einem Moderator gelöscht.
Beitrag #8111186 wurde von einem Moderator gelöscht.
#8111403

…und nur weil's thematisch zur C-Version passt, hier noch die MicroPython Version. (Grafik zeigt Hysterese)

1
#!/micropython
2
# vim: fileencoding=utf-8: ts=4: sw=4: expandtab:
3
def GenSwitcher(num_positions, out=0):
4
    corr = round(ADCSTEPS / num_positions / 8)
5
    def inner(adc_in):
6
        nonlocal out
7
        adc_in = max(0, adc_in - corr)  # Obere und untere Stufe egalisieren
8
        # Stufen und Schwellen berechnen (für adc_in [0 … ADCSTEPS-1])
9
        i,f = divmod(round(4 * adc_in * num_positions / ADCSTEPS), 4)
10
        if (di:=abs(i - out)) > 0:      # Bei Änderungsmöglichkeit…
11
            if ((di >= 2)               # Weite Sprünge **IMMER**
12
            or (i > out and f > 0)      # über Schwelle zum höheren Nachbarn…
13
            or (i < out and f < 3)):    # über Schwelle zum niedrigeren Nachbarn…
14
                out = i
15
        return out                      # Hier gerastete Position liefern
16
    return inner                        # ›closure‹ liefert aufzurufende Funktion
17

18
ADCSTEPS = 2**10                        # 10 Bit ADC
19
NUMPOS = 13                             # Anzahl der ansteuerbaren Positionen
20
switcher = GenSwitcher(1+NUMPOS)        # switcher Funktion generieren (AUS plus ›n‹)
21
for adc_in in (list(range(ADCSTEPS)) + list(range(ADCSTEPS-1,-1,-1))):
22
    idx_position = switcher(adc_in)     # Position für gegebenen ADC-Wert
23
    print(idx_position, end=' ')
Angehängte Dateien:
#8111473

Klar, für PC Ausgabe am Bildschirm und in Simulationsumgebung ist das ein Klacks. Der Testcode läuft einmal durch, und dann ist Schluss. Drehen am Poti führt dann zu nichts mehr. Bei Arduino gibt es noch etwas zu bedenken:

"... Überlaufsicherheit (Integer Overflow): In der Zeile 4 * adc_in * NUM_POSITIONS kann das Ergebnis bei einem 16-Bit-Integer (Standard beim Arduino Uno/Nano für int) den Wert 32767 überschreiten ((4 \times 1023 \times 7 = 28644), das ist noch knapp drin, wird bei größeren Schaltern aber gefährlich). Ein expliziter Cast zu (uint32_t) fängt das sicher ab..."

Trotzdem erst einmal danke für den Denkanstoß.

ciao
gustav

#8111477

Karl B. schrieb:

Überlaufsicherheit (Integer Overflow): In der Zeile 4 *

Das ist auch für den originalen ADC Wert eines 10 Bit ADC ausgelegt. Nicht jedoch für künstlich aufgeblasene Werte. Sollte das Arduino Zeug einen vollen uint16_t (0…65535) liefern, dann einfach adc_in >>= 6; Da geht auch nichts an Präzision verloren, da die höheren Werte sowieso hochgelogen sind.

Ach ja, in der Zeile 11 den uint16_t x = 4 * adc_in gegen 4UL tauschen lässt auch eine weit höhere Anzahl von Stufen zu.

Arduino zum Testen hab' ich hier nicht, aber die praktisch identische Micropython Version läuft geschmeidig auf einem PICO/PICO2.

: Bearbeitet durch User
OP #8111528

Ein T. schrieb:

Frank O. schrieb:

Natürlich sollte man die Grundlagen der Programmiersprache und wie so ein Programm aufgebaut ist vorher einmal gelesen haben.

Aber genau daran fehlt es ja leider. Dem könnte der TO natürlich Abhilfe schaffen, indem er einen der vielen üblichen Wege geht, nämlich entweder a) ein Buch zu lesen, b) einige Lehrvideos anzuschauen oder sich c) durch ein Tutorial zu arbeiten. Diese Ratschläge hat unser TO jetzt mehrmals erhalten und sie als "langweilige schon bekannte Tipps" abgetan, weswegen zum Beispiel ich leider eine Idee mehr habe was ich ihm noch raten könnte. Wenn ich das richtig verstehe, sucht unser TO jemanden, der ihm das vorbetet oder -tanzt, und anderen Möglichkeiten steht er eher ablehnend gegenüber. Vielleicht hast Du ja eine Idee, die mir entgangen ist. Dann nur zu, ich bin auf Deine Idee ebenso gespannt wie darauf, ob unser TO sie dann umsetzen möchte.

Aber dann würde ich mir über alle Bauteile Gedanken machen und auch natürlich über die Hardware. Denn ein Programm alleine macht noch nicht das was man will.

Aber ja doch, ein fehlerfreies Programm macht vollkommen stumpf genau das, was ihm gesagt worden ist. Es gibt keine Widerworte, vergißt nichts, und es ist ihm ganz egal, woher das Eingangssignal kommt oder was mit dem Ausgangssignal passiert. ;-)

Hallo Frank O oder Ein T, sag mal gehts noch? Hier muss man jetzt schon analysieren wer nun welche unwichtige Meinung zu dem Thema hat. Ich blicke und will da auch nicht den Durchblick mehr haben. Was ich alles so gesagt haben soll und angeblich vergessen habe . Mich freut es das ja reges Interesse besteht habe auch tolle Tipps erhalten. Passst Nochmal nur für Frank O oder EinT , natürlich ist es langweilig Dinge zu hören die ja klar sind. Wenn ich Experte in der Sache werden möchte muss ich alle Schritte gehen und selbstverständlich muss man die Grundlagen lesen und verstehen. Ich erkläre mehrfach das ich solche Ansätze schon klar selbst lösen möchte und auch kann , wie soll ichs denn noch erklären? Die Frage ist für mich als Anfänger : Wie gehe ich vor ? Das Frage ich hier im Forum , da man mir gesagt hat das ist doch unproblematisch und einfach , kann man ganz schnell lernen. Darauf hin ist es doch toll wenn der Erfahrene vielleicht statt auf Erklärvideos zu verweisen , einfach stichpunktartig sagt wie er es angehen würde. Aus seiner heutiger Sicht. Und nicht son Unsinn das ich es nicht will. Es ist nun zunächst für mich alles schon geklärt und bin mit vielen guten Tipps nun dabei. So Sprüche "wie vortanzt oder betet" Ist doch einfach nur unverschämt. Warum wird 3ten ein so falsches Bild erstellt? Was soll das? Dazu meine Aussagen falsch zu übertragen? Welchen Sinn macht das? Kann man nicht einfach versuchen zu helfen ? Oder stumm bleiben? Wenn man mich für bescheuert hält? Kein Problem, bilde dir Deine Meinung wie sie dir gefällt. Das ist mir egal , aber das weiter tragen. Übel!!!!!!!!! Ständig 80% hier nur bescheuerte Kommentare und gegenseitiges angeschisse. Wenn ich ja schon schreibe : Anfänger : Nano ...... Sonst : Erfahren Wie genau muss man das denn erklären? Die meisten habens doch so kapiert? Ich kenne Internet YouTube KI usw. Ich sage ja noch diese IC s sind nicht mein Fall. Die nerven mich eigentlich , möchte es nach vielerlei Gesprächen nun mal in der Sache Versuchen. Halt mit einer recht überschaubaren echten Aufgabe. Ja.... es wurde schon alles gesagt, was hilfreich war.

Danke Danke Danke für alle Helfenden mit Anstand. Ich habe mich für s Forum entschieden, da man dann vielleicht durch Gespräche viel effektiver lernen kann. Im Dialog unwichtiges Beiwerk vermeiden könnte. Durch sowas rücken die Alternativen näher als nötig. Für die Haarespalter habe ich auch etliche Rechtschreibfehler drinnen gelassen und mir wenig Arbeit im Korrigieren gemacht. Möchte dazu auch keine Kommentare erhalten. KEINE! Grüße TO

OP #8111539

Norbert schrieb:

…und nur weil's thematisch zur C-Version passt, hier noch die MicroPython Version. (Grafik zeigt Hysterese)

#!/micropython

vim: fileencoding=utf-8: ts=4: sw=4: expandtab:

def GenSwitcher(num_positions, out=0):

1
corr = round(ADCSTEPS / num_positions / 8)
2

3
def inner(adc_in):
4

5
    nonlocal out

Dankeeeee Tolle Arbeit , mich fasziniert wie sehr unterschiedlich hier agiert wird. Manche habens auch einfach drauf und konzentrieren sich auf den Kern. So mag ich es am Liebsten.. Die Kinken und Sonderwünsche werde ich dann als Aufgabe ansehen. Da wird die Praxis schon noch ein Wörtchen mitreden. lol

OP #8111541

Karl B. schrieb:

In der Zwischenzeit weitergebastelt. Das Programm habe ich sinngemäß von Google (im KI-Modus) übernommen. Das Drehen des Potis geht nicht so schnell, deswegen dauert das Video etwa 20 Sekunden. Tatsächlich hat das Einschalten der 5V Betriebsspannung (und Netzsteckerziehen) keinerlei unerwünschte Effekte, wie oben befürchtet. Die rote LED schaltet sich beim unteren Spannungswert ein usw. usf. Bleibt also zunächst dunkel. Und wird auch beim Zurückdrehen des Potis wieder ausgeschaltet. So, mit "drei Relais" scheint ja das Problem des TO als halbwegs gelöst zu bezeichnen zu sein. Und ich habe auch wieder etwas dazugelernt. Viel Spaß weiterhin! ciao gustav

Kann das Video leider nicht abspielen. bzw. der Explorer weigert sich... aaaah

Über speichern und dann wiedergeben gings dann!!! Mehrere LEDs an habe ich allerdings nicht erkannt!!

: Bearbeitet durch User
#8111550

Thorsten P. schrieb:

Dankeeeee Tolle Arbeit ,

Wie willst DU das denn beurteilen? Auf der einen Seite verschweigst Du penetrant Sinn und Zweck Deiner Anwendung, und auf der anderen Seite bist Du nicht in der Lage, zu erkennen, daß man Dir schon fast fertige Lösungen bzw. Lösungsansätze gezeigt hat.
Jetzt hast Du Hardware auf dem Tisch zu liegen und anstatt diese einfach mal in Betrieb zu nehmen, meckerst Du über die Umgangsformen hier im Forum. So, wie Du Dich selber hier aufführst, sollte man Dir garnicht helfen.
Ich glaube auch nicht, daß Du überhaupt schon etwas von der diskutierten Materie verstanden hast.

(Firma: Gast) #8111607

Thorsten P. schrieb:

Ich habe mich für s Forum entschieden, da man dann vielleicht durch Gespräche viel effektiver lernen kann. Im Dialog unwichtiges Beiwerk vermeiden könnte.

Ganz sicher werde ich dir hier nicht mein C++ Buch vorlesen! Mein Gespräch, mit dir, endet jetzt und hier.

: Bearbeitet durch User
#8111624

Thorsten P. schrieb:

...da man dann vielleicht durch Gespräche viel effektiver lernen kann.

Das setzt voraus, das du dir was sagen lässt.

Im Dialog unwichtiges Beiwerk vermeiden könnte.

Es sind dir mehr als genug Tipps gegeben worden wie man "unwichtiges Beiwerk" vermeidet. Allerdings hast du sie nahezu alle ignoriert.

#8111626

Thorsten P. schrieb:

Hallo Frank O oder Ein T, sag mal gehts noch?

Als erstes solltest du lernen was Kommentare sind und wer was geschrieben hat.

Ohne jetzt auf deinen gesamten Text einzugehen, genau das was du forderst, das habe ich in dem von "Ein Typ" kommentierten Text geschrieben.

Und das war mein Text dazu:

Frank O. schrieb:

Nur meine Meinung! Grundsätzlich würde ich mich mit dem Projekt befassen, welches ich bauen möchte. Natürlich sollte man die Grundlagen der Programmiersprache und wie so ein Programm aufgebaut ist vorher einmal gelesen haben. Aber dann würde ich mir über alle Bauteile Gedanken machen und auch natürlich über die Hardware. Denn ein Programm alleine macht noch nicht das was man will. Wenn man allso die Elektrik/Elektronik der Hardware begriffen hat (warum kommt z.B. eine Freilaufdiode zu einem Relais), die sicher aufgebaut hat und soweit man sie testen kann, das auch getan hat. Erst dann kommt das Programm. Denn was nutzt das Programm, das vielleicht alles richtig macht, dann aber trotzdem alles nicht richtig funktioniert, weil man schon in der Hardware etwas falsch gemacht hat? Bei dem Programm würde ich alle Sensoren, Display, ADC und was es da alles zu tun gibt, in einzelnen Programmen erstmal ausprobieren und sicher testen. Wenn man alles einzeln verstanden hat und sicher hinbekommt, dann nach und nach alle Teile in das eigentliche Projekt integrieren. So würde ich empfehlen vorzugehen.

Vielleicht solltest du immer erst das Original lesen und dich dann an den einzelnen wenden, wenn dir etwas nicht passt. Und als erster Satz steht da deutlich, dass da "nur meine Meinung" ist.

Arduino F. schrieb:

Mein Gespräch, mit dir, endet jetzt und hier.

Da schließe ich mich mal an. Denn ich habe hier in diesem Beitrag, wie du ihn jetzt lesen kannst, nur geschrieben wie ich grundsätzlich vorgehen würde. Da waren keine Herabsetzungen oder Beleidigungen.
Solange du nicht einmal weißt wem du beschimpfen willst, brauchst du mit mir nicht diskutieren.

: Bearbeitet durch User
#8111648

OK. Habe den String, der zur Vereinfachung dienen soll, ausprobiert. "Mergen" von Programmschnitzeln ist ja so eine Sache. Jedenfalls klappt es nicht, so wie ich mir das vorstelle. Die "Relais" sollen ja mehr oder weniger quasi gegenseitig verriegelt sein. Es darf nur jeweils ein Relais eingeschaltet sein. Dementsprechend hatte ich statt der Relais verschiedenfarbige LEDs (rot-gelb-grün zufällig wie Verkehrsampel) verschaltet.
Verstehe den Einwand nicht:

Thorsten P. schrieb:

Mehrere LEDs an habe ich allerdings nicht erkannt!!

Die Forensoftware mag keine Videos im Browser,
daher rechte Maustaste, - speichern unter - und auf lokalem Laufwerk speichern und von dort aus abspielen.
Dass alle drei LEDs gleichzeitig leuchten sollten, war ja gerade "False".

Da es sich um ein Poti mit logarithmischem Widerstandsverlauf handelt, macht den direkten Zusammenhang zwischen Drehwinkel und Widerstand unnötig kompliziert. Daher lieber die Spannungswerte:
rot aus 0V
rot ein aufwärts 1,34V
rot aus abwärts 1,15V weitergedreht
rot aus aufwärts 2,5V
gelb ein aufwärts 2,54V
gelb aus aufwärts 3,6V
gelb aus abwärts 2,6V
grün ein aufwärts 3,7V
grün aus abwärts 3,6V

ciao
gustav

: Bearbeitet durch User
Beitrag #8111657 wurde von einem Moderator gelöscht.
#8111661

Lass dich nicht provozieren, es gibt hier leider in paar Leute die Spaß daran haben, wenn sich andere kloppen. Einfach beim Thema bleiben, und weitere Eskalation durch Schimpfworte weglassen, dann klappts vielleicht (ich weiß, ich bin hoffnungslos naiv 😉)

OP #8111663

Frank O. schrieb:

Thorsten P. schrieb:

Hallo Frank O oder Ein T, sag mal gehts noch?

Als erstes solltest du lernen was Kommentare sind und wer was geschrieben hat. Ohne jetzt auf deinen gesamten Text einzugehen, genau das was du forderst, das habe ich in dem von "Ein Typ" kommentierten Text geschrieben. Und das war mein Text dazu: Frank O. schrieb:

Nur meine Meinung! Grundsätzlich würde ich mich mit dem Projekt befassen, welches ich bauen möchte. Natürlich sollte man die Grundlagen der Programmiersprache und wie so ein Programm aufgebaut ist vorher einmal gelesen haben. Aber dann würde ich mir über alle Bauteile Gedanken machen und auch natürlich über die Hardware. Denn ein Programm alleine macht noch nicht das was man will. Wenn man allso die Elektrik/Elektronik der Hardware begriffen hat (warum kommt z.B. eine Freilaufdiode zu einem Relais), die sicher aufgebaut hat und soweit man sie testen kann, das auch getan hat. Erst dann kommt das Programm. Denn was nutzt das Programm, das vielleicht alles richtig macht, dann aber trotzdem alles nicht richtig funktioniert, weil man schon in der Hardware etwas falsch gemacht hat? Bei dem Programm würde ich alle Sensoren, Display, ADC und was es da alles zu tun gibt, in einzelnen Programmen erstmal ausprobieren und sicher testen. Wenn man alles einzeln verstanden hat und sicher hinbekommt, dann nach und nach alle Teile in das eigentliche Projekt integrieren. So würde ich empfehlen vorzugehen.

Vielleicht solltest du immer erst das Original lesen und dich dann an den einzelnen wenden, wenn dir etwas nicht passt. Und als erster Satz steht da deutlich, dass da "nur meine Meinung" ist. Arduino F. schrieb:

Mein Gespräch, mit dir, endet jetzt und hier.

Da schließe ich mich mal an. Denn ich habe hier in diesem Beitrag, wie du ihn jetzt lesen kannst, nur geschrieben wie ich grundsätzlich vorgehen würde. Da waren keine Herabsetzungen oder Beleidigungen. Solange du nicht einmal weißt wem du beschimpfen willst, brauchst du mit mir nicht diskutieren.

Also sind manche hier immer noch am Anfang .... Zum Glück steigen die Motzer nun aus ....

Die Hardware und die Elektronik beherrsche ich schon. Ich sagte auch das ich die Ansteuerung der Bistabilen Relais ( Was nichts zur Sache tut) schon gelöst habe . Die Hardware habe ich ebenso aufgebaut. Zur Vereinfachung und Ausschluss aller umgebenen Fragen und Vorschläge ,geht es immer noch um den Kern. Wie bekomme ich aus dem Analogen Signal 4 Relais in die 16 verschiedenen Stellungen. Da mir die eigentliche Suche eines ICs keine interessanten Ergebnisse geliefert hat, ( Einen Vorschlag gab es ja auch der einen Ansatz brachte) war mir die Lösung über einen Nano und einem Programm die Zustände mit Software zu erstellen , dann der sinnvollste Ausweg. Obwohl ich das eigentlich eben nicht wollte.

Ich will auch nicht zunächst die Gepflogenheiten ,Systeme und richtigen Einsatz dieses Forums lernen....das Interessiert mich im Grunde überhaupt nicht. Will meine Zeit damit nicht verbringen sondern mit der Lösung. Dies habe ich hier in wesentlichen Teilen bekommen. Dafür kann ich mich nur bedanken....

Es geht immer noch um anständige Umgangsformen. Wer hier wie wen beleidigt hat interessiert mich auch nicht ... sondern nur DAS es passiert. Ich sagte ebenso das ich gar nicht mehr genau erkennen kann wem was gilt. Da müsste ich Stunden mit Zuordnung und sonst was an Zeit investieren. Das ganze Gepöbel innerhalb meiner Anfrage das ist es was mich nervt. Und nicht nötig wäre.

OP #8111665

Uwe schrieb:

Lass dich nicht provozieren, es gibt hier leider in paar Leute die Spaß daran haben, wenn sich andere kloppen. Einfach beim Thema bleiben, und weitere Eskalation durch Schimpfworte weglassen, dann klappts vielleicht (ich weiß, ich bin hoffnungslos naiv 😉)

Da hast Du völlig recht ... Leider müllt das alles so zu das man die wichtigen Dinge mehr sucht als alles andere.

Es interessiert mich doch nicht wie hier dieses Forum funktioniert und wozu dies und das alles ist. Selbst die Insider finden es ja nicht so dolle... und dieses Konstrukt soll ich erstmal lernen. Der/die entsprechenden hat/haben doch n Cafe Latte

Die meisten hier sind ja völlig normal..

#8111675

Mal den USB ab und anstöpseln, oben wo arduino nano steht schauen ob der USB-Port auswählbar ist, ggf schauen ob der USB-Port in Window-Gerätemanager auftaucht, Kabel prüfen, Kurzschluss eingebaut?, was sagt die Power-LED am Nano?

#8111676

Thorsten P. schrieb:

Einfach ein unmöglicher Rotzlöffel. Was Du glaubst ..... Sack Reis China .... I _

Thorsten, es reicht jetzt.
Nicht was msx geschrieben hat rechtfertigt eine solche Unverschämtheit als Antwort. An deiner Stelle würde ich auch mal darüber nachdenken warum sich jetzt immer mehr Teilnehmer aus dieser Diskussion zurückziehen.

OP #8111685

Karl B. schrieb:

OK. Habe den String, der zur Vereinfachung dienen soll, ausprobiert. "Mergen" von Programmschnitzeln ist ja so eine Sache. Jedenfalls klappt es nicht, so wie ich mir das vorstelle. Die "Relais" sollen ja mehr oder weniger quasi gegenseitig verriegelt sein. Es darf nur jeweils ein Relais eingeschaltet sein. Dementsprechend hatte ich statt der Relais verschiedenfarbige LEDs (rot-gelb-grün zufällig wie Verkehrsampel) verschaltet. Verstehe den Einwand nicht: Thorsten P. schrieb:

Mehrere LEDs an habe ich allerdings nicht erkannt!!

Daher lieber die Spannungswerte: rot aus 0V rot ein aufwärts 1,34V rot aus abwärts 1,15V weitergedreht rot aus aufwärts 2,5V gelb ein aufwärts 2,54V gelb aus aufwärts 3,6V gelb aus abwärts 2,6V grün ein aufwärts 3,7V grün aus abwärts 3,6V ciao gustav

Hallo Gustav und Danke für die Mühen. Kannst Du mir die letzte Datei nochmal einstellen? Hier ist leider einfach zu viel Irrsinn rund um das Eigentliche , ich verliere den Überblick. Oh Mann. Nur 1 Relais angezogen ist zwar nicht das was ich benötige. Ich bräuchte ja 16 Positionen wo alle Relais in allen Versionen geschaltet werden, auch wenn das einige als unsinnig betrachten , genau das wäre es. Also Quasi aus 0-100% Regler

0000 0001 0010 0011

0100 0101 0110 0111

1000 1001 1010 1011

1100 1101 1110 1111

4 Relais

Natürlich ist das schon recht knapp mit den Spannungswerten. 1/16 von 5V zuzüglich Hysteresebereich.

: Bearbeitet durch User
OP #8111691

Roland F. schrieb:

Thorsten P. schrieb:

Einfach ein unmöglicher Rotzlöffel. Was Du glaubst ..... Sack Reis China .... I _

Thorsten, es reicht jetzt. Nicht was msx geschrieben hat rechtfertigt eine solche Unverschämtheit als Antwort. An deiner Stelle würde ich auch mal darüber nachdenken warum sich jetzt immer mehr Teilnehmer aus dieser Diskussion zurückziehen.

Nee Nee alle die sich zurückziehen... gut so .... Um das richtig zu beurteilen muss man zunächst genau schauen welche Unfähigkeiten hier nachhaltig wem unterstellt werden. Also mir unterstellt werden.. Mich juckt das im Grunde nicht ... möchte in meinem Beitrag aber nur das was dienlich ist . Wenn ich das ja mehrfach anmerke muss es doch mal ankommen. (Bei einigen, und jene wissen es genau)

Ich habe von Anfang an nur Dinge geschrieben die der Sache dienten, daraus entstehen Textorgien welche nur zu geringem Teil dienlich sind.. Die meisten hier haben alles anständig gelesen und konnten verstehen worum es geht. Manche geradezu in unverschämter Wiese alles zerpflückt ,mir jede Kompetenz abgeschrochen. Das soll ich dann verbockt haben? Immer noch wird sich darüber aufgeregt ich würde Sachen vorenthalten. Nein ... für die Sache im Detail, worauf es mir ankommt, ist es irrelevant und vergrößert die Spielwiese unnötig. Das wollen manche nicht akzeptieren. Soll ich mir ernsthaft die Mühe machen , die Pöbelei im Vorfeld aufzulisten? Mag sein das die gegenseitigen Stänkereien mich wiederum nicht zu interessieren haben. Aber in meiner Anfrage möchte ich , anständige Umgangsformen. Mehrfach deutlich gemacht.. Das wurde ignoriert. So siehts aus.

PS Kann man eigentlich eigene Beiträge vollständig löschen?

OP #8111693

Uwe schrieb:

Mal den USB ab und anstöpseln, oben wo arduino nano steht schauen ob der USB-Port auswählbar ist, ggf schauen ob der USB-Port in Window-Gerätemanager auftaucht, Kabel prüfen, Kurzschluss eingebaut?, was sagt die Power-LED am Nano?

Das blinkt und läuft ... die Seite ist gecheckt.

Der Port hat ein Häkchen der Nano auch .. Kabel auch getauscht . USB A diverse gewählt ...

: Bearbeitet durch User
#8111714

Habe das Problem mit dem Vorschlag "...// Funktion zur Ermittlung der Stufe mit integrierter Hysterese int bestimmeStufeMitHysterese(int adc_in) {...etc..."

dass das Programm nur einmal nach dem Anlegen der Betriebsspannung funktioniert. Das heißt, drehe ich das Poti zurück, funktioniert es nicht.

Beim "alten" Programm:
Habe zum Test eine LED an der "Kippgrenze" über Stunden stehen lassen können. Da kippt nichts, die LED bleibt an. Nicht die andere benachbarte.

Allerdings ist die Ausnutzung der oben von @Norbert beschriebenen Funktion doch angeraten. Gerade bei mehr Relais.
Wieso es bei mir nicht klappt, muss ich noch herausfinden. Höchstwahrscheinlich absolut triviale Syntaxfehler, weil ich von C++ Null Ahnung habe.

Hier auf vielfachen Wunsch noch einmal die "unschöne" Version als Dateianhang.

ciao
gustav

Angehängte Dateien:
: Bearbeitet durch User
#8111717

Hinsichtlich des unglücklichen Ton der hier nun vorherrscht, erinnert es mich an:

"Mein Achtel Loorbeerblatt", von Reinhard Mey

"Also tue ich, was ein Baum tun würde, wenn ein Schwein sich an ihm kratzt: Ich bedenk', was ein jeder zu sagen hat, und schweig' fein still..." – Reinhard Mey

Gruss, Gerhard

oder besser "Duck und weg";-)

: Bearbeitet durch User
#8111735

Karl B. schrieb:

Wieso es bei mir nicht klappt, muss ich noch herausfinden. Höchstwahrscheinlich absolut triviale Syntaxfehler,

Syntaxfehler gäbe Warnungen.

Das hier sollte eigentlich funktionieren (Wie gesagt, habe kein Arduino zum Testen):

1
#define NUM_POSITIONS (3+1)             // AUS plus drei Positionen
2
#define ADCSTEPS 1024                   // 10 Bit ADC
3

4
void switcher(uint16_t adc_in) {
5
    static uint8_t out = 0;
6
    uint16_t x = 4UL * adc_in * NUM_POSITIONS / ADCSTEPS;
7
    uint8_t i = x / 4;
8
    uint8_t f = x % 4;
9
    uint8_t sp = abs(i-out);
10
    if (sp > 0) {                       // Bei Änderungsmöglichkeit…
11
        if (sp >= 2)                    // Weite Sprünge **IMMER**
12
            out = i;
13
        // Ansonsten bei Bewegungen über Schwelle
14
        else if ((i > out) && (f > 0))  // zum höheren Nachbarn…
15
            out = i;
16
        else if ((i < out) && (f < 3))  // zum niedrigeren Nachbarn…
17
            out = i;
18
    }
19
    // Bitmap erstellen (000₂, 001₂, 010₂, 100₂)
20
    uint8_t pattern = 0;
21
    if (out)
22
        pattern = 1<<(out-1);
23
    digitalWrite(RELAIS_1, pattern & 1 ? HIGH : LOW);
24
    digitalWrite(RELAIS_2, pattern & 2 ? HIGH : LOW);
25
    digitalWrite(RELAIS_3, pattern & 4 ? HIGH : LOW);
26
}

und dann im loop() nur noch:

1
switcher(analogRead(POTI_PIN));
#8111736

Thorsten P. schrieb:

Du bist unmöglich .. Punkt Einfach ein unmöglicher Rotzlöffel.

Interessant.
Vor ca. 14 Tagen hattest Du mir eine PN geschickt und darin eine 'Zusammenarbeit' angeboten. Im Prinzip hatte mir gefallen, abgestufte Einstellungen per Poti zu erhalten, weshalb ich aus Jux schon ein Programm dazu geschrieben hatte.

Dein Verhalten und Deine Geheimniskrämerei hatten mir zwischenzeitlich aber signalisiert, das bringt nichts außer ggf. Ärger. Wenn man etwas Erfahrung im Geschäft hat, weiß man, mit wem man etwas zu tun haben möchte und mit wem eben nicht.
Wie Du mir jetzt bestätigst, war es goldrichtig, Deine Anfrage unbeantwortet zu lassen.

Gerhard O. schrieb:

Gruss, Gerhard

Aus Neugierde: Wenn Du doch noch Zeit finden solltest, würde mich ein KI-Ergebnis mit den (älteren) Äußerungen des TO immer noch interessieren: Gibt es ein brauchbares Ergebnis oder Error 42.

#8111737

Hallo Gustav,

ich habe Dein Programm auf einer ATMEGA1284 Bord unter Arduino IDE getestet. Allerdings nur über Serial und ohne ADC, also keine HW angeschlossen.

Deine Funktion "bestimmeStufeMitHysterese(int messwert)" funktioniert aber einwandfrei.

Ich konnte aber bei mir keine HW anschließen - so modifizierte ich es in der loop() so:

1
              ...
2
              int stufe = bestimmeStufeMitHysterese(_ioregs[index]);
3
              Serial.print("Stufe = ");
4
              switch (stufe) {
5
                case 0: // Alle aus
6
                                    Serial.println(stufe);
7
                  break;
8
                case 1: // Nur Relais 1 an
9
                                    Serial.println(stufe);
10
                  break;
11
                case 2: // Relais 2 an
12
                                    Serial.println(stufe);
13
                  break;
14
                case 3: // Relais 3 an
15
                                    Serial.println(stufe);
16
                  break;
17
                }
18
                ...

Das funktioniert auch. Der Stufenwert wurde immer korrekt angezeigt - auch rückläufig. ... 277 1 Stufe = 1 236 1 Stufe = 1 235 0 Stufe = 0

Momentan stehe ich da auch auf den Schlauch, warum das bei Dir nicht wie gewünscht, funktioniert.

Modifiziere vielleicht Dein Programm, so dass es anstatt der Relais den Stufenwert einfach ueber den Serial Port ausgibt und überprüfe dann die ausgegebenen ADC Poti Werte und Stufenanzeige.

Gerhard

#8111739

Mi N. schrieb:

Aus Neugierde: Wenn Du doch noch Zeit finden solltest, würde mich ein KI-Ergebnis mit den (älteren) Äußerungen des TO immer noch interessieren: Gibt es ein brauchbares Ergebnis oder Error 42.

Bezieht sich das auf den anderen Thread? Ich habe ihn mir nicht angesehen.

Ich werde die Fragestellung der KI vorwerfen und sehen wie die Prode des TO ausgewertet wird.

#8111740

Bezieht sich das auf hier?

Fragestellung" Ich benötige eine Umsetzung aus einer Spannung zB 0-5V , welche dann einen Binärcode aus 4 Bits parallel oder mehr erzeugt.Es ginge zur Not auch 2 Bits , die Sache ist halt die, das ich nicht mit Daten agieren möchte und es soll klein sein ohne viele Bauteile , da ich nie Digital unterwegs war , bekomme ich keine Selektion hin ob ein IC das erfüllen könnte . Also 1 Input (Analog) in zB 4 Output. Am Ende möchte ich erreichen das ich 2 3 oder 4 Relais ansteuern kann, und das mit einer Spannung am Eingang, wonach ich dann nach der Binär Folge jede erdenklich Kombination erhalten kann. Vielleicht oder wahrscheinlich gibt es das schon als IC ich finde diesen aber nicht weil ich die Prinzip Bezeichnung schon nicht finde. Habe jetzt Tage gesucht ,meine Suche bringt mich aber immer wieder zu ADC Wandlern welche mir eine Serielles Bitwort ausgeben oder aus diesem Digitalen Muster eine Spannung also einen DA Wandler anbietet. Mir ist klar das meine Fragestellung einfach nicht gut genug ist , die KI entsprechend auch nichts liefert."

Hier ist die Antwort:

Hallo! Das Bauteil, das du suchst, nennt sich Flash-ADC (Parallel-Radizierer / Parallel-Umsetzer). Klassische ICs dieser Art (wie der CA3306) geben die Bits direkt parallel aus, sind heute aber oft teuer, schwer zu finden oder benötigen eine komplexe Beschaltung. Da du geschrieben hast, dass es klein sein soll und wenige Bauteile haben darf, ist ein winziger Mikrocontroller (z. B. ein Arduino Nano oder ein noch kleinerer ATtiny85) die beste Lösung. Du benötigst dafür praktisch keine Zusatzbauteile: Nur die Platine selbst, deine 0-5V am Eingang und deine Relais (über eine Treiberstufe wie den ULN2003A oder Transistoren, da Mikrocontroller-Pins Relais nicht direkt schalten können). Hier ist der passende, einfach verständliche Code für dich. Er teilt die 0-5V Eingangsspannung in 16 gleich große Stufen (0 bis 15) auf und gibt diesen Wert direkt als 4-Bit-Binärmuster an vier digitalen Ausgängen aus.

1
Kommentierter Arduino-Code
2
// Definition der Pins für die 4 Relais-Ausgänge (Parallel-Bitmuster)
3
const int RELAIS_BIT_0 = 2; // Niedrigstwertiges Bit (LSB) -> Relais 1
4
const int RELAIS_BIT_1 = 3; // Zweites Bit              -> Relais 2
5
const int RELAIS_BIT_2 = 4; // Drittes Bit               -> Relais 3
6
const int RELAIS_BIT_3 = 5; // Höchstwertiges Bit (MSB)  -> Relais 4
7

8
// Definition des analogen Eingangs-Pins (0-5V)
9
const int ANALOG_INPUT_PIN = A0;
10

11
void setup() {
12
  // Konfektionierung der Digital-Pins als Ausgänge für die Relais
13
  pinMode(RELAIS_BIT_0, OUTPUT);
14
  pinMode(RELAIS_BIT_1, OUTPUT);
15
  pinMode(RELAIS_BIT_2, OUTPUT);
16
  pinMode(RELAIS_BIT_3, OUTPUT);
17
}
18

19
void loop() {
20
  // 1. Analogwert einlesen. 
21
  // Der Arduino wandelt 0V bis 5V intern in Zahlen von 0 bis 1023 um.
22
  int analogWert = analogRead(ANALOG_INPUT_PIN);
23

24
  // 2. Den Wert skalieren.
25
  // Wir rechnen den Bereich 0-1023 in 16 Stufen (0 bis 15) um.
26
  // Jede Stufe entspricht exakt einem 4-Bit-Binärwert (0000 bis 1111).
27
  int bin_Wert = map(analogWert, 0, 1023, 0, 15);
28

29
  // 3. Das Binärmuster parallel auf die Ausgänge schreiben.
30
  // Die Funktion "bitRead" prüft, ob das jeweilige Bit im Wert 0 oder 1 ist.
31
  digitalWrite(RELAIS_BIT_0, bitRead(bin_Wert, 0)); // Schaltet Relais 1
32
  digitalWrite(RELAIS_BIT_1, bitRead(bin_Wert, 1)); // Schaltet Relais 2
33
  digitalWrite(RELAIS_BIT_2, bitRead(bin_Wert, 2)); // Schaltet Relais 3
34
  digitalWrite(RELAIS_BIT_3, bitRead(bin_Wert, 3)); // Schaltet Relais 4
35

36
  // Kleine Pause zur Stabilisierung, damit die Relais nicht flattern (50 Millisekunden)
37
  delay(50);
38
}

Wie das Ganze im Hintergrund rechnet:

• 0,00V bis 0,31V am Eingang (\rightarrow ) Binär 0000 (\rightarrow ) Alle Relais aus. • 0,31V bis 0,62V am Eingang (\rightarrow ) Binär 0001 (\rightarrow ) Nur Relais 1 an. • 2,50V am Eingang (\rightarrow ) Binär 1000 (\rightarrow ) Nur Relais 4 an. • 5,00V am Eingang (\rightarrow ) Binär 1111 (\rightarrow ) Alle 4 Relais an. Hinweis zu den Relais: Bitte schließe die Relaisspulen nicht direkt an die Pins des Arduinos an, sonst brennt der Chip durch. Nutze fertige "Arduino Relais-Module" (die haben bereits Optokoppler/Transistoren verbaut) oder ein Treiber-IC wie das ULN2003A zwischen Arduino und deinen Relais. Möchtest du die Schaltschwellen für die Spannungen individuell anpassen, oder reicht dir die gleichmäßige Aufteilung von 0 bis 5 Volt?

: Bearbeitet durch User
#8111743

Mi N. schrieb:

Aus Neugierde: Wenn Du doch noch Zeit finden solltest, würde mich ein KI-Ergebnis mit den (älteren) Äußerungen des TO immer noch interessieren: Gibt es ein brauchbares Ergebnis oder Error 42.

Das bezieht sich auf Deinen originalen Hinweis:

Hier ist eine maßgeschneiderte Antwort für das Forum, die direkt auf die vom Fragesteller gepostete Tabelle eingeht. Seine Tabelle zeigt ein klassisches binäres Hochzählen (0000 bis 1111), wobei er die Ausgänge in Zweiergruppen (Out 1 & 2, Out 3 & 4) aufgeteilt hat. Hallo nochmals! Deine Skizze trifft den Nagel auf den Kopf! Das, was du da aufgeschrieben hast, ist die exakte Wahrheitstabelle für einen 4-Bit-Binärcode (Werte 0 bis 15). Du hast deine Bits paarweise aufgeteilt, was im Grunde folgendes Muster ergibt (wenn wir es als eine einzige 4-stellige Binärzahl von rechts nach links lesen):

1
• Stufe 0: 0000 (Alle aus)
2
• Stufe 1: 0001 (Nur Out 1 an)
3
• Stufe 2: 0010 (Nur Out 2 an)
4
• Stufe 3: 0011 (Out 1 & 2 an)
5
• Stufe 4: 0100 (Nur Out 3 an)
6
• Stufe 5: 0101 (Out 1 & 3 an)
7
• ... und so weiter bis Stufe 15: 1111 (Alle an).

Da du keinen Programmieraufwand betreiben möchtest und nach einer reinen Hardware-Lösung (IC) suchst, gibt es eine hervorragende Nachricht: Es gibt eine Möglichkeit, genau das mit nur zwei Standard-ICs komplett ohne Programmieren und extrem platzsparend aufzubauen!

Die reine Hardware-Lösung (Ohne Programmieren)

Da moderne Analog-Digital-Wandler (ADC) fast nur noch serielle Daten ausgeben (wie du schon gemerkt hast), nutzen wir eine clevere Kombination aus zwei extrem günstigen und überall erhältlichen ICs:

  1. IC 1: LM3914 (Dot/Bar Display Driver) • Dieses IC misst deine 0-5V und schaltet damit linear 10 einzelne Ausgänge nacheinander durch (wie eine LED-Aussteuerungsanzeige). Bei 0V ist Ausgang 0 aktiv, bei 5V ist Ausgang 9 aktiv (oder umgekehrt, je nach Einstellung). Er macht aus der Spannung also eine "1-aus-10"-Auswahl.
  2. IC 2: CD40147 (10-Line to 4-Line BCD Encoder) • Dieses IC macht genau das Gegenteil: Es nimmt die 10 einzelnen Leitungen vom LM3914 entgegen und wandelt sie sofort in das von dir gewünschte 4-Bit-Binärmuster (BCD/Binär) um. Der Vorteil: • Null Programmierung: Du musst keinen Code schreiben. • Keine "Datenströme": Das Signal fließt rein analog rein und kommt fest verdrahtet als paralleles Dauersignal an den 4 Pins wieder raus. • Größe: Beide ICs sind winzig (DIP-16 oder DIP-18 Gehäuse) und passen auf eine Lochrasterplatine in der Größe einer Streichholzschachtel.

Alternative: Der "Black Box" Mikrocontroller (Fertig geflasht)

Falls dir das Zusammenlöten von zwei ICs mit vielen Zwischenverbindungen zu aufwendig ist, bleibt der Weg über einen ATtiny85 (ein winziger 8-poliger Chip). Auch wenn du "nie digital unterwegs warst": Du kannst dir das wie ein Bauteil vorstellen, das man einmalig mit dem Code aus der vorherigen Antwort beschreibt (das macht meistens ein Bekannter oder man nutzt ein 5-Euro-USB-Board). Danach verhält sich dieser Chip für dich wie ein reiner Hardware-Bauteil: 1 Pin Analog-In, 4 Pins Parallel-Out. Weniger Bauteile als mit diesem 8-Pin-Chip geht physikalisch nicht.

Wichtiger Hinweis für deine Relais:

Egal ob du die Zwei-IC-Lösung oder einen Mikrocontroller nutzt: Die Ausgänge dieser ICs liefern nur wenige Milliampere. Um Relais anzusteuern, hängst du einfach ein ULN2003A (ein 16-poliger Transistor-Array-Chip) dahinter. Dieser verstärkt die 4 Ausgangssignale so weit, dass du direkt 12V- oder 5V-Relais damit schalten kannst, ohne dass etwas durchbrennt. Möchtest du, dass ich dir einen Schaltplan-Entwurf für die Variante mit den beiden ICs (LM3914 + CD40147) erstelle, oder zieht es dich eher zur minimalistischen Ein-Chip-Lösung (ATtiny85)?

Ich: Lieber waere mir eine Arduino Loesung:

Hier ist die Fortsetzung für deinen Forums-Beitrag, maßgeschneidert auf seine Tabelle und die Entscheidung für die Arduino-Lösung. Damit hat er den geringsten Bauteilaufwand und exakt das Verhalten aus seiner Skizze. Perfekt, die Arduino-Entscheidung ist für dieses Vorhaben die flexibelste und einfachste Wahl! Da du dich für den Arduino entschieden hast, können wir die 4 Ausgänge exakt so ansteuern, wie du es in deiner Skizze aufgemalt hast. Du hast in deiner Tabelle 8 Stufen (0 bis 7) gezeigt, was einem 3-Bit-Code entspricht. Wenn du das vierte Relais (Bit 4) dazunimmst, erweitert sich das Ganze automatisch auf 16 Stufen (0 bis 15) nach genau demselben Prinzip. Hier ist der fertige, leicht verständliche Code, den du direkt auf deinen Arduino (z. B. einen Nano oder Uno) laden kannst.

Der passende Arduino-Code für deine Tabelle

1
cpp
2
// Zuordnung der Pins laut deiner Skizze:
3
// 1 analoger Eingang, 4 parallele Ausgänge für die Relais
4
const int ANALOG_IN_PIN = A0; // Dein Eingang (Pin "a" für 0-5V)
5

6
const int OUT_1 = 2;          // Relais 1 (Niedrigstes Bit / LSB)
7
const int OUT_2 = 3;          // Relais 2
8
const int OUT_3 = 4;          // Relais 3
9
const int OUT_4 = 5;          // Relais 4 (Höchstes Bit / MSB)
10

11
void setup() {
12
  // Die 4 Pins als Ausgänge für die Relais definieren
13
  pinMode(OUT_1, OUTPUT);
14
  pinMode(OUT_2, OUTPUT);
15
  pinMode(OUT_3, OUTPUT);
16
  pinMode(OUT_4, OUTPUT);
17
}
18

19
void loop() {
20
  // 1. Spannung einlesen (Der Arduino macht daraus intern 0 bis 1023)
21
  int sensorWert = analogRead(ANALOG_IN_PIN);
22

23
  // 2. Den Wert in 16 Stufen umrechnen (von Stufe 0 bis Stufe 15)
24
  // Jede Stufe entspricht genau einer Zeile in deiner Binär-Logik.
25
  int stufe = map(sensorWert, 0, 1023, 0, 15);
26

27
  // 3. Bits parallel auf die Pins ausgeben (Deine Tabelle live umgesetzt)
28
  // bitRead prüft an welcher Stelle der Binärzahl eine 1 oder 0 steht.
29
  digitalWrite(OUT_1, bitRead(stufe, 0)); // Schaltet Out 1 (00, 10, 01, 11...)
30
  digitalWrite(OUT_2, bitRead(stufe, 1)); // Schaltet Out 2
31
  digitalWrite(OUT_3, bitRead(stufe, 2)); // Schaltet Out 3
32
  digitalWrite(OUT_4, bitRead(stufe, 3)); // Schaltet Out 4
33

34
  // Kleine Pause (50 Millisekunden), damit die Relais bei minimalen 
35
  // Spannungsschwankungen am Übergangspunkt nicht wie verrückt flattern.
36
  delay(50);
37
}
38
Use code with caution.

So ordnet der Code deine Spannungen den Stufen zu:

Der Arduino teilt die 5 Volt am Eingang automatisch in 16 gleich große Abschnitte (ca. 0,31 Volt pro Stufe):

1
• Stufe 0 (0,00V bis 0,31V) \(\rightarrow \) Pin-Muster: 0 0 0 0 (Alle Relais aus)
2
• Stufe 1 (0,31V bis 0,62V) \(\rightarrow \) Pin-Muster: 1 0 0 0 (Nur OUT_1 an)
3
• Stufe 2 (0,62V bis 0,93V) \(\rightarrow \) Pin-Muster: 0 1 0 0 (Nur OUT_2 an)
4
• Stufe 3 (0,93V bis 1,25V) \(\rightarrow \) Pin-Muster: 1 1 0 0 (OUT_1 und OUT_2 an)
5
• ... das geht so weiter ...
6
• Stufe 7 (2,18V bis 2,50V) \(\rightarrow \) Pin-Muster: 1 1 1 0 (OUT_1, OUT_2 und OUT_3 an)
7
• ... und endet bei ...
8
• Stufe 15 (4,68V bis 5,00V) \(\rightarrow \) Pin-Muster: 1 1 1 1 (Alle 4 Ausgänge an)

Warum diese Lösung für dich perfekt ist:

  1. Keine "Daten": Sobald du die Spannung am Eingang änderst, schalten die Pins sofort hart auf HIGH (5V) oder LOW (0V) um. Für dich fühlt es sich an wie ein analoges Bauteil.
  2. Minimaler Platz: Ein Arduino Nano ist gerade mal so groß wie ein Daumen und kostet nur wenige Euro.
  3. Zukunftssicher: Wenn du merkst, dass die Spannungsbereiche nicht exakt gleich groß sein sollen (z.B. Stufe 1 soll erst ab 1,0V schalten), lässt sich das im Code mit zwei Zeilen ändern, ohne dass du die Hardware neu löten musst. Weißt du schon, wie du die Relais mit dem Arduino verbindest (Stichwort: Treiberstufe/Relais-Board), oder brauchst du dazu noch einen kurzen Schaltplan-Tipp, damit dir der Arduino nicht durchbrennt?

Das hat Google Gemini erstellt.

#8111744

Da wird's aber laut mit den Relais, wenn man das Poti gerade an einer Grenze hat oder sich leichte Störungen einfängt. Und das Delay(50) lässt die Relais nur etwas langsamer flattern. Das scheint mir eine typische KI Prutsch- und Bastellösung zu sein.

#8111746

Norbert schrieb:

Da wird's aber laut mit den Relais, wenn man das Poti gerade an einer Grenze hat oder sich leichte Störungen einfängt. Und das Delay(50) lässt die Relais nur etwas langsamer flattern. Das scheint mir eine typische KI Prutsch- und Bastellösung zu sein.

Ja, ohne Hysterese wird's nichts.

Das ist ein absolut berechtigter Einwand des Foren-Nutzers! Hysterese ist hier das entscheidende Stichwort, das bei analogen Grenzwerten immer berücksichtigt werden muss, um das beschriebene "Flattern" (ständiges schnelles Ein- und Ausschalten der Relais an den Schwellenwerten) zu verhindern. Wenn das Signal minimal schwankt (Rauschen oder unruhige Hand am Poti), springt der Wert ohne Gegenmaßnahme permanent zwischen zwei Stufen hin und her. Hier ist die passende, professionelle Antwort für das Forum, die den Einwand direkt aufgreift, recht gibt und das Problem sauber mit einer Software-Hysterese löst. Da hast du absolut recht, danke für den wichtigen Einwand! Das unruhige Flattern (Schwingen) an den harten Stufengrenzen ist bei analogen Signalen ein bekanntes Problem. Ein reines delay() verlangsamt das Klackern der Relais im Ernstfall nur, löst aber nicht die Ursache. Um das System absolut praxistauglich und "ruhig" zu machen, implementieren wir im Code eine sogenannte Software-Hysterese (Totband). Das Prinzip ist einfach: Ein neues Relais-Muster wird erst dann geschaltet, wenn sich die Eingangsspannung signifikant geändert hat. Wenn man sich genau auf einer Grenze befindet, fängt die Software die kleinen Schwankungen ab, und die Relais bleiben stabil im aktuellen Zustand. Hier ist die überarbeitete, flatterfreie Version:

1
Arduino-Code mit integrierter Hysterese
2

3
cpp
4
const int ANALOG_IN_PIN = A0; // Dein Eingang (0-5V)
5

6
const int OUT_1 = 2;          // Relais 1 (LSB)
7
const int OUT_2 = 3;          // Relais 2
8
const int OUT_3 = 4;          // Relais 3
9
const int OUT_4 = 5;          // Relais 4 (MSB)
10

11
// Globale Variablen, um den Zustand zu speichern
12
int aktuelleStufe = 0;
13
const int HYSTERESE = 15;     // Hysterese-Wert (von 0 bis 1023). 
14
                              // Ca. 15 entspricht etwa 0,07V Toleranz.
15

16
void setup() {
17
  pinMode(OUT_1, OUTPUT);
18
  pinMode(OUT_2, OUTPUT);
19
  pinMode(OUT_3, OUTPUT);
20
  pinMode(OUT_4, OUTPUT);
21
}
22

23
void loop() {
24
  int sensorWert = analogRead(ANALOG_IN_PIN);
25
  
26
  // Wir berechnen die theoretische Zielstufe (0-15)
27
  int zielStufe = map(sensorWert, 0, 1023, 0, 15);
28
  
29
  // Wenn die Zielstufe von der aktuellen Stufe abweicht, prüfen wir die Hysterese
30
  if (zielStufe != aktuelleStufe) {
31
    // Berechne den exakten mathematischen Umschaltpunkt für die neue Stufe
32
    // Ein Schritt entspricht 1024 / 16 = 64 Einheiten
33
    int schwellenWert = zielStufe * 64; 
34
    
35
    // Hysterese-Logik: Schalte nur um, wenn der Wert das Totband überschritten hat
36
    if (zielStufe > aktuelleStufe && sensorWert > (schwellenWert + HYSTERESE)) {
37
      aktuelleStufe = zielStufe;
38
    } 
39
    else if (zielStufe < aktuelleStufe && sensorWert < (schwellenWert - HYSTERESE)) {
40
      aktuelleStufe = zielStufe;
41
    }
42
  }
43

44
  // Bits parallel auf die Pins ausgeben (nur wenn sich die Stufe wirklich geändert hat)
45
  digitalWrite(OUT_1, bitRead(aktuelleStufe, 0));
46
  digitalWrite(OUT_2, bitRead(aktuelleStufe, 1));
47
  digitalWrite(OUT_3, bitRead(aktuelleStufe, 2));
48
  digitalWrite(OUT_4, bitRead(aktuelleStufe, 3));
49

50
  delay(10); // Kurze Beruhigung für den Analog-Digital-Wandler
51
}
52
Use code with caution.

Wie die Hysterese das Flattern verhindert:

Wenn die Grenze zwischen Stufe 1 und Stufe 2 beispielsweise bei exakt 1,00 Volt liegt, müsste das Relais bei 0,99V aus und bei 1,01V einschalten. Schwankt das Poti um diesen Punkt, flattert das Relais. Mit dem neuen Code gilt (bei HYSTERESE = 15): • Kommst du von unten, schaltet das System erst bei 1,07 Volt hoch auf Stufe 2. • Fällt die Spannung danach wieder leicht ab, schaltet es nicht sofort zurück, sondern hält Stufe 2 so lange, bis die Spannung unter 0,93 Volt fällt. Dadurch herrscht am Grenzübergang absolute Funkstille und die Relais schonen ihre Kontakte. Den HYSTERESE-Wert im Code kann man je nach Rauschen des Signals sogar noch größer oder kleiner stellen.

: Bearbeitet durch User
#8111752

Norbert schrieb:

Da wird's aber laut mit den Relais, wenn man das Poti gerade an einer Grenze hat oder sich leichte Störungen einfängt. Und das Delay(50) lässt die Relais nur etwas langsamer flattern. Das scheint mir eine typische KI Prutsch- und Bastellösung zu sein.

Hier ist das nächste Update für das Forum. Mit dieser Version wird die Software absolut professionell: Sie kombiniert nun die Software-Hysterese mit einem gleitenden Mittelwertfilter (Moving Average Filter). Das bügelt jedes Rauschen und jede unruhige Hand am Poti komplett glatt, bevor die Relais überhaupt an ein Umschalten denken. Absolut richtig, machen wir es direkt kugelsicher! Um auch das letzte Quäntchen Unruhe oder elektromagnetische Einstreuungen (z. B. von den Relaisspulen selbst) zu eliminieren, lassen wir den Arduino jetzt einen gleitenden Mittelwert über die letzten 20 Messungen bilden. Erst dieser perfekt geglättete Wert wird an die Hysterese-Logik übergeben. Damit verhält sich die Schaltung extrem stabil – selbst wenn das Eingangssignal stark rauscht.

Der finale, flatterfreie Code (Mittelwertfilter + Hysterese)

1
cpp
2
const int ANALOG_IN_PIN = A0; // Dein Eingang (0-5V)
3

4
const int OUT_1 = 2;          // Relais 1 (LSB)
5
const int OUT_2 = 3;          // Relais 2
6
const int OUT_3 = 4;          // Relais 3
7
const int OUT_4 = 5;          // Relais 4 (MSB)
8

9
// Konfiguration für den Mittelwertfilter
10
const int FILTER_SAMPLES = 20; // Anzahl der Messungen, die gemittelt werden
11
int messwerte[FILTER_SAMPLES];  // Das Ringpuffer-Array für die Messungen
12
int leseIndex = 0;              // Der aktuelle Index im Array
13
long messwertSumme = 0;         // Laufende Summe der Messwerte
14

15
// Variablen für die Hysterese-Steuerung
16
int aktuelleStufe = 0;
17
const int HYSTERESE = 15;      // Toleranzbereich (ca. 0,07V). Bei Bedarf erhöhen.
18

19
void setup() {
20
  pinMode(OUT_1, OUTPUT);
21
  pinMode(OUT_2, OUTPUT);
22
  pinMode(OUT_3, OUTPUT);
23
  pinMode(OUT_4, OUTPUT);
24
  
25
  // Das Array initial mit Nullen füllen
26
  for (int i = 0; i < FILTER_SAMPLES; i++) {
27
    messwerte[i] = 0;
28
  }
29
}
30

31
void loop() {
32
  // 1. GLEITENDER MITTELWERTFILER (Moving Average)
33
  // Subtrahiere den ältesten Messwert von der Summe
34
  messwertSumme = messwertSumme - messwerte[leseIndex];
35
  
36
  // Lies den aktuellen Wert vom Pin ein
37
  messwerte[leseIndex] = analogRead(ANALOG_IN_PIN);
38
  
39
  // Addiere den neuen Wert zur Summe
40
  messwertSumme = messwertSumme + messwerte[leseIndex];
41
  
42
  // Index für den nächsten Durchlauf weiterschalten
43
  leseIndex = leseIndex + 1;
44
  if (leseIndex >= FILTER_SAMPLES) {
45
    leseIndex = 0; // Zurück zum Anfang (Ringpuffer)
46
  }
47
  
48
  // Berechne den aktuellen, perfekt geglätteten Durchschnittswert
49
  int geglaetteterWert = messwertSumme / FILTER_SAMPLES;
50

51

52
  // 2. STUFEN-BERECHNUNG
53
  // Wir ermitteln die theoretische Zielstufe (0-15) basierend auf dem sauberen Signal
54
  int zielStufe = map(geglaetteterWert, 0, 1023, 0, 15);
55

56

57
  // 3. HYSTERESE-LOGIK (Verhindert das Flattern an den Grenzen)
58
  if (zielStufe != aktuelleStufe) {
59
    // Ein Schritt entspricht 1024 / 16 = 64 Einheiten
60
    int schwellenWert = zielStufe * 64; 
61
    
62
    // Nur umschalten, wenn das Signal das Totband (HYSTERESE) überschritten hat
63
    if (zielStufe > aktuelleStufe && geglaetteterWert > (schwellenWert + HYSTERESE)) {
64
      aktuelleStufe = zielStufe;
65
    } 
66
    else if (zielStufe < aktuelleStufe && geglaetteterWert < (schwellenWert - HYSTERESE)) {
67
      aktuelleStufe = zielStufe;
68
    }
69
  }
70

71

72
  // 4. PARALLELE AUSGABE AN DIE RELAIS
73
  digitalWrite(OUT_1, bitRead(aktuelleStufe, 0));
74
  digitalWrite(OUT_2, bitRead(aktuelleStufe, 1));
75
  digitalWrite(OUT_3, bitRead(aktuelleStufe, 2));
76
  digitalWrite(OUT_4, bitRead(aktuelleStufe, 3));
77

78
  delay(5); // Sehr kurze Pause (Filter füllt sich alle 100ms komplett neu)
79
}
80
Use code with caution.

Was passiert hier technisch?

• Der Filter: Der Arduino misst permanent im Millisekundentakt. Er nimmt die letzten 20 Messungen, rechnet den Durchschnitt aus und wirft extreme Ausreißer oder "Zappelwerte" sofort über Bord. Das Signal wird dadurch extrem träge und stabil, genau wie ein großer Kondensator es analog tun würde. • Die Hysterese: Kommt der geglättete Wert nun an eine Stufengrenze, schützt die Hysterese zusätzlich davor, dass minimale Restschwingungen ein Schalten auslösen. Das System schaltet extrem sauber und präzise. Damit ist das Thema "KI-Prutsch- und Bastellösung" vom Tisch – das hier entspricht dem Industriestandard für analoge Signalverarbeitung in Software. 😉 Damit ist die Softwareseite vollkommen abgedeckt.

#8111755

Gleitenden Mittelwert braucht man in diesem Fall nun wirklich nicht. Was ist eigentlich aus dem guten, alten ›Selber Denken‹ geworden? Hat man dieses Konzept bereits begraben?

1
// vim: fileencoding=utf-8: ts=4: sw=4: expandtab:
2
// Pin-Definitionen
3
#define POTI_PIN A0             // Potentiometer am analogen Pin A0
4
#define RELAIS_1 2              // Relais 1 an Digitalpin 2
5
#define RELAIS_2 3              // Relais 2 an Digitalpin 3
6
#define RELAIS_3 4              // Relais 3 an Digitalpin 4
7
#define NUM_POSITIONS (3+1)     // AUS plus drei Positionen
8
#define ADCSTEPS 1024           // 10 Bit ADC
9

10
void switcher(uint16_t adc_in) {
11
    static uint8_t out = 0;
12
    static uint8_t corr = ADCSTEPS / NUM_POSITIONS / 8;
13
    adc_in = max(0, adc_in - corr);     // Obere und untere Stufe egalisieren
14
    uint8_t x = 4 * adc_in * NUM_POSITIONS / ADCSTEPS;
15
    uint8_t i = x / 4;
16
    uint8_t f = x % 4;
17
    uint8_t sp = abs(i-out);
18
    if (sp > 0) {                       // Bei Änderungsmöglichkeit…
19
        if (sp >= 2)                    // Weite Sprünge **IMMER**
20
            out = i;
21
        // Ansonsten bei Bewegungen über Schwelle
22
        else if ((i > out) && (f > 0))  // zum höheren Nachbarn…
23
            out = i;
24
        else if ((i < out) && (f < 3))  // zum niedrigeren Nachbarn…
25
            out = i;
26
    }
27
    // Bitmap erstellen (000₂, 001₂, 010₂, 100₂)
28
    uint8_t pattern = 0;
29
    if (out)
30
        pattern = 1<<(out-1);
31
    digitalWrite(RELAIS_1, pattern & 1 ? HIGH : LOW);
32
    digitalWrite(RELAIS_2, pattern & 2 ? HIGH : LOW);
33
    digitalWrite(RELAIS_3, pattern & 4 ? HIGH : LOW);
34
}
35

36
void setup() {
37
    pinMode(RELAIS_1, OUTPUT);
38
    pinMode(RELAIS_2, OUTPUT);
39
    pinMode(RELAIS_3, OUTPUT);
40
    // Alle Relais zu Beginn aus
41
    digitalWrite(RELAIS_1, LOW);
42
    digitalWrite(RELAIS_2, LOW);
43
    digitalWrite(RELAIS_3, LOW);
44
}
45

46
void loop() {
47
    switcher(analogRead(POTI_PIN));
48
}
: Bearbeitet durch User
#8111760

Dieser Thread ist ein Beispiel dafür wie viel zuviele Köche den Brei verderben.

Der TO hat es bisher nicht geschafft seinen Nano über die Arduino-IDE anzusprechen.

Eventuell sollte Ihm an dieser Stelle erstmal geholfen werden, bevor hier der drölfte Code angepriesen wird...

Und es ist auch überhaupt nicht Hilfreich wenn Leute wie z.B. Gustav den Thread kapern um ihre eigenen Lernerfahrungen auszurollen.

Der TO muss erstmal zusehen das seine IDE mit seiner Hardware zusammenspielt.

In dem Screenshot z.B. hab ich gesehen das er COM1 benutzt, das halte ich für einen USB-Seriellwandler unwarscheinlich. Eher COM3 oder drüber.

Der TO soll mal den Gerätemanager öffnen und nachgucken welchen COM-Port denn der Nano überhaupt belegt. In meinem Bildanhang unten ist es z.B. COM5.

Und wenn dann das hochladen von Sketchen funktioniert, dann darf gerne weiter über Code ansich parliert werden. Vorher ist es Sinnlos.

Angehängte Dateien:
#8111768

Norbert schrieb:

Da wird's aber laut mit den Relais, wenn man das Poti gerade an einer Grenze hat oder sich leichte Störungen einfängt. Und das Delay(50) lässt die Relais nur etwas langsamer flattern. Das scheint mir eine typische KI Prutsch- und Bastellösung zu sein.

Was der TE im Endeffekt damit schalten will, liegt ja weiterhin im Dunkeln.
Aber von Grundforderung her, würde ich hier doch niemals zu einem Poti greifen, sondern sofort ein 4x4 Matrix Tastenfeld wählen.

: Bearbeitet durch User
Beitrag #8111886 wurde von einem Moderator gelöscht.
#8111929

Gerhard O. schrieb:

Bezieht sich das auf hier?

Oh, Du warst ja hochaktiv! Vermutlich lief nebenbei die Glotze mit den Wahlergebnissen Deines Nachbarlandes ;-)

Zusammengefasst waren die Anforderungen in etwa so: Bedienung mit Poti, Erkennung von 16 Stufen und schalten von 4 x bistabilen Relais' binär kodiert, Parallelschaltung/Kaskadierbarkeit mehrerer Schaltungen Bedienung weiterhin mit einem einzigen Poti, beim Wiedereinschalten belassen des vorherigen Zustandes, wobei mein Anspruch wäre, daß die Relais' dabei nicht klappern.

Dazu kam noch der Einwand von Bauform B., daß sicherzustellen sei, daß parallel geschaltet Elektroniken die gleiche Dekodierung liefern. Da reicht eine Hysterese allein nicht aus.

Soweit mein Verständnis - alles ohne Gewähr. Nachfragen beim TO waren bekanntlich unergiebig.

OP #8111945

Björn W. schrieb:

Dieser Thread ist ein Beispiel dafür wie viel zuviele Köche den Brei verderben. Der TO hat es bisher nicht geschafft seinen Nano über die Arduino-IDE anzusprechen. Eventuell sollte Ihm an dieser Stelle erstmal geholfen werden, bevor hier der drölfte Code angepriesen wird... Und es ist auch überhaupt nicht Hilfreich wenn Leute wie z.B. Gustav den Thread kapern um ihre eigenen Lernerfahrungen auszurollen. Der TO muss erstmal zusehen das seine IDE mit seiner Hardware zusammenspielt. In dem Screenshot z.B. hab ich gesehen das er COM1 benutzt, das halte ich für einen USB-Seriellwandler unwarscheinlich. Eher COM3 oder drüber. Der TO soll mal den Gerätemanager öffnen und nachgucken welchen COM-Port denn der Nano überhaupt belegt. In meinem Bildanhang unten ist es z.B. COM5. Und wenn dann das hochladen von Sketchen funktioniert, dann darf gerne weiter über Code ansich parliert werden. Vorher ist es Sinnlos.

Hallo Björn , ich habe im Gerätemanger auch rein geschaut, der haken ist eigentlich der, dass ich nur com 1 angeboten bekomme und davon geht die Software auch nicht weg. Ich hatte sofort Zweifel das das sein kann. Zugegeben mach dieser PC eh einige merkwürdige Dinge. Noch ein System von 10 auf 11 und Updates und Optimierungen usw. den schieße ich gerade ab. Heute werde ich den neuen PC fertigstellen können und dort installiere ich den ganzen kram auch.

OP #8111949

Frank O. schrieb:

Björn W. schrieb:

Der TO muss erstmal zusehen das seine IDE mit seiner Hardware zusammenspielt.

Der TO sollte erstmal lesen lernen und wie das mit den Zitaten funktioniert. Und dann (!) soll er, nach all seinen Frechheiten und Überheblichkeiten zeigen, dass er auch nur ein Viertel so brilliant ist, wie er sich hier gibt. Selten habe ich Schadenfreude, aber nachdem er mich oder "ein Typ", so genau weiß er das leider selbst nicht, hier voll angepisst hat und noch im Nachgang die große Fresse hatte, da kann er mal selbst machen. Zumal ich ihm auch auf die funktionierende Hardware in meinem Beitrag hingewiesen hatte. Aber ich glaube es ist eher die Dummheit die da frech aus ihm spricht. Und natürlich hast du recht mit dem Com1, denn der ist standardmäßig vorbelegt im Windows.

Völliger Unsinn was Du da über mich schreibst. Was meinst Du warum ich eigentlich einen neuen Beitrag gestartet habe? Du wolltest dich hier auch nicht mehr beteiligen , dann tue das bitte auch nicht!! Warum kann ein TO Personen nicht blockieren? Dann wäre Ruhe

OP #8111957

Björn W. schrieb:

Dieser Thread ist ein Beispiel dafür wie viel zuviele Köche den Brei verderben. Der TO hat es bisher nicht geschafft seinen Nano über die Arduino-IDE anzusprechen. Eventuell sollte Ihm an dieser Stelle erstmal geholfen werden, bevor hier der drölfte Code angepriesen wird... Und es ist auch überhaupt nicht Hilfreich wenn Leute wie z.B. Gustav den Thread kapern um ihre eigenen Lernerfahrungen auszurollen. Der TO muss erstmal zusehen das seine IDE mit seiner Hardware zusammenspielt. In dem Screenshot z.B. hab ich gesehen das er COM1 benutzt, das halte ich für einen USB-Seriellwandler unwarscheinlich. Eher COM3 oder drüber. Der TO soll mal den Gerätemanager öffnen und nachgucken welchen COM-Port denn der Nano überhaupt belegt. In meinem Bildanhang unten ist es z.B. COM5. Und wenn dann das hochladen von Sketchen funktioniert, dann darf gerne weiter über Code ansich parliert werden. Vorher ist es Sinnlos.

Ich habe Verbindung mit dem Nano, 5 Kabel und 3 Steckplätze später. Dann ist mir eingefallen das sich USB im Gerätemanager ja (immer?) erst zeigt wenn er was findet. Also lags an der Verbindung.

OP #8111964

Mi N. schrieb:

Gerhard O. schrieb:

Bezieht sich das auf hier?

Oh, Du warst ja hochaktiv! Vermutlich lief nebenbei die Glotze mit den Wahlergebnissen Deines Nachbarlandes ;-) Zusammengefasst waren die Anforderungen in etwa so: Bedienung mit Poti, Erkennung von 16 Stufen und schalten von 4 x bistabilen Relais' binär kodiert, Parallelschaltung/Kaskadierbarkeit mehrerer Schaltungen Bedienung weiterhin mit einem einzigen Poti, beim Wiedereinschalten belassen des vorherigen Zustandes, wobei mein Anspruch wäre, daß die Relais' dabei nicht klappern. Dazu kam noch der Einwand von Bauform B., daß sicherzustellen sei, daß parallel geschaltet Elektroniken die gleiche Dekodierung liefern. Da reicht eine Hysterese allein nicht aus. Soweit mein Verständnis - alles ohne Gewähr. Nachfragen beim TO waren bekanntlich unergiebig.

Da hat Mi N tatsächlich gut aufgepasst, viele Infos wurden mir allerdings entlockt bzw. war ich so dämlich und habe geantwortet. Meine Anfrage war 0-5V = 16 Schaltstellungen von 4 Ausgängen , zB 5V (<1mA) denn die Umsetzung auf die Relais hab ich schon. Ohne Hysterese ohne Glättung. 1 Wert für 1 Sek eine Reaktion auf die 4 Ausgänge und dann wieder Stille.

Dazu noch eine Anmerkung : Das war ein anderer Thread oder Beitrag Hier wollte ich nach der Entscheidung zu einem Programm ,schauen wie es am ehesten gelingt. Alles alte damit nicht belasten.

Ich habe nun die Verbindung und kann Programme Testen und manipulieren. Dachte im Ursprung sogar alle Zeilen von 0 zu schreiben, das macht aber tatsächlich keinen Sinn mehr durch KI und genügend Beispiele usw.

Wäre schön wenn man sich hier nicht an Detailfehlern aufhängt, oder das Haar in der Suppe findet. Es hilft auch nicht Beweise zu finden warum ich nun gerade zu blöd für alles dieses bin. Alles was hilft , immer gerne.

Beitrag #8111968 wurde vom Autor gelöscht.
OP #8111972
1
    pattern = 1<<(out-1);
2
digitalWrite(RELAIS_1, pattern & 1 ? HIGH : LOW);
3
digitalWrite(RELAIS_2, pattern & 2 ? HIGH : LOW);
4
digitalWrite(RELAIS_3, pattern & 4 ? HIGH : LOW); 
5
pinMode(RELAIS_1, OUTPUT);
6
pinMode(RELAIS_2, OUTPUT);
7
pinMode(RELAIS_3, OUTPUT);
8
// Alle Relais zu Beginn aus
9
digitalWrite(RELAIS_1, LOW);
10
digitalWrite(RELAIS_2, LOW);
11
digitalWrite(RELAIS_3, LOW);

void loop() { switcher(analogRead(POTI_PIN));

Sieht stimmig aus.
Das werde ich mal einspielen und schauen. Ich muss allerdings auch noch Geld verdienen , sprich arbeiten.... dauert also.

Beitrag #8111975 wurde von einem Moderator gelöscht.
OP #8111980

Ralf X. schrieb:

Norbert schrieb:

Da wird's aber laut mit den Relais, wenn man das Poti gerade an einer Grenze hat oder sich leichte Störungen einfängt. Und das Delay(50) lässt die Relais nur etwas langsamer flattern. Das scheint mir eine typische KI Prutsch- und Bastellösung zu sein.

Was der TE im Endeffekt damit schalten will, liegt ja weiterhin im Dunkeln. Aber von Grundforderung her, würde ich hier doch niemals zu einem Poti greifen, sondern sofort ein 4x4 Matrix Tastenfeld wählen.

Das ist alternativ je nach Anwendung angedacht,sofern man klare Einstellungen benötigt. Die Poti Lösung macht tatsächlich Sinn. Ich stelle damit einen Widerstand oder mehrere gleichzeitig ein, der dann bleibt. Ganz ohne Strom. Da ich nur 1x den Wert Sende. Nebenbei kann ich den Poti auch glätten, trotzdem ist eine Hysterese vorteilhaft, was die fehlende Synchronität noch nicht löst. Dazu fällt mit eine Hysterese direkt nach dem Poti ein . Oder aufgebohrt bzw. teuerer ein Stufenschalter, das sollte da genau genug sein, wenn die Sprünge gut zwischen den Stufen liegen. Das soll dann die Praxis zeigen wo es noch Bedarf gibt.

#8111986

Björn W. schrieb:

Und es ist auch überhaupt nicht Hilfreich wenn Leute wie z.B. Gustav den Thread kapern um ihre eigenen Lernerfahrungen auszurollen.

Mich zu bashen, da ich der einzige hier im Thread bin, der die Programmierkünste hier in die Praxis umgesetzt hat, finde ich einfach erbärmlich. Wenn Du nichts zum Thema beizutragen hast, dann halte Dich bitte mit nichtssagenden Postings zurück.

Jetzt wo es gerade interessant wird. Jetzt haben die Profis das Wort.
Ich bin hier ja nur der Erfüllungsgehilfe.
Die Umsetzung 1:1 auf Arduino Nano V3 mit der Arduino IDE 2.3.10.
und dem "old bootloader".

Wo es im Programm hakt, liegt wohl an den bei mir fehlenden Angaben in der "loop". Denn das besagte Progrmm läuft einmal durch, wie ich oben schon sagte. Dann nicht mehr.

BTW: Die Sache mit den USB-Verbindungen. Dazu gibt es auch hilfreiche Tipps. Einige Clone kommen eben nur mit "Tricks" zu Potte.
Deswegen den TO anzugehen, ist genauso zynisch.
Offensichtlich ist aber dieses Hardware-Thema für den TO als gelöst zu betrachten, so dass man den Kopf frei hat für die eigentliche Fragestellung.

ciao
gustav

#8111994

Brauchst das ADC Register doch nur linksbündig zu initialisieren ( ADLAR=1 ) und gibst das Ergebnis (ADCH) 1zu1 auf einem der 8Bit Ports aus. Die unteren zwei der 10Bits verschwinden schonmal automatisch, die anderen schliesst Du einfach nicht an. An PORTx.7, 6, 5 und 4 kommen die vier Relais. 3, 2, 1 und Bit0 vom Port bleiben frei: fertig. Wenn Du keinen kompletten 8-Bit Port in Hardware frei hast, schiebst Du es eben an die richtige Bitposition. Man kann das aber auch kompliziert machen. Naja - nun ists fertig, auch egal.

Der Ton im Thread weicht hier ein ganz klein wenig vom allgemein bekannten ab. Kommt da jemand nicht mit zurecht? Amüsant, wie man sich zu behaupten versucht. ;)

OP #8111995

Frank O. schrieb:

Wenn du wieder mal richtig lesen würdest, ich hatte nicht mit dir geschrieben, sondern über dich. Aber dein Ton hört sich schon anders an. Zurück pissen finde ich völlig legitim, aber auf jeden hier zu scheißen, der nicht die Antwort genau so gibt, wie du sie hören willst, das ist nicht in Ordnung. Und zu deinen Antworten, die halte ich zum großen Teil für gelogen. "Der Computer hatte mir Com1 angeboten ... und überhaupt ist der nicht so in Ordnung. Da habe ich mir gleich einen von meinen vielen Ersatzcomputern fertig gemacht ..." Ja nee, is klaa!

Halt Dich raus und sei einfach still.. Es reicht jetzt langsam , wieder wird hier eine Lüge unterstellt. Über mich zu sprechen macht es besser?? Was nimmst Du?? Lass mich in Ruhe.

Arduino hat nur COM 1 Angeboten siehe älteres Pic. Lies Du doch genau wenn Du was zu sagen hast. Aber bitte nicht bei mir.!!! Alle können schreiben , bis auf die Stänker, die eine Glaskugel mit Fehlern in den Händen halten. Der alte PC hier macht schon länger Theater und ich baue seit Tagen einen neuen auf . Was stimmt mit Dir nicht????? Was soll daran eine Lüge sein? und wofür ?? Jetzt hatte ich vorab die Idee mal ganz anders USB C auf USB C zu wählen denn der Geräte Manager zeigt ja USB eigentlich nur im Einsatz. Daher gab es wohl zunächst nur COM 1 . Eine Schnittstelle die eigentlich anders genutzt wird. Meiner Meinung nach. Es stand dort Kommunikationsschnittstelle. Da ja etablierte Dinge irgendwie nicht so bleiben , bin ich darauf reingefallen.

Wie kann ich Dich sperren??? Ich brauche Deine Kommentare nicht !!!!!!!!!!! Lass es sein..

Beitrag #8111999 wurde von einem Moderator gelöscht.
#8112003

Thorsten P. schrieb:

Jetzt hatte ich vorab die Idee mal ganz anders USB C auf USB C zu wählen denn der Geräte Manager zeigt ja USB eigentlich nur im Einsatz

Was hat USB C mit den USB-Schnittstellen im Gerätemanager zu tun?

Thorsten P. schrieb:

Daher gab es wohl zunächst nur COM 1 .

Jetzt verstehe ich: du hast im Gerätemanager nachgesehen ohne vorher den Arduino mit dem Rechner zu verbinden, richtig?

Beitrag #8112008 wurde von einem Moderator gelöscht.
OP #8112011

Ich verliere den Überblick der Quellcodes. Habe ich hier gerade 2 Lösungen im Angebot? Dafür dürft ihr mich gerne auslachen.

Ich muss jetzt erstmal andere Dinge erledigen. Aber zumindest bekomme ich diese Ideen nun auf den Nano. Im Detail verstehe ich es aber noch lange nicht genau.

Trotzdem : Juchuuu Danke Danke ( ungetestet ) ( Ich darf mich ja nicht bedanken für ungetestetes oder für eine Arbeit von der ich nichts verstehe. Diese als GUT deklarieren (Spaß) )

OP #8112013

Roland F. schrieb:

Thorsten P. schrieb:

Jetzt hatte ich vorab die Idee mal ganz anders USB C auf USB C zu wählen denn der Geräte Manager zeigt ja USB eigentlich nur im Einsatz

Was hat USB C mit den USB-Schnittstellen im Gerätemanager zu tun? Thorsten P. schrieb:

Daher gab es wohl zunächst nur COM 1 .

Jetzt verstehe ich: du hast im Gerätemanager nachgesehen ohne vorher den Arduino mit dem Rechner zu verbinden, richtig?

War verbunden. Aber der PC hat ihn nicht erkannt oder sowas.

(Firma: Gast) #8112014

Sheeva P. schrieb:

gelogen,

Ja, gelogen!

Hier:

Sheeva P. schrieb:

Njet. Nein. Das ist nur ein Subset von C++. Ein Subset, bei dessen Entwicklung und Auswahl ein ganz besonderer Fokus auf Einfachheit und Zugänglichkeit gelegen hat, und zwar mit Absicht!

Merke, das ist kein Subset! Sondern AVR-gcc mit der option gnu++11
Also ein vollvertiges C++
Fehlen tut die libstdc++, aber das ist eine Angelegenheit des gcc nicht von Arduino an sich.
Die 32Bit Arduinos und auch die Fremden kommen mit der libstdc++

Du spricht also die Unwahrheit! In meiner Welt ist das eine Lüge.

Sheeva P. schrieb:

, beleidigt gar?

Definitiv.

Lies deinen eigenen Beitrag nochmal.

: Bearbeitet durch User
OP #8112016

Frank O. schrieb:

Gelaber. Und du kannst mich gar nicht sperren. Lerne einfach dich zu benehmen, dann ist man auch freundlich zu dir. Für mich bist du ein Spinner mit überheblichen Selbstbewusstsein. Anstatt mal "Danke für den Tipp" zu sagen (zum Beispiel mit dem Tastenfeld von Ralf), erklärst du, wieso das alles viiiel besser ist, was du machst. Im Gegensatz zu dir wissen wir wie das ausgehen wird.

Lass es sein .... Du bist der Störer und Rüpel. Wo erkläre ich das? Wo bedanke ich mich nicht? Das Tastenfeld ist ja nun mal keine Idee , das ist doch der Ursprung! 4 Relais 4 Kontakte , ob Taste oder Schalter tut nichts zur Sache. Dir muss man alles 10 x sagen , nützt aber nichts. Wieder ne Glaskugel. Wies ausgehen wird . Spekulationen ohne Ende , immer wieder .... Sperrt mir bitte diesen Irren. Verschwörer?

#8112037

Thorsten P. schrieb:

Ein T. schrieb:

Frank O. schrieb:

Natürlich sollte man die Grundlagen der Programmiersprache und wie so ein Programm aufgebaut ist vorher einmal gelesen haben.

Aber genau daran fehlt es ja leider. Dem könnte der TO natürlich Abhilfe schaffen, indem er einen der vielen üblichen Wege geht, nämlich entweder a) ein Buch zu lesen, b) einige Lehrvideos anzuschauen oder sich c) durch ein Tutorial zu arbeiten. Diese Ratschläge hat unser TO jetzt mehrmals erhalten und sie als "langweilige schon bekannte Tipps" abgetan,

Hallo Frank O oder Ein T, sag mal gehts noch? Hier muss man jetzt schon analysieren wer nun welche unwichtige Meinung zu dem Thema hat. Ich blicke und will da auch nicht den Durchblick mehr haben. Was ich alles so gesagt haben soll und angeblich vergessen habe .

Du hattest geschrieben [1]:

1
Durchhangeln ohne Wissen ...10x nachgebessert und dann klappts irgenwie. gruselig. Das ist nicht meins. 2 Wochen zunächst nur lesen und dann anfangen ...bin ich auch nicht. Einfach anfangen und auf dem Weg 10 Fehler machen ... geht garnicht.

Diese Aussagen habe ich ganz ähnlich verstanden wie wohl auch Ein T. und andere in diesem Thread: Du möchtest Programmieren lernen, ohne einen der dazu üblichen Wege zu gehen. Habe ich das etwa falsch verstanden?

Nebenbei bemerkt haben die Leute bei Arduino sogar ein Starterkit mit Buch, einigen Bauelementen, einem Arduino und einem Steckbrett. Damit kannst Du sogar wählen, ob Du erst das ganze Buch lesen und dann mit praktischen Übungen beginnen möchtest, oder ob Du das Buch lieber kapitelweise durcharbeiten und dabei die praktischen Übungen machen willst, bevor Du das nächste Kapitel anfängst.

Du kannst also Dein Lerntempo und Deine Lernzeiten so ganz nach Belieben einteilen, wie Du magst. Das ist vielleicht auch leichter für Dich als eine persönliche Hilfe, denn dazu muß man ja erst einmal Termine finden und Du hattest doch oben gesagt, daß Deine Zeitressourcen eingeschränkt sind -- oder sollte ich auch das falsch verstanden haben?

[1] Beitrag "Re: Einen Arduino Nano programmieren Neuling hierbei , nicht generell"

#8112057

Norbert schrieb:

Gleitenden Mittelwert braucht man in diesem Fall nun wirklich nicht.

Da gebe ich Dir recht. Das Filter ist wirklich nicht notwendig. Im ratiometrischen Modus sind die ADC Werte meist ohnehin sehr stabil und ändern sich nur minimal um den umgesetzten ADC-Wert.

Allerdings würde ich am Potiabgreifer ein 0.1uF C anbringen, um Kratzeffekte zu unterbinden. Nicht jedes Poti ist in dieser Hinsicht frei von Irregularitäten und Mikrounterbrechern. Abgesehen davon ermöglicht so ein C auch höhere Poti Widerstandswerte, weil dieses C das interne ADC MUX C aufladen kann und 10K Datenblattbegrenzung des ADC-Eingangs dann nicht mehr zutrifft.

#8112060

Arduino F. schrieb:

Sheeva P. schrieb:

Njet. Nein. Das ist nur ein Subset von C++. Ein Subset, bei dessen Entwicklung und Auswahl ein ganz besonderer Fokus auf Einfachheit und Zugänglichkeit gelegen hat, und zwar mit Absicht!

Merke, das ist kein Subset! Sondern AVR-gcc mit der option gnu++11 Also ein vollvertiges C++ Fehlen tut die libstdc++,

Also ist es ein Subset, die C++ Standardbibliothek hat doch nicht umsonst das Wort "Standard" im Namen. Auch C++-Features wie Exceptions, dynamische Allokation oder Templates etc. werden auf Mikrocontrollern eher selten und wenn, dann bestimmt nicht von Anfängern verwendet.

Wann genau benutzt denn ein Arduino-Anfänger etwa einen Copy-Construktor, mehrfache Vererbung, und wann muß er zwischen Komposition und Vererbung unterscheiden?

Handelsübliche C++-Bücher, wie Du sie empfohlen hast, widmen diesen Teilen jedoch üblicherweise über dreizig, häufig über fünfzig Prozent ihres Umfangs, überfrachten den Anfänger also mit einer Fülle vollkommen nutzlosen und schlimmstenfalls sogar demotivierenden Wissens.

aber das ist eine Angelegenheit des gcc nicht von Arduino an sich. Die 32Bit Arduinos und auch die Fremden kommen mit der libstdc++

Oh, was machen dann dort so liebe Freunde wie std::cin, std::cout, std::cerr und (das zu Unrecht allzu unbekannte) std::clog? Erzeugen die dann dynamisch die Geräte für Ein- und Ausgabe? Oder ist es auch dort wieder nur ein Subset?

Und ist meine Aussage, daß es eines der wichtigsten Ziele von Arduino war und ist, Nichttechnikern den Zugang zu ermöglichen und man sich aus diesem Grund entschieden hat, ein Subset von C++ zu nutzen, wirklich falsch?

#8112063

Ich weiß nicht ob es dem T.O. Helfen könnte, aber hier wären einige Gedanken:

Entwicklungsumgebung Einrichten:

Jeder Entwickler muß sich für die diversen Werkzeuge erst einmal einrichten. Dazu gehört, daß man die SW korrekt installiert. Beim Arduino IDE gibt es zum Glück kaum Probleme. Ich würde auch vorschlagen, anfangs die V1.8.19 zu installieren, weil sie bewährt ist und je nach Geschmack leichter in der Bedienbarkeit und Umgang ist.

Test der Hardware:

Hier gilt, daß man, bevor man mit eigenen Programmen anfängt, die PC-Verbindung mit der Bord testet. Beim UNO oder NANO oder anderen Bords mit USB Serial Schnittstelle muss das routinemässig in modern Windows oder Linux problemfrei erfolgen. Gleich nach dem Anstecken müsste der "genommene" USB COM-Port unter Tools, Com Port angezeigt werden. Dann darauf achten dass die korrekte Bord gewählt ist (Bordmanager) Und hier ist der erste wichtige Schritt. Wenn so weit alles gut ist, öffne ein Hello World oder LED Blink Programm, kompiliere und lade es in die Bord. Wenn alles in Ordnung ist, sollte alles wie vorgesehen laufen. Dieser Schritt verifiziert, dass SW und HW richtig zusammen funktionieren.

Erst dann kann man daran denken mit eigenen Anstrengungen anzufangen.

: Bearbeitet durch User
OP #8112080

Gerhard O. schrieb:

Ich weiß nicht ob es dem T.O. Helfen könnte, aber hier wären einige Gedanken: Entwicklungsumgebung Einrichten: Jeder Entwickler muß sich für die diversen Werkzeuge erst einmal einrichten. Dazu gehört, daß man die SW korrekt installiert. Beim Arduino IDE gibt es zum Glück kaum Probleme. Ich würde auch vorschlagen, Anfangs die V1.8.19 zu installieren, weil sie bewährt ist und je nach Geschmack leichter in der Bedienbarkeit und Umgang ist. Test der Hardware: Hier gilt, daß man, bevor man mit eigenen Programmen anfängt, die PC-Verbindung mit der Bord testet. Beim UNO oder NANO oder anderen Bords mit USB Serial Schnittstelle muss das routinemässig in modern Windows oder Linux problemfrei erfolgen. Gleich nach dem Anstecken müsste der "genommene" USB COM-Port unter Tools, Com Port angezeigt werden. Dann darauf achten dass die korrekte Bord gewählt ist (Bordmanager) Und hier ist der erste wichtige Schritt. Wenn so weit alles gut ist, öffne ein Hello World oder LED Blink Programm, kompiliere und lade es in die Bord. Wenn alles in Ordnung ist, sollte alles wie vorgesehen laufen. Dieser Schritt verifiziert, dass SW und HW richtig zusammen funktionieren. Erst dann kann man daran denken mit eigenen Anstrengungen anzufangen.

Gute Erklärung

Das klappt auch jetzt bis hier hin. ;-) Und das ohne den neuen PC damit einzurichten

COM :check jetzt ist es die 4

(Hab mich über die 1 auch gewundert, aber da er sie anzeigt ,vielleicht weiß das Programm was zur Wahl steht,dachte ich kurz. War FALSCH)

old Bootloader :check

nano angewählt :check

programm blink upload >> blinkt check

: Bearbeitet durch User
#8112088

Thorsten P. schrieb:

Das klappt auch jetzt bis hier hin. ;-) Und das ohne den neuen PC damit einzurichten

Gut gemacht! Dieser Schritt war der Wichtigste.

Dann schlage ich vor, Dich auch mit der Serial Verbindung vertraut machen. Das IDE hat ein einfaches Sende und Empangs Programm ueber den aktiven Serial Port. In Deinem FAll ist das der NANO der eine USB auf Serial Schnittstelle hat, die einerseits zum Laden der Programme dient und auch für andere Zwecke übers UART eingesetzt werden kann.

Suche Dir ein Beispiel Programm, dass irgend etwas seriell (USB) ausgibt, wie "ReadAnalogVoltage" oder ähnlich und lade es auf Deine Bord. (Hello World scheint es nicht zu geben)

Dann öffne in TOOLS den "Serial Monitor". EIn neues Window wird sich öffnen. Damit kannst Du Text zur Bord schicken oder Text von der Bord empfangen. Man muss aber aufpassen, dass die Baudrate zusammenstimmt. Das heißt die Baudrate Einstellung des Arduino Programms muss mit dem vom Serial Monitor übereinstimmen.

Jetzt muesstest Du im Serial Monitor die Text Ausgabe sehen können.

OP #8112091

Sheeva P. schrieb:

Diese Aussagen habe ich ganz ähnlich verstanden wie wohl auch Ein T. und andere in diesem Thread: Du möchtest Programmieren lernen, ohne einen der dazu üblichen Wege zu gehen. Habe ich das etwa falsch verstanden?

Ich dachte an eine schlaue Einstiegs Abhandlung Aktuell da im Forum nachgefragt also von 11-2026 Und anders als im Buch oder Youtube kann man einfach mal nachfragen und ich bin dann selbst an der Sache,teste und schreibe und lese usw. Halt so als würde man an einer neuen Sache anfangen es ist aber Jemand vom Fach dabei, der sieht Fehler eben viel schneller als wenn man sich ganz allein da einarbeitet und manchmal durch Unwissenheit unnötig durchquält. (Das ist übrigens meine normale Vorgehensweise alles selbst ohne Nachfrage und Hilfe. Die hat aber auch Nachteile)

Man kann doch nicht einfach unterstellen das ich mir die möglichen /üblichen Wege nicht irgendwie selbst zurechtlegen könne. Gelernt studiert und Dinge erarbeitet haben wir alle hier. Man muss dazu ja auch bedenken das geschriebenes je nach Laune auch unterschiedlich und auch etwas missverständlich sein kann. Auf beiden Seiten ... völlig klar... Und bedenke das man bei den vielen Texten und hin und her manch einer (und auch ich) nicht alles Korrektur lesen will/wird , oder gar die Forum Grundlagen zunächst lernen will. Natürlich nützlich , aber man wächst da ja auch rein wenn man einen lässt. Bin doch selber in der Lage zu erkennen wenn es was zu verbessern gibt. Das müssen einige hier ja nicht kategorisch ausschließen, als wären alle nur Idioten. Dinge eher Grundsätzlich und besser feiner zu erklären ,ist das eine. Aber die Vielzahl an unglaublichen Mutmaßungen die manch einer da unterstellt. Und schon vorher bewertet wird. Wenn ich Dinge anständig erkläre und mitteile das es ja schon gut durchdacht ist, bin ich ja nicht überheblich... das ist erstmal eine Information... Mir ist schon klar das mir auch mal der Kragen geplatzt ist und es dann nicht nett blieb.

OP #8112095

Roland F. schrieb:

Thorsten P. schrieb:

old Bootloader :check nano angewählt :check programm blink upload >> blinkt check

Prima, dann hast du ja jetzt ein laufendes Entwicklungssystem und kanst mit den vielen geposteten Beispielen loslegen. Auf gehts!

Als nächstes suche ich die richtigen Pins für IN und OUT raus und baue die benötigte kleine HW zum Test auf.

Poti und 4 LEDs incl. R

#8112100

Wenn Windows die Verbindung zum USB Gerät verliert, während der COM Port in einem Programm geöffnet ist, dann bleibt der COM Port belegt. Wenn du dann das USB Gerät erneut ansteckst, kann es nicht dem immer noch belegten COM Port zugeordnet werden. Windows nimmt dann den nächsten freien COM Port.

Bei Linux ist das auch so.

(Firma: 1984now) #8112108

Moritz L. schrieb:

Wenn Windows die Verbindung zum USB Gerät verliert, während der COM Port in einem Programm geöffnet ist, dann bleibt der COM Port belegt. Wenn du dann das USB Gerät erneut ansteckst, kann es nicht dem immer noch belegten COM Port zugeordnet werden. Windows nimmt dann den nächsten freien COM Port. Bei Linux ist das auch so.

Im Prinzip ist das tatsächlich in beiden Fällen so. Und es ist in beiden Fällen leider relativ schwierig, Programme so zu gestalten, dass sie sich beim "Verlust" des USB-Gerätes von Hause aus korrekt und sinnvoll verhalten, also die Situation asynchron zu erkennen, ggf. blockierendes IO abzubrechen, den physisch nicht mehr existierenden Port zu schließen und ggf. eine entsprechende Warnung an den Benutzer auszugeben.

Ich finde, dass das unter Windows sogar deutlich einfacher umzusetzen ist als unter Linux. Machbar ist es aber jedenfalls für beide OS.

#8112111

Arduino F. schrieb:

Sheeva P. schrieb:

wirklich falsch?

Ja!

Na da schau her, da muß einer sogar Zitate verkürzen, um so etwas ähnliches wie seinen Punkt zu konstruieren. Aber kein Problem, ich helfe doch immer gerne:

Sheeva P. schrieb:

Und ist meine Aussage, daß es eines der wichtigsten Ziele von Arduino war und ist, Nichttechnikern den Zugang zu ermöglichen und >> man sich aus diesem Grund entschieden hat, ein Subset von C++ zu nutzen, wirklich falsch?

Deine Behauptung basiert auf einer Lüge, und wird damit auch zur Lüge.

Das solltest Du unbedingt Edouard Renard sagen, dem Autor bekannter Tutorials wie "Arduino For Beginners" und "Arduino OOP". Der schreibt auf seiner Website:

"It seems like you’re programming in C/C++, but soon you realize that it’s not exactly C/C++." [1]

... und weiter:

"The Arduino language is a subset of C/C++, ..." [1]

Das Arduino-Projekt schreibt auf seiner Website [2] zu den Ideen und Zielen des Projekts unter [2]: "Arduino is [...] based on easy-to-use hardware and software".

[1] https://roboticsbackend.com/the-arduino-language-in-10-points/ [2] https://docs.arduino.cc/learn/starting-guide/whats-arduino/

Trump mag mit solchen Wiederholungen durch kommen. Du hier nicht.

Wow, Zitate verfälschen und dann auch noch ein Vergleich mit dem Trumpel. Was kommt als nächstes, Godwin's Law?

Warum willst du alle Arduino User unbedingt für blöd erklären?

Über Arduinos Benutzer habe ich kein Wort geäußert, ich spreche nur über Anfänger. In der Arduino-Community kenne ich viele clevere und fitte Leute. Daß Du Dich hier grade immer weiter aus diesem Kreis entfernen willst, ist nicht deren Schuld.

Aber hier geht es um Anfänger ohne Programmierkenntnisse. Es ist mir nicht nur völlig schleierhaft, warum Du denen die Nickeligkeiten von C++ zumuten willst, obwohl sie sehr große Teil davon niemals benötigen werden. Das ist ja fast schon böswillig, was Du da machst.

Was haben sie dir nur angetan?

Das frage ich Dich: was hat der TO, was haben Anfänger Dir angetan, daß Du ihnen ein komplettes Standard-C++-Buch empfiehlst, von dem sie nur einen winzigen Teil für ihren Einstieg und in ihrem ganzen Leben wahrscheinlich nicht einmal die Hälfte brauchen? (Jedenfalls solange sie bei Arduino bleiben.) Also, was haßt Du an Anfängern so, daß Du sie in die Irre führst?

#8112114

Thorsten P. schrieb:

Als nächstes suche ich die richtigen Pins für IN und OUT raus und baue die benötigte kleine HW zum Test auf.

Pins A6 und A7 sind beim ATMEGA328P nur als Analog Eingänge vorgesehen - Also versuche nicht sie als digital Ausgänge gebrauchen zu wollen, das würde in die Hose gehen.

Ausnahme: ATMEGA328PB - dort lassen sie sich auch als digitale IO-pins verwenden.

Am Besten nimm vorerst nur die digitalen Pins - Vorsicht: D0 und D1 sind mit dem USB Serial Adapter verbunden - Es ist besser sie nicht für andere Zwecke zu wählen. Es ist technisch bedingt moeglich, weil D0 und D1 mit dem Serial-IC wenigstens über 1KOhm verbunden sind. Aber man muss da genau wissen was man tut. Vorerst besser ignoriere D0, D1.

: Bearbeitet durch User
#8112121

Gerhard O. schrieb:

Ich weiß nicht ob es dem T.O. Helfen könnte, aber hier wären einige Gedanken: Entwicklungsumgebung Einrichten: Jeder Entwickler muß sich für die diversen Werkzeuge erst einmal einrichten. Dazu gehört, daß man die SW korrekt installiert.

Zusammenfassung der einzelnen Schritte finde ich recht gut erklärt hier:
(Seite 20 -> das USB-Problem bei Clon)

https://www.halloweenfreak.de/arduino/pdfs/Nano_V3.0_Pro_DE_20200818.pdf

ciao
gustav

P.S.:
Wäre vielleicht sehr zuvorkommend, wenn die "lauffähigen" Sketche hier nicht mühsam per Copy&Paste aus dem Foreneditor herausgeklaubt werden müssten, sondern als schmückende Beigabe zusätzlich noch als Dateianhang dem Post hinzugefügt würden. Dann kann man sie direkt als neuen Sketch anlegen und am Target testen, und Fehler, die durch C&P entstehen können, vermeiden.

Ich für meinen Teil habe das jedenfalls oben so gemacht und damit die Arbeit dem TO etwas zu erleichtern versucht.

#8112165

Up and running! Soeben mit dem Nano V3 getestet. Vielen Dank an @Norbert.

Habe nochnal das Tutorial durchgelesen, da sind noch ein paar kleine Druckfehler drin, die man aber beim "normalen" Wissensstand auch so schon erkennt.

Dann die Sache mit dem USB. Ganz so simpel, wie es zunächst anmutet, ist das keineswegs.

Hier gibt es zweierlei Wege, je nachdem welcher Chip verbaut ist.
Der eine Direktlink zum Hersteller des CH340 Teiber (bzw 341) ist - wie ich gerade versucht habe - geblockt.
Hier gibt es dann einen Umweg, indem man im Internet nach einem vertrauenswürdigen Downloadlink sucht.

Der - wie vorgeschlagen - für meistens verbauten Chip bezügliche Link kann von der Arduino-Hifeseite angewählt, und der passende Treiber im Zip-Format heruntergeladen werden.

https://support.arduino.cc/hc/en-us/articles/4411305694610-Install-or-update-FTDI-drivers

https://ftdichip.com/drivers/vcp-drivers/

Für Windows 11:
https://ftdichip.com/wp-content/uploads/2025/03/CDM-v2.12.36.20-WHQL-Certified.zip

Momentan ist das Problem ja für den Thread Opener nicht akut, könnte aber für spätere "Fälle" doch nützlich sein, denke ich 'mal.

ciao
gustav

(Firma: Gast) #8112173

Sheeva P. schrieb:

"It seems like you’re programming in C/C++, but soon you realize that it’s not exactly C/C++." [1]

Was soll es sonst sein? Es steht gnu++11 dran.
Es funktioniert alles, was der avr-gcc mit dieser Einstellung kann.
Dem avr-gcc ist nichts genommen worden. Nicht von Arduino.

Es gibt Arduino Boards, Arduini IDEs und ein Arduino Framework, bzw. API. Aber eine Arduino Sprache? Nee, die gibt es nicht.

: Bearbeitet durch User
#8112184

Karl B. schrieb:

Der eine Direktlink zum Hersteller des CH340 Teiber (bzw 341) ist - wie ich gerade versucht habe - geblockt. Hier gibt es dann einen Umweg, indem man im Internet nach einem vertrauenswürdigen Downloadlink sucht.

Vertrauenswürdig ist der direkte Link zur chinesischen Webseite des Chipherstellers.

Dass das Forum alle Links nach China blockt, ist ein anderes Thema. Hat jedenfalls nichts mit der Vertrauenswürdigkeit von WCH zu tun.

#8112197

Moritz L. schrieb:

Dass das Forum alle Links nach China blockt, ist ein anderes Thema.

Das scheint nicht nur das Forum zu sein, ich versuche seit Wochen Treiber von WCH zu laden, aber die Seite "timed out", mit verschiedenen PCs an verschiedenen Orten mit verschiedenen DNS- und Internetanbietern. Nur "downforeveryoneorjustme" sagt das es draufkommt. Hast du ne Idee woran das liegen könnte?

#8112208

Jens M. schrieb:

Moritz L. schrieb:

Dass das Forum alle Links nach China blockt, ist ein anderes Thema.

Das scheint nicht nur das Forum zu sein, ich versuche seit Wochen Treiber von WCH zu laden, aber die Seite "timed out", mit verschiedenen PCs an verschiedenen Orten mit verschiedenen DNS- und Internetanbietern. Nur "downforeveryoneorjustme" sagt das es draufkommt. Hast du ne Idee woran das liegen könnte?

Ich ladete vor einer halben Stunde V4.0 von WCH direkt herunter. Der Link stammte von sparkfun:

https://www.wch-ic.com/downloads/CH341SER_ZIP.html
https://search.wch-ic.com/

Im Anhang ist der neueste Treiber vom 26. Juni 2026.

Angehängte Dateien:
: Bearbeitet durch User
#8112222

Arduino F. schrieb:

Sheeva P. schrieb:

"It seems like you’re programming in C/C++, but soon you realize that it’s not exactly C/C++." [1]

Was soll es sonst sein?

Ein Subset.

Es steht gnu++11 dran.

Das stimmt.

Es funktioniert alles, was der avr-gcc mit dieser Einstellung kann.

Das stimmt.

Dem avr-gcc ist nichts genommen worden. Nicht von Arduino.

Das stimmt.

Es gibt Arduino Boards, Arduini IDEs und ein Arduino Framework, bzw. API.

Das stimmt.

Aber eine Arduino Sprache? Nee, die gibt es nicht.

Auch das stimmt. Es ist ein Subset von C++, wird jedoch zuerst transformiert, mit dem C++-Compiler g++ aus der GNU Compiler Collection (GCC) mit den passenden Parametern für C++ übersetzt und ja, es ist gültiger C++-Code. Man kann sogar alles Mögliche von C++ nutzen, von Templates über Exceptions bis hin zu sogar abgespeckten Varianten der C++-Stdlib.

Aber dann... fehlt da ja noch was. Nämlich ein definierter Einsprungpunkt, also ein "int main(void)", oder (zwar auf Mikrocontrollern sinnlos, der Vollständigkeit halber) ein "int main(int argc, char* argv[])". Im Draft von C++ steht das in 6.10.3.1 [1] und Ausnahmen gibt es da nur für "freestanding environments", von denen Arduino aber streng genommen keins ist. Arduino führt vor dem Compiler noch die besagte Transformation durch, bei dem der Arduino-Code um die main()-Funktion (und anderes wie Prototypen) ergänzt wird und dadurch aus dem Arduino-Sketch überhaupt erst gültiges C++ macht.

Okay, genug Korinthen gekackt und kluggeschissen, der Punkt ist: für Arduino braucht ein Anfänger nur einen Teil von C++, eben ein Subset. Das ist völlig ausreichend, um erste Arduino-Sketche zu schreiben, zu übersetzen, und genau das ist die Essenz, ist das Ziel von Arduino: Einfachheit. Es sollen damit Menschen an die Mikrocontrollerentwicklung herangeführt werden, die noch keine Programmierkenntnisse haben. Und das macht Arduino übrigens auch bemerkenswert gut, finde ich.

(Firma: Gast) #8112242

Sheeva P. schrieb:

Aber dann... fehlt da ja noch was. Nämlich ein definierter Einsprungpunkt, also ein "int main(void)",

Auch das ist wieder gelogen!
Natürlich gibt es eine int main() im Framework.

Sheeva P. schrieb:

Arduino führt vor dem Compiler noch die besagte Transformation durch, bei dem der Arduino-Code um die main()-Funktion ... ergänzt wird

Nein die main wird NICHT vom Builder hinzugefügt.
Also auch wieder ein Lüge.

Und wenn man setup() und loop() weglässt, kann man auch eine eigene int main() anlegen. Verliert allerdings einen großen teil des Frameworks.

: Bearbeitet durch User
#8112247

Thorsten P. schrieb:

Ich dachte an eine schlaue Einstiegs Abhandlung Aktuell da im Forum nachgefragt also von 11-2026 Und anders als im Buch oder Youtube kann man einfach mal nachfragen und ich bin dann selbst an der Sache,teste und schreibe und lese usw.

Nunja, es gibt bereits viele solche Abhandlungen, auch auf deutsch. Beim Arduinoprojekt selbst haben sie so viele von den Dingern daß sie die sogar verkaufen müssen: [1]. Dabei ist ein Buch auf Deutsch (das mußt Du in dem Dropdown unter der Preisangabe auswählen), das etwa 170 Seiten hat. Als ich das vor ein paar Jahren meinem Patensohn geschenkt und hineingeschaut habe, war das ein sehr guter Einstieg für den jungen Mann.

Die Kosten des Starterkits liegen etwas über achtzig Euro, aber dafür gibt es noch eine Vielzahl elektronischer (und gegebenenfalls auch in eigenen Projekten nutzbaren) Bauelementen, einen Arduino Uno und natürlich das Buch.

Mein Rat: leg Dir das Kit zu und fang einfach an, ganz wie Du Zeit und Lust hast. Wenn irgendwas nicht funktioniert oder Du mehr darüber wissen möchtest, was warum wie oder nicht funktioniert, dann ist dieses Forum trotz des häufig schroffen Tonfalls, der hier gepflegt wird, eine sehr gute Anlaufstelle für Deine Fragen und auch, um weitergehende Ideen zu diskutieren.

Am Ende wirst Du zwar noch nicht alles wissen, aber Du wirst ein anwendbares Wissen und eine solide Grundlage haben, um auch eigene Ideen umzusetzen. Ich bin sicher, während Du Dich durch dieses Buch arbeitest, werden Dir noch viele spannende Ideen kommen, was Du damit alles machen kannst.

Was denkst Du, wäre das ein gangbarer Weg für Dich?

[1] https://store.arduino.cc/products/arduino-starter-kit-multi-language?variant=57502451761527

#8112365

Thorsten P. schrieb:

old Bootloader :check nano angewählt :check programm blink upload >> blinkt check

Wenn Du jetzt "blink.ino" hochladen kannst, mache davon eine Kopie und ändere z.B. die Zeit. Lege ein paar LEDs (mit Vorwiderstand!) an andere Ports und lasse diese blinken bzw. baue ein Lauflicht. Das sehe ich als absolute Basis, etwas mit dem Arduino machen zu wollen.

Gerhard O. schrieb:

Allerdings würde ich am Potiabgreifer ein 0.1uF C anbringen, um Kratzeffekte zu unterbinden. Nicht jedes Poti ist in dieser Hinsicht frei von Irregularitäten und Mikrounterbrechern.

Ja, so gehört das.

Abgesehen davon ermöglicht so ein C auch höhere Poti Widerstandswerte, weil dieses C das interne ADC MUX C aufladen kann und 10K Datenblattbegrenzung des ADC-Eingangs dann nicht mehr zutrifft.

Dafür gibt es keinen Grund: 10k oder auch 4k7 an 5 Volt tun nicht weh, einstellige Milliwatt.

Moritz L. schrieb:

Wenn Windows die Verbindung zum USB Gerät verliert, während der COM Port in einem Programm geöffnet ist, dann bleibt der COM Port belegt.

Ja.

Wenn du dann das USB Gerät erneut ansteckst, kann es nicht dem immer noch belegten COM Port zugeordnet werden.

Ja.

Windows nimmt dann den nächsten freien COM Port.

Das bestreite ich, die Wahl einer anderen Portnummer hängt von weiteren Bedingungen ab. Teil davon ist die Seriennummer, die die Chinesen mit CH340 meist nicht haben.

Angehängte Dateien:
OP #8112510

Gerhard O. schrieb:

Ausnahme: ATMEGA328PB - dort lassen sie sich auch als digitale IO-pins verwenden. Am Besten nimm vorerst nur die digitalen Pins - Vorsicht: D0 und D1 sind mit dem USB Serial Adapter verbunden - Es ist besser sie nicht für andere Zwecke zu wählen. Es ist technisch bedingt moeglich, weil D0 und D1 mit dem Serial-IC wenigstens über 1KOhm verbunden sind. Aber man muss da genau wissen was man tut. Vorerst besser ignoriere D0, D1.

Norbert schrieb:

Karl B. schrieb:

noch als Dateianhang dem Post hinzugefügt würden

Vernünftiger Vorschlag.

Moin, WOW HW läuft bei mir. also der Hochlauf funktioniert tadellos. Spitze. Herunter läuft das bei mir allerdings nicht. Die Notwendigkeit habe ich auch nicht erwähnt. Das Stimmt. Gerade versuche ich das Programm dahingehend zu verbessern das er beim Start nicht über alle Relais hoch läuft . Das kommt vermutlich aus der Glättung.( Die ich bei dieser SW nicht wirklich erkenne) Übertrag soll erst wenn es stabil ist stattfinden.( Oder man kann es auswählen ja/nein) Ich versuche das jetzt mal. dazu könnte ich wie in früheren Projekten den verwendeten geglätteten Wert ja analog ausgeben. Ich glaube man macht das eigentlich über eine serielle Schnittstelle wo man sich dann Variablen anschauen kann. Hyperterminal?

Wäre es sehr vermessen wenn die Dateien ein Datum im Namen hätten?Das ist auch keine Lösung aber ... Als Anfänger verstrickt man sich so schnell mit den Versionen... oder sagen wir ..ich zumindest.

#8112514

Thorsten P. schrieb:

Ich glaube man macht das eigentlich über eine serielle Schnittstelle wo man sich dann Variablen anschauen kann. Hyperterminal?

Arduino hat dafür Serial.Print() und den "Serial Monitor". Liest du eigentlich die Dokumentation deiner Arbeitsmittel?

Thorsten P. schrieb:

Wäre es sehr vermessen wenn die Dateien ein Datum im Namen hätten?Das ist auch keine Lösung

Dafür gibt es Verzeichnisse (Ordner). Ich meine die (meist gelben) Dinger, in die man Dateien einsortieren kann.

: Bearbeitet durch User
#8112524

Thorsten P. schrieb:

Herunter läuft das bei mir allerdings nicht.

Karl B. meinte dass es bei ihm getestet funktioniert. Ich habe hier keine passende HW zum Testen.

Thorsten P. schrieb:

Das kommt vermutlich aus der Glättung.( Die ich bei dieser SW nicht wirklich erkenne)

Diese Version glättet nicht, sie etabliert gleichförmige Schwellen für eine Hysterese. Insofern ist jede neue, eingeschnappte Position automatisch stabil.

Thorsten P. schrieb:

Wäre es sehr vermessen wenn die Dateien ein Datum im Namen hätten?

Im Namen gewiss nicht, das würde Git nicht wollen. Aber man könnte einen Versions-Kommentar einfügen.

#8112533

Norbert schrieb:

Karl B. meinte dass es bei ihm getestet funktioniert. Ich habe hier keine passende HW zum Testen.

Einwandfrei. Nach etwa 2-3 Sekunden Power on, leuchtet eine LED. Und zwar genau die, die ich beim Test vorher per Potieinstellung ausgewählt hatte. (old bootloader.) Power over USB vom PC. (Mini B USB) Keine zufälligen Hochlaufeffekte. Und der Kondensator parallel zu A0 und GND fehlt auch. Läuft trotzdem extrem stabil. Und das Poti ist recht hochohmig mit 100 kOhm. (Was nicht heißt, dass der Kondensator dann in der Endversion noch vorgesehen ist.)

Wie gesagt, es ist das Programm mit den drei LEDs (bzw. Relais.)
Anhang aus Post:
Beitrag "Re: Einen Arduino Nano programmieren Neuling hierbei , nicht generell"

relais_switcher.ino

Die Frage nach Durchnummerierung der *.inos beantwortet Arduino damit, dass bei Auswahl "new sketch" automatisch Datum als Dateiname gewählt wird. Bei allen folgenden dann kommt fortlaufend alphabetisch ein Kleinbuchstabe hinzu. Oder bei Änderung einer vorher anders benannten Datei wird hinten das Änderungsdatum angefügt.
Finde, das dient sehr schön der Übersichtlichkeit.

weiterhin viel Spaß!

Danke für aktuellen Treiber: Den "alten" hatte ich schon auf der Festplatte gesaved.
Gerhard O. schrieb im Beitrag #8112208:

Im Anhang ist der neueste Treiber vom 26. Juni 2026.

ciao
gustav

Angehängte Dateien:
: Bearbeitet durch User
#8112859

Karl B. schrieb:

Und das Poti ist recht hochohmig mit 100 kOhm. (Was nicht heißt, dass der Kondensator dann in der Endversion noch vorgesehen ist.)

Hallo Karl,

Ich würde aber trotzdem mindestens einen 10nF "dranpappen". Wenn Dein Potentiometer Abgreifer-Widerstand in der Mitte zu hoch wird, dann kann sich der MUX selektierte Speicher Kondensator innen im uC nicht mehr unbedingt korrekt aufladen. Es geht hier nicht um RC-Filterung, sondern darum, um genug Energie parat zu haben den ADC Arbeitskondensator bei schnellen Kanalwechselbetrieb immer korrekt aufzuladen.

Das ist im Einkanal-Betrieb wahrscheinlich ohnehin kein Problem. Nur wenn Du schnell andere Kanäle simultan betreibst, dann spielt die Zeit der Abtastungspause eine Rolle. Ob der Querstrom dieses Widerstandsteilers dann groß genug ist, um das Abtast-C aufzuladen, kann man ohne Berechnungen nicht bestimmen.

Ich behaupte natürlich nicht, daß es in Deiner Schaltung Probleme verursacht könnte, nur ist es technisch gesehen eine Abweichung von den im Datenblatt erwarteten Arbeitsbedingungen unter denen der Hersteller die Einhaltung der Kennwerte garantieren kann. In gewissen Anwendungen wäre dieser Fehler möglicherweise nicht mehr tragbar.

Ist nur meine Meinung.

Viele Grüße, Gerhard

#8112861

Gerhard O. schrieb:

Ich ladete vor einer halben Stunde V4.0 von WCH direkt herunter. Der Link stammte von sparkfun:

Mir fiel auf, daß ich die falsche Vergangensheitsform von "laden" gebrauchte. Es soll natürlich so heissen:

"Ich lud vor einer halben Stunde V4.0 von WCH direkt herunter"

Zum Glück ist es in der Hitze des Gefechts anscheinend niemand aufgefallen;-)

: Bearbeitet durch User
#8112900

Gerhard O. schrieb:

Zum Glück ist es in der Hitze des Gefechts anscheinend niemand aufgefallen;-)

Doch, mir. Ich habe schon gedacht: was ist nur mit Gerhard los? Wie konnte ihm nur so ein gravierender Fehler unterlaufen?
Ich hoffe nur das dein Fauxpas keine schlimmen Konseqenzen (wie z.B. hier ein Schreibverbot auf Lebenszeit) hat.

: Bearbeitet durch User
#8112914

Roland F. schrieb:

Gerhard O. schrieb:

Zum Glück ist es in der Hitze des Gefechts anscheinend niemand aufgefallen;-)

Doch, mir. Ich habe schon gedacht: was ist nur mit Gerhard los? Wie konnte ihm nur so ein gravierender Fehler unterlaufen? Ich hoffe nur das dein Fauxpas keine schlimmen Konseqenzen (wie z.B. hier ein Schreibverbot auf Lebenszeit) hat.

Aha - Adleraugen!

Und da bin ich froh, dass mein Fauxpas (noch) keine Lawine an Beschwerden ausgelöst hat;-)

OP #8113049

Moritz L. schrieb:

Thorsten P. schrieb:

Ich glaube man macht das eigentlich über eine serielle Schnittstelle wo man sich dann Variablen anschauen kann. Hyperterminal?

Arduino hat dafür Serial.Print() und den "Serial Monitor". Liest du eigentlich die Dokumentation deiner Arbeitsmittel? Thorsten P. schrieb:

Wäre es sehr vermessen wenn die Dateien ein Datum im Namen hätten?Das ist auch keine Lösung

Dafür gibt es Verzeichnisse (Ordner). Ich meine die (meist gelben) Dinger, in die man Dateien einsortieren kann.

Ich habe gestern das erste mal einen Arduino bei mir mit HW zum laufen gebracht, lese seit Tagen alles Mögliche. Der angesprochene Punkt ist mir als Anfänger am ersten Tag durch gegangen.Entschuldige. Dafür bin ich hier im Forum um von erfahreneren hierbei was zu lernen.

Windows kenne ich recht gut. Meine Ordner sind für Dich extra in Rosa gehalten. Spaß

OP #8113094

Norbert schrieb:

Thorsten P. schrieb:

Herunter läuft das bei mir allerdings nicht.

Karl B. meinte dass es bei ihm getestet funktioniert. Ich habe hier keine passende HW zum Testen. Thorsten P. schrieb:

Das kommt vermutlich aus der Glättung.( Die ich bei dieser SW nicht wirklich erkenne)

Diese Version glättet nicht, sie etabliert gleichförmige Schwellen für eine Hysterese. Insofern ist jede neue, eingeschnappte Position automatisch stabil. Thorsten P. schrieb:

Wäre es sehr vermessen wenn die Dateien ein Datum im Namen hätten?

Im Namen gewiss nicht, das würde Git nicht wollen. Aber man könnte einen Versions-Kommentar einfügen.

Ich habe die Version mit 4 Relais genommen und vermutlich kann ich den edlen Programmierer jetzt schon nicht mehr zuordnen. Vielleicht schreibe ich einen Kommentar in das Programm selbst . Ohje ich muss das alles gleich nochmal genau anlegen. Vielleicht in diesen gelben Dingern da.

Die von mir getestete Version ist super stabil aber geht nicht zurück auf kleinere Spannungen bzw. daraus resultierenden Ausgänge. Die Spannung selbst ist aber iO, mit Reset laufen bei zB 5V alle Relais durch. Drehe ich von 0V auf 5V und zurück sind alle Ausgänge gesetzt. Aber ich teste gleich mal was ich hier noch so erhalten habe. Und vielen Dank für die echte gute Hilfe. Ich hoffe ich bekomme die Programme recht gut entschlüsselt.

#8113096

Thorsten P. schrieb:

Die von mir getestete Version ist super stabil aber geht nicht zurück auf kleinere Spannungen bzw. daraus resultierenden Ausgänge. Die Spannung selbst ist aber iO, mit Reset laufen bei zB 5V alle Relais durch. Drehe ich von 0V auf 5V und zurück sind alle Ausgänge gesetzt.

Hänge doch einfach mal den Sourcecode an.

#8113105

Thorsten P. schrieb:

Ich habe gestern das erste mal einen Arduino bei mir mit HW zum laufen gebracht...

...und ich versuche nun verstärkt, hinter die "Geheimwissenschaft" C++ zu kommen. Natürlich mit dem weiter oben kritisch gesehenen Google im KI-Modus. Und da falle ich gleich hinten rüber und brauche alle Willenskraft, um wieder aufzustehen und da weiterzumachen.

Zum Beispiel (never heard of such a thing): "...out ? ... : 0; (Der Ternäre Operator)...

usw. usf. Nehme an, dass KI da nicht mogelt und mir etwas "vorlügt". Also genug Anstoß zur Vertiefung des Wissensstandes ist gegeben.

Damit sollte man den TO aber zu sehr verschrecken.

Lothar M. schrieb:

Die Arduino-IDE hat bereits Beispiele drin. Und irgendwann musst du dann lernen, Dinge selber und selbständig zu lernen.

Änderungen in Programmen hatte ich meistens im Analogieverfahren ausprobiert. Das schien mir die gefahrloseste Vorgehensweise zu sein. Das heißt, zum Beispiel eine der Variablen verändern, um zu sehen, was passiert.
Man kann ja auf die Sicherungskopie immer wieder zurückgreifen, falls etwas danebengeht.

Auch mehrere Programme zusammnzufassen, zu "mergen", hat schon einmal sehr gut geklappt.

Aber Näheres zum passenden Zeitpunkt bei Bedarf.

ciao
gustav

P.S.: Wohl die beste Idee: Norbert schrieb im Beitrag #8113096:

Hänge doch einfach mal den Sourcecode an.

: Bearbeitet durch User
#8113107

Programmiersprachen lernt man besser auf dem PC, nicht auf einem Mikrocontroller Board. Vielleicht hilft dir das: Programmiersprachen lernt man besser auf dem PC, nicht auf einem Mikrocontroller Board. Ich empfehle dir dazu die QT Creator IDE, da sie ähnlich einfach wie die Arduino IDE zu installieren ist. Dazu diese Anleitung https://stefanfrings.de/qt_lernen/ für den Anfang. Ein Dickes Buch sollte man trotzdem dazu kaufen.

#8113108

Karl B. schrieb:

Zum Beispiel (never heard of such a thing): "...out ? ... : 0; (Der Ternäre Operator)... usw. usf. Nehme an, dass KI da nicht mogelt und mir etwas "vorlügt". Also genug Anstoß zur Vertiefung des Wissensstandes ist gegeben.

Oftmals die einfachste und eleganteste Lösung um abhängig von einer logischen Wahr/Falsch Aussage einen von zwei Werten zuzuweisen.

1
C /C++
2
int x = a==b ? 1 : 2;
1
Python
2
x = 1 if a==b else 2

Wenn a==b, dann wird x zu 1 ansonsten 2.

OP #8113116

Moritz L. schrieb:

Programmiersprachen lernt man besser auf dem PC, nicht auf einem Mikrocontroller Board. Vielleicht hilft dir das: Programmiersprachen lernt man besser auf dem PC, nicht auf einem Mikrocontroller Board. Ich empfehle dir dazu die QT Creator IDE, da sie ähnlich einfach wie die Arduino IDE zu installieren ist. Dazu diese Anleitung https://stefanfrings.de/qt_lernen/ für den Anfang. Ein Dickes Buch sollte man trotzdem dazu kaufen.

Ah OK ... Danke für die Info Schaue ich mir an..

OP #8113122

Norbert schrieb:

Thorsten P. schrieb:

Die von mir getestete Version ist super stabil aber geht nicht zurück auf kleinere Spannungen bzw. daraus resultierenden Ausgänge. Die Spannung selbst ist aber iO, mit Reset laufen bei zB 5V alle Relais durch. Drehe ich von 0V auf 5V und zurück sind alle Ausgänge gesetzt.

Hänge doch einfach mal den Sourcecode an.

Stimmt macht Sinn

kann ich gerade nur so

// Beschreibung 4 Relais in Binär hochzaehlend NICHT Fertig // Alles Stabil nur läuft es beim Start durch die Relais hoch. Und bei mir nicht zurück auf kleinere Werte 6.11.26 const int ANALOG_IN_PIN = A0; // Dein Eingang (0-5V) const int OUT_1 = 2; // Relais 1 (LSB) const int OUT_2 = 3; // Relais 2 const int OUT_3 = 4; // Relais 3 const int OUT_4 = 5; // Relais 4 (MSB)

// Konfiguration für den Mittelwertfilter const int FILTER_SAMPLES = 20; // Anzahl der Messungen, die gemittelt werden int messwerte[FILTER_SAMPLES]; // Das Ringpuffer-Array für die Messungen int leseIndex = 0; // Der aktuelle Index im Array long messwertSumme = 0; // Laufende Summe der Messwerte

// Variablen für die Hysterese-Steuerung int aktuelleStufe = 0; const int HYSTERESE = 15; // Toleranzbereich (ca. 0,07V). Bei Bedarf erhöhen.

void setup() { pinMode(OUT_1, OUTPUT); pinMode(OUT_2, OUTPUT); pinMode(OUT_3, OUTPUT); pinMode(OUT_4, OUTPUT);

// Das Array initial mit Nullen füllen for (int i = 0; i < FILTER_SAMPLES; i++) { messwerte[i] = 0; } }

void loop() { // 1. GLEITENDER MITTELWERTFILER (Moving Average) // Subtrahiere den ältesten Messwert von der Summe messwertSumme = messwertSumme - messwerte[leseIndex];

// Lies den aktuellen Wert vom Pin ein messwerte[leseIndex] = analogRead(ANALOG_IN_PIN);

// Addiere den neuen Wert zur Summe messwertSumme = messwertSumme + messwerte[leseIndex];

// Index für den nächsten Durchlauf weiterschalten leseIndex = leseIndex + 1; if (leseIndex >= FILTER_SAMPLES) { leseIndex = 0; // Zurück zum Anfang (Ringpuffer) }

// Berechne den aktuellen, perfekt geglätteten Durchschnittswert int geglaetteterWert = messwertSumme / FILTER_SAMPLES;

// 2. STUFEN-BERECHNUNG // Wir ermitteln die theoretische Zielstufe (0-15) basierend auf dem sauberen Signal int zielStufe = map(geglaetteterWert, 0, 1023, 0, 15);

// 3. HYSTERESE-LOGIK (Verhindert das Flattern an den Grenzen) if (zielStufe != aktuelleStufe) { // Ein Schritt entspricht 1024 / 16 = 64 Einheiten int schwellenWert = zielStufe * 64;

1
// Nur umschalten, wenn das Signal das Totband (HYSTERESE) überschritten hat
2
if (zielStufe > aktuelleStufe && geglaetteterWert > (schwellenWert + HYSTERESE)) {
3
  aktuelleStufe = zielStufe;
4
} 
5
else if (zielStufe < aktuelleStufe && geglaetteterWert < (schwellenWert - HYSTERESE)) {
6
  aktuelleStufe = zielStufe;
7
}

}

// 4. PARALLELE AUSGABE AN DIE RELAIS digitalWrite(OUT_1, bitRead(aktuelleStufe, 0)); digitalWrite(OUT_2, bitRead(aktuelleStufe, 1)); digitalWrite(OUT_3, bitRead(aktuelleStufe, 2)); digitalWrite(OUT_4, bitRead(aktuelleStufe, 3));

delay(5); // Sehr kurze Pause (Filter füllt sich alle 100ms komplett neu) }

: Bearbeitet durch User
#8113148

Hier mal nur die ersten Beobachtungen…

// Alles Stabil nur läuft es beim Start durch die Relais hoch. Und bei mir nicht zurück auf kleinere Werte 6.11.26

Kein Wunder, wer mit gleitendem Mittelwert arbeitet, das Array jedoch falsch initialisiert, der wird mit einer ansteigenden Rampe bestraft.

const int FILTER_SAMPLES = 20; // Anzahl der Messungen, die gemittelt werden

Zwanzig ist, ähm, suboptimal. 2^n (4 oder 5) wäre besser.

1
// Berechne den aktuellen, perfekt geglätteten Durchschnittswert
2
int geglaetteterWert = messwertSumme / FILTER_SAMPLES;

›Perfekt‹ ist eine glatte KI Lüge! Und der Wert wird besser mittels Rundung erzeugt.

int geglaetteterWert = (messwertSumme + (FILTER_SAMPLES>>1)) / FILTER_SAMPLES;

Sonst ist es nämlich ein floor also immer eine verzerrende Abrundung.

OP #8113176

Norbert schrieb:

Hier mal nur die ersten Beobachtungen… // Alles Stabil nur läuft es beim Start durch die Relais hoch. Und bei mir nicht zurück auf kleinere Werte 6.11.26 Kein Wunder, wer mit gleitendem Mittelwert arbeitet, das Array jedoch falsch initialisiert, der wird mit einer ansteigenden Rampe bestraft. const int FILTER_SAMPLES = 20; // Anzahl der Messungen, die gemittelt werden Zwanzig ist, ähm, suboptimal. 2^n (4 oder 5) wäre besser.

// Berechne den aktuellen, perfekt geglätteten Durchschnittswert

int geglaetteterWert = messwertSumme / FILTER_SAMPLES;

›Perfekt‹ ist eine glatte KI Lüge! Und der Wert wird besser mittels Rundung erzeugt. int geglaetteterWert = (messwertSumme + (FILTER_SAMPLES>>1)) / FILTER_SAMPLES; Sonst ist es nämlich ein floor also immer eine verzerrende Abrundung.

Mit der Glättung hab ich schon gespielt (Ist vielleicht nicht optimal, geht aber), allerdings sehe ich nicht wo ich bestraft werde. Ich dachte in der else - Abhandlung wäre das gegeben

if (zielStufe > aktuelleStufe && geglaetteterWert > (schwellenWert + HYSTERESE)) { aktuelleStufe = zielStufe; } else if (zielStufe < aktuelleStufe && geglaetteterWert < (schwellenWert - >HYSTERESE)) aktuelleStufe = zielStufe;

#8113191

Thorsten P. schrieb:

Ich müsste vielleicht an die Ausgänge erst übertragen wenn die Mittelwertbildung stabil ist also alt und neu mehrfach gleich. Für das Hochlaufproblem

Nein, in meinem angehängten Programm sieht man doch wie richtig initialisiert wird. Du liest am Anfang den momentanen ADC-Wert und füllst damit den Puffer sowie die abgeleiteten Variablen.

: Bearbeitet durch User
OP #8113192

Norbert schrieb:

Thorsten P. schrieb:

Mit der Glättung hab ich schon gespielt (Ist vielleicht nicht optimal, geht aber), allerdings sehe ich nicht wo ich bestraft werde. Ich dachte in der else

Abhandlung wäre das gegeben

Du initialisierst das Array mit 0, dein Poti steht aber sonst wo. Also ergibt sich beim Programmstart ein Ramp-Up.

Das ist mir soweit klar ,kann ja auch von unten beginnen nur der Übertrag auf die Ausgänge sollte erst dann passieren wenn vielleicht Wert A schnell (MW) ,Wert B langsam(MW) gleich sind A=B

OP #8113195

Norbert schrieb:

Thorsten P. schrieb:

Ich müsste vielleicht an die Ausgänge erst übertragen wenn die Mittelwertbildung stabil ist also alt und neu mehrfach gleich. Für das Hochlaufproblem

Nein, in meinem angehängten Programm sieht man doch wie richtig initialisiert wird. Du liest am Anfang den momentanen ADC-Wert und füllst damit den Puffer sowie die abgeleiteten Variablen.

Ah ich sehe . OK das Programm verstehe ich zwar noch weniger , aber man w ja mit den Aufgaben

OP #8113203

Norbert schrieb:

Das ist, um es schnell auf der Kommandozeile zu kompilieren und testen. Die zugrunde liegende Logik musst du in dein Programm übernehmen.

Ja , verstehe das grundsätzlich . Ui ui ui das ist vielleicht noch zu früh für mich.

Ich muss jetzt alle hier verwendete syntax erst lernen bzw. erkennen lernen. Das dauert wahrscheinlich jetzt n paar Stunden.

#8113210

Moritz L. schrieb:

ch empfehle dir dazu die QT Creator IDE, da sie ähnlich einfach wie die Arduino IDE zu installieren ist.

Ob eine IDE gut oder schlecht ist hängt nun wirklich nicht davon ab, wie einfach sie sich installieren läßt. Einen Installer ausführen sollte wohl jeder können, der programmieren will.
Entscheident ist da wohl eher, wie gut man mit der IDE beim Programmieren zu recht kommt und welche Programmierhilfen sie anbietet. Ich kenne einige Programmierer für die ist eine IDE eher Teufelswerk. Die nehmen einen ganz normalen Texteditor und rufen dann die Werkzeuge wie Compiler/Linker/Assembler zu Fuß auf. Das ist dann allerdings wenig komfortabel und man muß wirklich wissen was man tut. Vorteil dieses Verfahrens ist natürlich, das man die Programmiersprache und die erforderlichen Programmiertools sehr gut kennen lernt. Gerade dann wenn es mal nicht so läuft wie man es erwartet ist das ein Vorteil.
Ehrlicherweise muß ich sagen das ich auch eine IDE bevorzuge. Mittlerweile bevorzuge ich da Visual Studio Code, da es recht flexibel ist und es Erweiterungen für viele Programmiersprachen gibt. Speziell für µC und eingebettete Systeme gibt es da das Platform IO Plugin, welches die Arduino und ESP32 Familien bestens unterstützt. Die Installation von VS Code ist sehr einfach und gut dokumentiert.
Es gibt mittlerweile auch sehr gute Texteditoren mit Syntaxhighlighting für alle gängigen Programmiersprachen. Für Windows fallen mir da PSPad und Notpad++ ein. Mein Favorit ist da mittlerweile PSPad.

Ist aber alles Ansichtskarte und am Ende muß jeder selbst entscheiden, was für ihn die beste Variante ist und das muß man einfach ausprobieren.

#8113303

Erstmals Glückwunsch dazu, dass Du nun endlich eigenen Code auf den Arduino bekommst!

Thorsten P. schrieb:

das Programm verstehe ich zwar noch weniger

Thorsten P. schrieb:

das ist vielleicht noch zu früh für mich.

Das ist das Problem, wenn man "fremden" Code übernimmt, egal ob er von anderen Menschen oder der KI kommt. Man kommt möglicherweise schnell zu Ergebnissen, versteht aber nicht, was passiert. Da Deine Aufgabe noch sehr überschaubar ist, würde ich Dir raten, das Programm erstmal so einfach wie möglich zu machen: Also Analogwert lesen, umrechnen, ausgeben.

Andere Sachen wie Hysterese und gleitender Mittelwert erst einbauen, wenn Du genau weißt, warum Du das überhaupt willst, und wie Du es umsetzen möchtest.

Davon abgesehen kann es natürlich immer dazu kommen, dass etwas nicht wie erwartet funktioniert. Dann hilft es oft, sich im Programm Werte über die serielle Schnittstelle ausgeben zu lassen. Das könntest Du auch mal probieren, um quasi Dein "Handwerkszeug" zur Fehlersuche zusammenzusammeln.

#8113306

Hans schrieb:

Ob eine IDE gut oder schlecht ist hängt nun wirklich nicht davon ab, wie einfach sie sich installieren läßt.

Für einen Anfänger hängt es davon ab.

Einen Installer ausführen sollte wohl jeder können, der programmieren will.

Also ich würde einem Anfänger ganz sicher nicht die Eclipse IDE empfehlen, um nur ein negatives Beispiel zu nennen. Da muss man viel zu viel machen, um es ans Laufen zu bringen.

Antwort schreiben

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.