Go Down

Topic: 4 Led's + 1 Led ohne delay, ich bekomme es nicht hin (Read 5762 times) previous topic - next topic

ardubu

bevor du mit 2. und 3. Led beginnst, arbeite das mit einer Led durch und versuche es zu verstehen. Wenn du einen Punkt nicht verstehst, benenne diesen Punkt, und dir wird hier sicherlich geholfen.

example

Dann lass es bleiben, willst offenbar nur jammern aber nicht lernen  :smiley-confuse:
Ich schreibe ledeglich das ich es NICHT verstehe, es aber verstehen will !
Welcher teil genau sagt da aus das ich nur jammern will ?

Es tut mir echt leid das ich mich hier in diesem Forum angemeldet habe.
Es tut mir auch echt leid das Arduino technische dinge für Dich selbstverständlich sind und Du mal eben n beliebigen sketch auf's Parkett zauberst wofür ich beim Aktuellen stand... wochen brauchen würde.
Es tut mir echt leid das ich mehrfach sage das ich es bis jetzt einfach, und hier steht es wieder, NICHT VERSTEHE !
Ich es aber verstehen will !!

Ich verstehe die Referenz von unsigned long einfach nicht.
Wie also kommst du zu dem schluss das ich nur jammern will wenn ich ledeglich erzähle das ich es niht verstehe ?

WAS soll ich an unsigned long verstehen ? Ich kann es, aufgrund desen das ich aktuell noch KEINE AHNUNG HABE nicht verwenden. Auch nichts von ableiten.

Es tut mir leid das ich nicht auf deinem, vermutlich recht hohen level des wissens bzgl IDE, mithalten kann.

"Dann lass es bleiben" im Forum erfüllt natürlich den sinn und zweck eines solchen.
Besonders nachdem ich im ersten Post bereits erwähnte das ich solch einen Sketch nicht nur Kopieren möchte sondern ---> ihn auch verstehen will <--


Ich weiß nicht wie du darauf kommst das ich etwas nicht will, eventuell liegt es an anderen trollen die einfach nur fertige sketche haben wollen, sich nur deswegen hier anmelden und rum pupen.
Von solchen distanziere ich mich ausdrücklich.



Was ich bisher am UNO geschafft habe ist das Blink beispiel mit delay so umzuändern (ja ich weis, ist nicht all zu schwer) das 4 led's als rundumliht funktionieren und eine 5. als blitzer (bekommt einfach 5v für 80ms)

Das blöde ist dann halt das mir das zu synchron ist, eine umdrehung und "blitz"
Auch wenn ich die 5. LED zwischendurch blitzen lasse gefällt es mir nicht.
Der ansporn meinerseits liegt darin niht nur diese sache zu schaffen und zu verstehen sondern auch andere projekte.

Schön sind fertige sketche, schöner wenn man es selber kann.
Momentan liegt der UNO rum und ich probiere blind drauf los ohne zu wissen was ich mache bzw ohne zu wissen wie es richtig geht.
Da bringt es mir tatsächlich nichts das unsigned long 32bit und 4 bytes hat und dann von 0 - 4,294,967,259 (2^32-1) geht.

Ernsthaft, wie soll/kann mich das vorran bringen ?
Da lerne ich den Text der bei unsigned long steht aber es bringt mich nicht weiter.


Finde es auch nicht prickelnd direkt so angepampt zu werden, da gibt es doch auch keinen grund zu.

@Mutumba
Schön das du deine Geistigen ergüsse Öffentlich teilst ;)


@ combie
Natürlich ist der weg des lernens meiner, den will ich ja gehen.
C und c++ würde ich gerne noch meiden und mit IDE arbeiten es sei denn c/c++ ist klarer.


Eine Blockade ist das generell nicht, ich kann bei aller liebe zum lernen nichts mit  0 - 4,294,967,259 (2^32-1) anfangen.



Ich suche schon nach 2 leds ohne delay, da unterscheiden sich die sketche teils um das doppelte.
-------------------------------------


@ardubu

