Változó állítás gombokkal

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Változó állítás gombokkal

Hozzászólás Szerző: berkesandor »

Kezdő vagyok az Arduino programozásban, ezért szeretnék egy kis segítséget kérni. :?
Csinálni szeretnék egy hőfok szabályozó, ami az aktuális hőfokot egy 3 karakteres hétszegmenses kijelző írja ki.
A hőfokot állíthatóra szeretném megcsinálni. A hőfokot beállítását két gomb segítségével oldanám meg, amik megnyomva LOW értéket adnak az arduino 8,9 -és bemenetére.
Úgy gondoltam, hogy amikor megnyomom a két gombot egyszerre, írja ki a beállított hőfok értékét, utána egyik gomb lefelé , másik gomb felfelé állít. Ha ismét egyszerre megnyomom a két gombot, visszatér a hőfok kijelzésre (nyilván menti az új értéket).
A program most egy számlálót futtat, hogy lássam, hogy kiléptem a menüből.
A "menübe" való belépés , és az állítás is működik önmagában, de ha egyberakom őket akkor nem.

Kód: Egész kijelölése

void loop() {

  gomb1 = digitalRead(8);
  gomb2 = digitalRead(9);
  quit = 1;
 
    if (gomb1 == LOW && gomb2 == LOW )
    {
      while (quit == 1)
      {
           for (int i=0; i <= 5; i++){
            disp.write (setpoint);
            delay (10);
            }                
                if (gomb1 == LOW && gomb2 == LOW ){   //kilépés a menüből
                  delay (1000);
                  if (gomb1 == LOW && gomb2 == LOW )
                  {
                    quit = 0;}
                      }
                   
                      if (gomb1 == LOW)   // setpoint növelése
                      {
                          if (gomb1 != gomb1e)
                          {
                              setpoint++;
                              disp.write (setpoint);
                              delay (100);
                              gomb1 = gomb1e;
                              }
                        }
                 
                        if (gomb2 == LOW)   // setpoint csökkentése
                        {
                          if (gomb2 != gomb2e) 
                          {
                              setpoint--;
                              disp.write (setpoint);
                              delay (100);
                              gomb2 = gomb2e;
                             }
                         }
      delay (500);
      }
    }  
    
disp.write (counter);
counter++;

if (counter == 5000){
   counter = 1;} 
}
      
Köszönöm a segítséget előre is.
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Változó állítás gombokkal

Hozzászólás Szerző: atilla »

Szia!

A gomboknál a pergésmentesítésre, és a vétlen zavarokra is figyelni kell.
Ha megnyomod a gombot, akkor vár egy picit, és megint megnézi, hogy még mindig nyomva van-e. Ha nyomva van, akkor addig nem tesz semmit, amíg el nem engeded.
Ha nem így, vagy hasonló módon csinálod, akkor prellezni fog.

Kód: Egész kijelölése

 Gomb = digitalRead(GombPin);
  if (Gomb == HIGH) { 
    delay(50);
    Gomb = digitalRead(GombPin);
    if (Gomb == HIGH) {
      delay(50);
      Gomb = digitalRead(GombPin);
      while (Gomb == HIGH) {
        delay(50);
        Gomb = digitalRead(GombPin);
      }
   //Ide irod, hogy mit tegyen a gombnyomas
     }
     }
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Változó állítás gombokkal

Hozzászólás Szerző: berkesandor »

Három lépcsőt csináljak, háromszor 50 ms delay-el, feltételenként?
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Változó állítás gombokkal

Hozzászólás Szerző: atilla »

A delay() érték változhat. De ez így elég stabil tud lenni.
Ha persze iszonyú gyorsan nyomkodod a gombokat, akkor csökkenthetsz rajta.
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Változó állítás gombokkal

Hozzászólás Szerző: berkesandor »

Köszönöm a segítséget, valóban a prell volt a gond.
Az a gond a több delay-el, hogy amíg várakozik a program, nem frissíti a kijelzőt, és vibrálást okoz.
Erre kitalálok még valamit.
Íme a működő kód:

Kód: Egész kijelölése

quit = 1;

    if (gomb1 == LOW && gomb2 == LOW ){
      delay (50);
      gomb1 = digitalRead(8);
      gomb2 = digitalRead(9); 

        if (gomb1 == LOW && gomb2 == LOW ){
           for (int i=0; i <= 25; i++){
             delay (20);
             gomb1 = digitalRead(8);
             gomb2 = digitalRead(9); 
             disp.write (setpoint);
             }
    
              while (quit == 1){
                 disp.write (setpoint);
                 gomb1 = digitalRead(8);
                 gomb2 = digitalRead(9);
                 for (int i=0; i <= 25; i++){
                   delay (20);
                   disp.write (setpoint);}
           
                
                          if (gomb1 == LOW && gomb2 == LOW ){           //kilépés a menüből
                              delay (50);
                              gomb1 = digitalRead(8);
                              if (gomb1 == LOW && gomb2 == LOW ){
                                  delay (50);
                                  gomb1 = digitalRead(8);
                                  if (gomb1 == LOW && gomb2 == LOW ){
                                      quit = 0;
                                      for (int i=0; i <= 50; i++){
                                         delay (20);
                                         disp.write (hofok);}
                                   }
                              }
                          }
                 

                       
                   
                         if (gomb1 == LOW) {                          // setpoint növelése
                             delay (5);
                             gomb1 = digitalRead(8);
                               if (gomb1 == LOW) { 
                                  delay (5);
                                  gomb1 = digitalRead(8);
                                  if (gomb1 == LOW) { 
                                      delay (5);
                                      gomb1 = digitalRead(8);
                                      
                                         if (gomb1 != gomb1e){
                                             setpoint++;
                                             gomb1 = digitalRead(8);
                                             gomb1 = gomb1e;}
                                                                                      
                                  }
                              }
                         }
                    
                    
                  
                  
                        if (gomb2 == LOW) {                          // setpoint növelése
                             delay (5);
                             gomb2 = digitalRead(9);
                               if (gomb2 == LOW) { 
                                  delay (5);
                                  gomb2 = digitalRead(9);
                                  if (gomb2 == LOW) { 
                                      delay (5);
                                      gomb2 = digitalRead(9);
                                      
                                         if (gomb2 != gomb2e){
                                             setpoint--;
                                             disp.write (setpoint);
                                             gomb2 = digitalRead(9);
                                             gomb2 = gomb2e;}
                                         
                                  }
                              }
                         }
                    }
              }
          }  
   
    
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Változó állítás gombokkal

