Keresés

Hirdetés

Új hozzászólás Aktív témák

  • mdraco

    őstag

    válasz mdraco #590 üzenetére

    Két láb használható külső megszakításokhoz, ez akkor a két szenzorhoz szükséges. Nyomógombot meglehet-e oldani megszakítás nélkül?
    Szerk. ezt nézve nincs szükség megszakításra.

    [ Szerkesztve ]

  • bacus

    őstag

    válasz mdraco #591 üzenetére

    miért kell két nyomógomb? egy nem elég? ha mér akkor ne mérjen, ha nem mér akkor mérjen. ez egy gombnyomás.

    az lcd kijelzőt érdemes úgy választani, hogy legyen rajta i2c busz és akkor 2 vezeték elég, csak magadnak könnyited meg az életed.

    ja, most olvasom, hogy soha nem forrasztottál, nos ez a kisebbik baj, mert azt gyorsan megtanulod, lehet az elején nem lesz szép, de működni fog, de ezt ha tartósan meg akarod tartani, akkor a próba panel a minimum, a breadboard, egyrészt drága, másrészt hogy néz ki, hogy a kanócok ott mennek és beleakadsz leesik, ki is húzódik?
    Mondom a minimum, hogy veszel próbanyákot, azon szépen beforrasztgatod az alkatrészeket, majd összehuzalozod.

    [ Szerkesztve ]

    Kössünk egyezséget, megegyezős egyezséget... https://www.paypal.me/engiman/30

  • gyapo11

    őstag

    válasz mdraco #591 üzenetére

    Nem feltétlenül kell megszakítással számolni, a loop egy ledvillogtatással 100 ezerszer fut le másodpercenként, a te programod nyilván hosszabb lesz, de ha csak 10 ezerszer fordul, akkor is lesz ideje számolni az impulzusokat.
    Nyomógombot (mikrokapcsolót) simán kezelem bármelyik lábon, még kondi se kell. Az első lenyomott állapot érzékelése után 30 ms múlva kell leolvasni, ha még mindig benyomott, akkor jó, addigra az összes prell elmúlik. Ezután kell figyelni a fölengedést, nekem 40 ms volt kb. a leggyorsabb fölengedésem, de inkább 100 ms-re kell számítani. Fölengedésnél a prellel nem kell törődni, amint 1-be ugrik a bemenet az föl van engedve.
    Ez az egyszeri megnyomás beolvasására igaz, ha nyomvatartott állapot is van, akkor kicsit más, én órát programoztam egy gombbal, és volt 500 ms-nél kisebb, 500-1500 közötti, és ennél hosszabb idő, ezek mind más funkciót töltöttek be.
    Mivel számolnod kell az impulzusokat, a delay() függvényt felejtsd el, vannak timer libraryk delay nélkül, vagy akár programozhatod magad is, de a loop pörögjön.

    menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

  • mdraco

    őstag

    válasz mdraco #1031 üzenetére

    Esetleg azon gondolkozok, hogy lehet egyszerűbb lenne, ha beteszek még egy nyomógombot. Ha nem érkezik ötlet...

  • Danex

    addikt

    válasz mdraco #1031 üzenetére

    Mi is akkor a kérdés? :U

    Időt szerintem a millis() -el tudod megoldani a legegyszerűbben (a kezdeti millis-t kivonod a végéből(2. gombnyomás) majd átváltod azt ahogy szeretnéd.

    A gombnyomásra is a millis() segít.

  • nyunyu

    félisten

    válasz mdraco #1035 üzenetére

    elapsedTime 64 bites egesz tipusu, azert inicializalja az 1000-es osztot ugyanilyen adattipusnak.

    Ha siman /1000 lenne odairva, akkor alapertelmezetten 32 bites int tipusu lenne az oszto, amit osztas elott at kell alakitania a forditonak 64 bitesre, mivel az aritmetikai muveletek csak azonos tipusu parametereken vegezhetoek el.

    Legalabbis a fejlett programnyelvek altalaban automatikusan szoktak castolni a rovidebb valtozot a hosszabb adattipusara, de elegansabb eleve ugyanolyan adattipust hasznalni mindenhol.
    Ugy rovidebb es valamivel gyorsabb is lesz a leforditott kod.

    Regebbi progamnyelvek hibauzenetet dobtak forditaskor, ha nem egyezett a ket adattipus.
    Legalabbis a C meg elegge haklis volt erre.

    [ Szerkesztve ]

    Hello IT! Have you tried turning it off and on again?

  • gyapo11

    őstag

    válasz mdraco #1031 üzenetére

    Egy változóban őrzöd, hogy most éppen melyik állapot az aktuális, az időmérés, vagy a nem időmérés.
    A gombnyomásnál és a fölengedésnél lesznek prellek, ezeket kezelni kell. Lehet külső áramkörrel, ami garantáltan prellmentesen vált egyik állapotból a másikba, vagy software-ből, mondjuk 50 ms-et várni, de szeritnem elég 30 is.
    Amikor érzékeled a nyomógomb lenyomását, akkor a millist leteszed, és addig vársz, amíg 30-cal nem lesz több, ha még mindig be van nyomva, akkor úgy veszed, hogy megtörtént a lenyomás. Ekkor elvégzed az ehhez tartozó műveleteket, beírod az állapotváltozóba, hogy 1 (mérés), és figyeled, hogy mikor enged föl. Amikor észreveszed, hogy föl van engedve, akkor ugyanaz a menet, mint a lenyomásnál. Vársz 30 ms-et, megnézed, hogy még mindig föl van-e engedve, ha igen elvégzed a műveleteket és beírod a változóba a 0-át (nincs mérés). És a delay-t elfelejted.

    menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

  • tibi-d

    tag

    válasz mdraco #1031 üzenetére

    Sziasztok!
    Minden programomban én úgy oldom meg a nyomógombok prellmentesítését, hogy a menüvezérlést egy önálló szubrutinba hívom meg. Ezt a szubrutint egy (Timer1.attachInterrupt) hívja meg, ami nálam 0.1s alatt fut le 1X.
    Ekkor figyelem a nyomógomb változását. Ha változott, beállítok egy változót (PinOld) amit csak akkor írok vissza, ha már végrehajtottam a feladatot, amit a nyomógomb vezérelt, és felengedtem a gombot. Így biztos, hogy csak 1X fogja végrehajtani. Ez az algoritmus bármennyi gomb vezérléséhez használható, ha kell prioritás is felállítható a gombok között. ( és csak 1X kell megírni, utána bármelyik projektben alkalmazható.)

  • gyapo11

    őstag

    válasz mdraco #1051 üzenetére

    Ez beolvassa a nyomógomb állapotát, a buttonState változó értéke vagy 0 vagy 1 lesz.

    Az #1031-be linkelt példa jó, ha nem értesz benne valamit akkor kérdezz.
    Illetve még javaslom a folyamatábrát, azal könnyű megérteni a működést programnyelvtől függetlenül, és utána át kell fordítani az arduino nyelvére, ebben tudok segíteni.

    menyország -> mennyország, akadáj -> akadály, jótálás -> jótállás, Iphoneal > Iphone-nal, kisuly > kisujj, csővet > csövet

  • tibi-d

    tag

    válasz mdraco #1051 üzenetére

    Szia!
    Itt a kód, amit az Arduino.cc "learning" oldaláról ollóztam.

    State change detection (edge detection)

    Often, you don't need to know the state of a digital input all the time,
    but you just need to know when the input changes from one state to another.
    For example, you want to know when a button goes from OFF to ON. This is called
    state change detection, or edge detection.

    This example shows how to detect when a button or button changes from off to on
    and on to off.

    The circuit:
    * pushbutton attached to pin 2 from +5V
    * 10K resistor attached to pin 2 from ground
    * LED attached from pin 13 to ground (or use the built-in LED on
    most Arduino boards)

    created 27 Sep 2005
    modified 30 Aug 2011
    by Tom Igoe

    This example code is in the public domain.

    http://arduino.cc/en/Tutorial/ButtonStateChange

    */

    // this constant won't change:
    const int buttonPin = 2; // the pin that the pushbutton is attached to
    const int ledPin = 13; // the pin that the LED is attached to

    // Variables will change:
    int buttonPushCounter = 0; // counter for the number of button presses
    int buttonState = 0; // current state of the button
    int lastButtonState = 0; // previous state of the button

    void setup() {
    // initialize the button pin as a input:
    pinMode(buttonPin, INPUT);
    // initialize the LED as an output:
    pinMode(ledPin, OUTPUT);
    // initialize serial communication:
    Serial.begin(9600);
    }

    void loop() {
    // read the pushbutton input pin:
    buttonState = digitalRead(buttonPin);

    // compare the buttonState to its previous state
    if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
    // if the current state is HIGH then the button
    // wend from off to on:
    buttonPushCounter++;
    Serial.println("on");
    Serial.print("number of button pushes: ");
    Serial.println(buttonPushCounter);
    }
    else {
    // if the current state is LOW then the button
    // wend from on to off:
    Serial.println("off");
    }
    }
    // save the current state as the last state,
    //for next time through the loop
    lastButtonState = buttonState;

    // turns on the LED every four button pushes by
    // checking the modulo of the button push counter.
    // the modulo function gives you the remainder of
    // the division of two numbers:
    if (buttonPushCounter % 4 == 0) {
    digitalWrite(ledPin, HIGH);
    } else {
    digitalWrite(ledPin, LOW);
    }

    }
    Természetesen úgy alakítod, ahogy neked megfelel.

Új hozzászólás Aktív témák