Ich habe das beisspiel blinkwithoutdelay nun offen.
Folgendes verstehe ich:
const int ledpin 13 - led an pin 13
int ledstate low - led aus bzw pin 13 auf gnd.
(den teil verstehe ich nicht:unsigned long previousMillis = 0;        // will store last time LED was updated )

const long intervall - abstand in dem die led an gehen soll.

void setup
pinmode - ist klar

loop
 schon wieder unsigned long, versteh ich nicht


da komm ich nicht drauf was damit gemeint ist:
if //save the last time... you blinked the led
if ledstate low.... ledstate high else ledstate low.


Soweit zu dem.
Da steht ja wann die led high soll, alle 1000ms.
Aber welche zeile sagt denn wann die aus muss ?

Serenifly

Was Datentypen sind musst du in jeder Sprache verstehen:
https://de.wikipedia.org/wiki/Datentyp

Auf dem AVR gibt es drei grundlegende Datentypen für Ganzzahlen/Integer:
char = 1 Byte
int = 2 Byte
long = 4 Byte

Diese Typen gibt es so oder so ähnliches in fast jeder Sprache, wobei sich die Größe je nach System unterscheiden kann.

Das gibt es dann jeweils als signed (vorzeichenbehaftet) für positive und negative Zahlen und unsigned nur für positive Zahlen. Erstes muss man nicht extra hinschreiben. D.h. "int" ist positiv und negativ und entsprechend hat man absolut nur die Hälfte des maximalen Wertes als mit unsigned Typen.

Auf dem Arduino gibt es außerdem noch das Schlüsselwort "byte" als Alias für "unsigned char", also eine Zahl von 0 bis 255


unsigned long = positive Zahlen, 4 Byte/32 Bit groß. Das ist der maximale Integer Typ hier. Das es die größtmögliche Zahl ist ist wirklich der einzige Grund weshalb man sie hier nimmt. millis() gibt eine Zahl diesen Typs zurück und entsprechend nimmt man unsigned long um sie abzuspeichern.

example

#18
Oct 19, 2015, 11:18 pm Last Edit: Oct 19, 2015, 11:20 pm by example
unsigned long, short und int habe ich nun verstanden, danke dir ! :)

long = bis 4294967295, int bis 4294967295 und short bis 65535.
in dem falle das led's blinken/leuchten sollen wären das die maximalen ms die man nutzen könnte.
Juhu, ich hoffe das habe ich richtig verstanden :D
Habe das eben auf einer seite für C gefunden.
Long,short und int bei c sind dann bei IDE dann eben char,int und long ?
das mit dem char = 1 Byte,int = 2 Byte und long = 4 Byte ist dann fast das selbe bzw so in der art?
und unsigned/signed... und da is der denk-knoten wieder da.

die wikipedia erklärung dazu ist mal mega kompliziert
dann verstehe ich allerdings das int in "int ledState = LOW;  " nicht.
oh man, ich bereue es ernsthaft das ich in der schule nicht im c/c++ kurs war...

Serenifly

#19
Oct 19, 2015, 11:30 pm Last Edit: Oct 19, 2015, 11:32 pm by Serenifly
Quote
long = bis 4294967295, int bis 4294967295 und short bis 65535.
Für unsigned. Aber nicht auf dem AVR Prozessor! Hier kommt das zum Tragen was ich mit "verschiedenen Systemen" meinte. Deine Liste gilt für 32 Bit Prozessoren. Wie 32 Bit Programme auf dem PC, oder auf dem Arduino ARM Boards wie der Due.

UNO und Co. sind 8 Bit Prozessoren. Da haben short und int beide 16 Bit, bzw. 2 Bytes. 2^16 - 1 = 65535

Quote
dann verstehe ich allerdings das int in "int ledState = LOW;  " nicht.
ledState ist der aktuelle LED Zustand. Der wird auf LOW, d.h. aus gesetzt (wenn er vorher HIGH war) und dann weiter unten auf den Pin geschrieben:
Code: [Select]

digitalWrite(ledPin, ledState);


Quote
oh man, ich bereue es ernsthaft das ich in der schule nicht im c/c++ kurs war...
Das ist nicht mal unbedingt C-spezifisch. Klar die Sprache hier ist C/C++, aber auch wenn man eine ähnliche Sprache kann reicht das in diesem Fall.

combie

Quote
int ledState = LOW;
Die Integer Variable namens ledState wird auf 0 gesetzt.
Denn LOW ist boolean false und wird in der Zuweisung automatisch zu 0 gecasted.
Verstanden?
Vermutlich nicht.

Und ja, du jammerst.
Ok, jammern ist ein böses Wort, ich versuchs mal anders:
1. Der Zeitaufwand
Die Ausbildung zu einem Programmierer dauert 3 und auch mehr Jahre.
Also wird das tiefe Verständnis, auch bei dir, etwas dauern.

2. Die Einstellung
Je öfter du sagst, "das kann ich nicht", "das verstehe ich nicht", desto fester glaubst du selber daran. Ist bei jedem so, ein Automatismus unseres Hirns.
(und das meine ich auch mit Blockade)



Und gerade Punkt 2 macht alle Helfer kribbelig...
Da kann man nicht gut bei zusehen...
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

example