Hozzászólás Szerző: atilla »

A vibrálás szerintem abból adódik, hogy egymás után sokszor törlöd, majd újraírod.
Ha a kijelzőre valamit kiírsz, és nem frissíted, és felül sem írod, akkor az ott marad az idők, vagy a táp végezetéig.
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Változó állítás gombokkal

Hozzászólás Szerző: berkesandor »

Sosem törlöm, csak frissítést küldök rá, és vibrál. Ha delay van, üres a kijelző.
Aztán lehet hogy rosszul konfiguráltam a kijelzőt. Sevenseg.h -t használok.
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Változó állítás gombokkal

Hozzászólás Szerző: atilla »

A delay() utasításnál a proci az adott időre megáll, úgy marad. Semmit sem tesz. A LED kijelzőre sem ír. Azoknál a kódoknál, ahol probléma van, ott száműznöd kell a delay()-t. Helyette időzítsél a millis()paranccsal. (ott meg majd az lesz a baj, hogy cirka 50 naponként túlcsordul).
Vagy akasszál rá LCD kijelzőt.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Változó állítás gombokkal

Hozzászólás Szerző: Robert »

A hétszegmenses időosztás alapon működik (mátrixszerűen?)
- Mátrix szerűen - csináld meg megszakítás, időzítás alapon
- programod a nyomógombokkal timer megszakítás alapú legyen (pl. kijelzővel együtt).


Trükk:
ha a gomb = 0 akkor ha előző állapot is nulla volt, akkor adj az állapotjelzőhöz hozzá 1-et (pl max 10-ig ), különben nullázd.
gomb = gomb-1 (0 esetén nem)

ha a gomb = 1 akkor ha előző állapot is 1 volt, akkor adj az állapotjelzőhöz hozzá 1-et (pl max 10-ig ), különben nullázd
gomb = gomb+1 (10 esetén nem)

Főprogramban - ha a állapotjelző = 10 _és_gomb = 0 -> Stabilan 0-ra húzva
Főprogramban - ha a állapotjelző = 10 _és_gomb = 1 -> Stabilan 1-ra húzva
Állapotjelző <10 - prelleg, beállás alatt van.

Sima portolvasás és változó növelés/csökkentés. Azaz, gyors művelet.




Vagy pl. TM1637 vezérlővel a kijelzést veztérelni? A kiírt adat a következő kiírásig megmarad.
http://www.tavir.hu - a gazda :)
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Változó állítás gombokkal

Hozzászólás Szerző: berkesandor »

Köszönöm a segítséget, mindkettőtöknek.
Amire a programot számon az egy már meglévő panel, ezért az LCD és TM1637 nem használható.
A kijelző időzítés alapon megy (úgy gondolom). Onnan szűrtem le, hogy a max6675-al kiolvastatom hőfokot, átveszi a PID könyvtár, és mikor számolni kezd a kijelző frissítés lelassul. De nem vibrál, hanem a hőfok emelkedésével növeli a frissítési rátát, minél magasabb a hőfok annál kevésbé vibrál, majd 100 fok körül teljesen kisimul. Arra gondolok, hogy több dolog is ugyanazt az időzítést (vagyis összeakad) használja.
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Változó állítás gombokkal

Hozzászólás Szerző: berkesandor »

Összeakad persze, ha egy kimenetre két dolog van programozva. :roll: :lol:
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Változó állítás gombokkal

Hozzászólás Szerző: berkesandor »

Elakadtam megint, a szerkezet amire a program készül (ATmega328P van rajta) a 19, 22 lábakat használj a gomb olvasáshoz.
A6 A7 ként kell hivatkoznom rá?
Arduino UNO R3-n hol vannak ezek a kivezetések?
Jól olvastam, hogy csak analógként lehet olvasni őket?
atilla
Biztosítékgyilkos
Hozzászólások: 65
Csatlakozott: 2016. május 10. kedd, 18:35

Re: Változó állítás gombokkal

Hozzászólás Szerző: atilla »

UNO-n ez nem fog menni. Próbáljad NANO-n, mert ott 8 ADC van. A 328p-vel szerelt UNO-n is van a csippnek ilyen kivezetése, de elföldelték.
berkesandor
DrótVégénSzéndarab
Hozzászólások: 30
Csatlakozott: 2016. június 27. hétfő, 16:29

Re: Változó állítás gombokkal

Hozzászólás Szerző: berkesandor »

Rendeltem egy megát közben.
A program amit írok, 328p-n fog futni, de nem Uno-n.
Hogyan hivatkozzak rá? Megy digitálisan is vagy csak analógként?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Változó állítás gombokkal

Hozzászólás Szerző: Robert »

Adatlap? -> http://www.atmel.com/images/Atmel-8271- ... mplete.pdf

Az A6, A7 csak analog bemenet, IO funkciója nincsen.
http://www.tavir.hu - a gazda :)
Válasz küldése