Skocz do zawartości

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).

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
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);

}

 

Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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.

Link to post
Share on other sites

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
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?

Link to post
Share on other sites

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
Link to post
Share on other sites

@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
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!

Anonim
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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.