Ok, mit den verschiedenen systemen hab ich auf dem schirm bzw unsigned etc.
Das mit dem ledstate auch, nur das int davor nicht ganz.
Mit int , das werde ich noch intimer auf die kette bekommen, ganz sicher :)

Ja das es nicht grade einfach ist mir mal eben x und y beizubringen so das ich es auch selber kann wird vermutlich ein wenig dauern, die einstellung ist aber nach wie vor: ich will !

Kann das aber nachvollziehen grade bei solchen vermeintlich einfachen dingen.
Immerhin habe ich die basic blink mit delay verstanden, fand das einerseits gut das es funktioniert hatte auf anhieb, andererseits doof das die 5. led oenetrant synchron dazu blinkt.

Ich bin eher im RC car und flächenmodell bereich aktiv, ebenso bei Mechanik, Motoren und SMD zeugs löten.
Schaltpläne verstehen etc. Alles kein ding. Beim Programmieren ist das noch was anderes...
Apropo, das basic servo swap und knob bekomme ich hin und verstehe ich deswegen warscheinlich auch da eher ein bezug zur materie vorhanden ist.
 Ich danke euch allen für die mir gegenüber erbrachte geduld, ich werde sie hoffentlich zeitnah mit positiven ergebnissen/hiesigen berichten honorieren können.

Eisebaer

hi,

einer der fälle, die man am anfang falsch eingeschätzt hat.

example, Dir fehlen die basics.

würdest Du jetzt hier sein, würd' ich mich von Dir auf ein bier in meinem stammlokal einladen lassen und Dir gemütlich erklären, was variablen und variablentypen sind (ganz langsam, wegen des zweiten biers...).

hier im forum ist das zu mühsam, zuviel schreibarbeit und zuviel zeit zwischen den posts.

besorge Dir ein buch zum thema arduino, da lernst Du eben diese basics von c/c++ (also die grundlagen der arduinosprache) und darüber hinaus einiges über die hardware. meine empfehlung:

http://www.oreilly.de/catalog/elekarduinobas2ger/

gib nicht auf, freu' Dich auf die aha-erlebnisse...

gruß stefan

combie

Quote
Das mit dem ledstate auch, nur das int davor nicht ganz.
Das int davor, sagt dem Kompiler, dass er bitteschön die Variable JETZT anlegen soll.

Dein Wunsch Programm, muss wohl 2 unabhängige Fäden/Threads ausbilden.
Wenn  ich das richtig verstanden habe...

1. Vier Leds spielen eine Rundumleuchte
2. Eine Led blinkt asyncron dazu


Ich habe dir mal so ein Beispielprogramm gemalt:
Code: [Select]

// rundum Variablen/Konstanten
const unsigned long   RundumInterval              = 500; // Rundumlicht Wartezeit bis zum Wechsel
unsigned long         RundumLetzterWechsel        = 0;
byte                  RundumLed                   = 0; // die, welche gerade brennt
const byte            AnzahlRundumLed             = 4;
const byte            RundumLeds[AnzahlRundumLed] = {10,11,12,13};



// blitz Variablen/Konstanten
const byte          BlitzLed            = 8;
unsigned long       BlitzLetzterWechsel = 0;
unsigned long       BlitzInterval       = 1000; // wird im Programm geändert
const unsigned long BlitzDauer          = 10;

void tueBlitzen() // zufallsgesteuertes, damit asyncrones Blitzen
{
    if(millis() - BlitzLetzterWechsel > BlitzInterval)
    {
        BlitzLetzterWechsel = millis();
        bool leuchtetGerade = digitalRead(BlitzLed);
        BlitzInterval       = leuchtetGerade?random(100,2000):BlitzDauer; // ?: trinitäts operator
        digitalWrite(BlitzLed,!leuchtetGerade);
    }
}


void tueRundum()
{
  if(millis() - RundumLetzterWechsel > RundumInterval)
  {
    RundumLetzterWechsel = millis();
    digitalWrite(RundumLeds[RundumLed],LOW);
    RundumLed = ++RundumLed % AnzahlRundumLed; // % Modulo Operator (wrapp around)
    digitalWrite(RundumLeds[RundumLed],HIGH);
  }
}


void setup()
{
  pinMode(BlitzLed, OUTPUT);
  for(int i = 0; i < AnzahlRundumLed; i++)
  {
    pinMode(RundumLeds[i],OUTPUT);
    digitalWrite(RundumLeds[i],RundumLed == i);
  }
}

void loop()
{
  tueRundum();
  tueBlitzen();
}


