Skocz do zawartości
stander

Problem z dużym przyciskiem tact switch

Pomocna odpowiedź

Cześć!

Mam taki problem: próbuje podłączyć duży przycisk tact switch(12x12mm) do Arduino i sprawdzić czy jest naciśnięty. Wykorzystuję do tego taki kod:


void setup() {
  pinMode(2, INPUT_PULLUP);
}

void loop() {
if(digitalRead(2) == LOW) {
  Serial.println("CLICKED!");
  }
}

i tak podłączyłem układ

1142364086_UntitledSketch2_bb.thumb.png.cb93205dd7d2003212e9a4424d9a73e1.png

Wydaję mi się, że wszystko jest dobrze. Jednak, gdy podłączam płytkę do komputera, monitor portu szeregowego sugeruje, że cały czas naciskam przycisk. Problem znika po zmianie przycisku na mały (tact switch 6x6mm).

Udostępnij ten post


Link to post
Share on other sites

@stander możliwe, że coś nie styka lub wyprowadzenia w dużym przycisku są inne. Obróć go dla testu o 90 stopni i sprawdź wtedy 😉

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
4 minuty temu, Treker napisał:

@stander możliwe, że coś nie styka lub wyprowadzenia w dużym przycisku są inne. Obróć go dla testu o 90 stopni i sprawdź wtedy 😉

Obróciłem i rzeczywiście działa. Dzięki!

Edytowano przez stander

Udostępnij ten post


Link to post
Share on other sites

Witam serdecznie, mam mały problem z zaimplementowaniem przycisku. Otóż chciałbym aby program wykonywał się do momentu osiągnięcia jakiegoś celu, a potem się wyłączył, taki STOP. Program można ponownie uruchomić po naciśnięciu przycisku. Narazie program działa tak, że po osiągnięciu celu nie zatrzymuje się, a ja nie potrafię znaleźć odpowiedniej to tego funkcji. Podaje kod.

int przekaznik=7;
#include "DHT.h"
#include <TM1637Display.h>
#define DHTPIN 2     // what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302)
DHT dht(DHTPIN, DHTTYPE);

const int przycisk = 3;  // Definicja pinu do którego podłączony jest przycisk
const int dioda =  8;   // Definicja pinu do którego podłączona jest dioda

void setup(void)
{
  pinMode(dioda, OUTPUT);       
  pinMode(przycisk, INPUT);      
  
  pinMode(przekaznik,OUTPUT);  // ustawienie pinu jako wyjście
  digitalWrite(przekaznik,LOW); // ustawienie na nim stanu niskiego
  Serial.begin(9600); //Begin serial communication

  dht.begin();
}


void loop(void)
{ 
  float h = dht.readHumidity();
  float t = dht.readTemperature();
if (dht.readTemperature()>=26)  // wywołanie funkcji warunkowej
{
    digitalWrite(przekaznik,HIGH);  // włączenie przekaźnika   
}

if  (dht.readTemperature()<=27)
  {
    digitalWrite(przekaznik,LOW);    
  }

    Serial.print("Humidity: "); 
    Serial.print(h);
    Serial.print(" %\t");
    Serial.print("Temperature: "); 
    Serial.print(t);
    Serial.println(" *C");
    delay(1000);

}

 

Udostępnij ten post


Link to post
Share on other sites
1 godzinę temu, hazi18 napisał:

Otóż chciałbym aby program wykonywał się do momentu osiągnięcia jakiegoś celu

Jakiego celu bo szklana kula mi się zepsuła i nie moge odgadnąć.

 

1 godzinę temu, hazi18 napisał:

a potem się wyłączył, taki STOP

Zrób wieczna pętlę.

 

1 godzinę temu, hazi18 napisał:

Program można ponownie uruchomić po naciśnięciu przycisku

W pętli badaj stan przycisku.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Sposobów na takie coś możesz mieć kilka - jeśli chcesz czekać na ten przycisk i olewać cały świat to "pusta" pętla while do momentu wciśnięcia przycisku - wtedy będzie reagował właściwie tylko na przerwania. Bardziej elegancką metodą będzie maszyna stanów - wtedy też możesz "zastopować" program, ale nadal masz możliwość komunikacji/odczytu wejść/wyjść czy też używania adc, żeby mieć aktualne dane, ale czekać na jakieś zdarzenie.

W 1 metodzie miałbyś tak:

twój kod
while (wcisniety przycisk){} -i w tej klamerce będzie latał w kółko do przycisku
dalszy kod

w 2 metodzie coś tak jakby:

stan 1 - wykonywanie twojego kodu// tylko, kiedy stan jest stanem 1, po wykonaniu zmienię stan na stan 2
stan 2 - czekanie na przycisk// ale nie stoję w 1 linijce kodu, tylko wykonuję się dalej, po wciśnięciu dopiero zmienię stan na 3
stan 3 - dalej kod// ale dopiero, jak stan 2 zmieni się stan na 3

Edytowano przez BananWszyscy

Udostępnij ten post


Link to post
Share on other sites

hej, dzięki za odpowiedź, myślałem coś tez o funkcji goto ale nie wychodziło mi to tak jak bym chciał. 2 metoda to case z tego co się orientuję tak? czy w tym 3 case jak wcisnę przycisk i dzięki funkcji goto przeskoczę do 1 case? jest to możliwe w case?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Ogólnie łatwo implementować maszynę stanów właśnie przez switch case - po prostu wewnątrz bloków sterujesz zmienną od switcha i tyle. W każdym momencie możesz tam ją zmieniać i przy kolejnym obiegu pętli wejdzie w określona przez ciebie część kodu

a skoki takie to już w przypadkach, gdzie naprawdę opłaca się to zastosować, jak już wyjście z kodu będzie mocno problematyczne

Edytowano przez BananWszyscy

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@RFM podałem przykładowy kod który mam napisany pod inkubator a chcę napisać program do czujnika przepływu wody. Czyli program liczy przepływ wody, jednak jeśli ten przepływ będzie ciągły i wynosił 30l. wtedy przepływomierz ma zamknąć zawór. Wtedy właśnie program ma "przestać działać". Po usunięciu usterki przyciskiem uruchamiam program i przepływ wody jest od nowa.

 

zbytnio nie umiem rozkminić jak mam mój kodzik przerobić na case? Chodzi o to, że z tego co widziałem case ma to do siebie, że trzeba mu dać bodziec w postaci przycisku (1, 2, 3) i wtedy dany blok się wykonuje. Ja chcę aby tutaj po osiągnięciu temp powyżej 26 stopni program ma wyłączyć przekaźnik ( najlepiej jakby jeszcze wyłączyć działanie programu aby po spadku poniżej 26 stopni znowu się nie włączył).

if (dht.readTemperature()>=26)  // wywołanie funkcji warunkowej
{
    digitalWrite(przekaznik,HIGH);  // włączenie przekaźnika   
}

else 
  {
    digitalWrite(przekaznik,LOW);    
  }

 

Edytowano przez hazi18

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...