Und ich habe absichtlich kein Rücksicht auf deine Befindlichkeiten genommen.
Habe es so geschrieben, wie ich es auch für mich getan hätte.
(Ausnahme, die Kommentare..)

:) so hast du wenigstens wieder was zu kauen :)
> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

guntherb

#24
Oct 20, 2015, 01:52 pm Last Edit: Sep 12, 2016, 02:45 pm by guntherb
So kompliziert ist das doch gar nicht.

Gehen wir vom Blinken mal einen Schritt weg  zu was ganz praktischem: Wir haben einen Nachtwächter / Wachmann, der immer seine Runden um ein Haus geht. Zusätzlich erhält er die Aufgabe, jede Stunde für 15min eine Lampe einzuschalten. Die Lampe selbst sieht er nicht, aber es gibt einen Schalter am Haus.
Was macht er also:
Er schaltet das Licht ein, merkt sich die Zeit und dass die Lampe ein ist und macht weiter seine Runden. Bei jeder Runde schaut er auf die Uhr, ob die 15min schon um sind. Sind sie noch nicht um, geht er einfach weiter, wenn die um sind, schaltet er die Lampe aus und merkt sich, dass sie jetzt aus ist.
Nun schaut er bei jeder Runde auf die Uhr, um zu prüfen, ob die Stunde seit Einschalten schon um ist.
Ist sie um, schaltet er wieder ein, notiert sich Status der Lampe und Uhrzeit, und nimmt seine Runden wieder auf.

Genau so macht es der Arduino.
wenn wir die Schritte des Wachmanns in Arduinosprache übersetzen, schaut das in etwas so aus:


wenn sich der Wachmann die Zeiten auf dem Zettel notiert, schreibt der Arduino einen Wert in eine Variable. millis() ist die Systemuhr des Arduino. Sie zählt einfach die vergangenen millisekunden seit Start des Arduino.

der zugehörige Code schaut dann so aus:
Code: [Select]
unsigned long LED_timestore;  // Variable Speicher für Systemzeit.
int LedStatus = LOW;
int LedPin = 13;



void setup() {
  pinMode(LedPin, OUTPUT);  // teilt dem Arduino mit, dass das ein Ausgang ist.
}

void loop() {
  if (LedStatus == LOW) {
    if (millis() - 1000 > LED_timestore) {
      digitalWrite(LedPin, HIGH);
      LED_timestore = millis();
      LedStatus = HIGH;
    }
  } else {
    if (millis() - 300 > LED_timestore) {
      digitalWrite(LedPin, LOW);
      LedStatus = LOW;
    }
  }
}


Wenn der Wachmann / Arduino mehrere Lampen schalten soll, braucht er einfach noch mehr Zettel / Variable und Schalter / Pins.

Geben wir Ihm doch noch eine Aufgabe dazu:
Erweiterung:
Ausserdem soll er alle 3h die Bewässerung für 10min einschalten.


Dann könnte das so aussehen:



Das ist jetzt bewusst so gehalten, um die Analogie Arduino <-> Wachmann zu verdeutlichen.
Es geht auch einfacher.
Grüße
Gunther

Serenifly

Das ist einer schöner Vergleich um das Prinzip zu erklären :)

agmue

Die Analogie der Runden des Wachmanns zu loop gefallen mir, weshalb ich Deinen Beitrag mit meinem Kohlekranbeispiel verlinkt habe.
dann verstehe ich allerdings das int in "int ledState = LOW;  " nicht.
Integer ist eine ganze Zahl, ledstate aber ein Zustand, das paßt nicht, das sehe ich auch so. Daher könntest Du "boolean ledState = LOW;  " oder "bool ledState = LOW;  " verwenden, das kann nur true oder false sein, was dann HIGH oder LOW zumindest näher käme. So einen eigenen Datentyp für HIGH oder LOW hat man dem Compiler erspart, dafür optimiert der manche Dinge. Die "Toleranz" des Compilers kann einen schon manchmal irritieren.
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

example

Sobald ich daheim am Lappi sitze werde ich das durchkauen.
Der Wahnsinn, ich danke für die Erklärung, so leuchtet das selbst mir zum Großteil ein.

Für Lektüre ist Platz am Tisch :)
Ich bleib am Ball und danke euch allen für eure Ausdauer und Mühe :)

agmue

Ich habe dir mal so ein Beispielprogramm gemalt:
Ich habe das für meine PTH RGB LED WS2812 umgeschrieben: Funktioniert tatsächlich!  :)
Wahnsinn und Verstand trennt nur eine dünne Wand. (Daniel Düsentrieb)

combie

> Das größte Problem, ist die Wahl der richtigen Gedanken <
Frei nach Dale Carnegie

Go Up