Skocz do zawartości

Zgrzewarka na arduino.Jak przerwać pętlę.Wciśnięty przycisk chwilowy cały czas wyzwala zgrzewanie.


wmpir88

Pomocna odpowiedź

Witam serdecznie.

Na początek zaznaczę, że w kwestii arduino nawet nie mogę się nazwać początkującym.

Zwracam się o jednorazową pomoc i więcej nie będę zawracał wam głowy.

Korzystam ze zgrzewarki opartej na projekcie: https://majsterkowo.pl/zgrzewarka-do-ogniw-z-transformatora-mikrofalowki/

Korzystam też z kodu autora projektu, który powoduje, że trzymanie przycisku powoduje ciągłe wyzwalanie zgrzewania.
Chciałbym, żeby kod poczekał na puszczenie przycisku i dopiero zezwolił na kolejną akcję.

/*
*  LCM1602 & Arduino Uno
*  VCC - > 5 V
*  GND - GND
*  SCL -> A5
*  SDA -> A4
*/
int odczytanaWartosc = 0;
int czas = 0;
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
 
void setup()  
{
  lcd.begin(16,2);
  lcd.clear();
  lcd.backlight(); 
     pinMode(8, OUTPUT); // zasilenie- przekaźnik
     pinMode(7, INPUT_PULLUP); // przycisk
     pinMode(9, OUTPUT); // buzzer
}
void loop() 
{
  lcd.setCursor(0,0);
  lcd.print("Czas impulsu:");
  lcd.setCursor(0,1);
  lcd.print("    ms");
  odczytanaWartosc = analogRead(A1); // odczyt ustawienia potencjometru
  lcd.setCursor(0,1); 
  czas = odczytanaWartosc * (100/1023.0) ;
  lcd.print(czas);
  delay(200);
 if (digitalRead(7) == LOW) {
  digitalWrite(9, HIGH); //buzzer on
  delay(100);
  digitalWrite(9, LOW); //buzzer off
  lcd.setCursor(0,1);
  lcd.print("    ms");
  lcd.setCursor(0,1);
  lcd.print(czas) ;
  delay(250);
  lcd.clear();
  digitalWrite(8, HIGH); //zgrzewanie
  digitalWrite(9, HIGH); //buzzer on
  delay(czas); //czas trwania zgrzewania
  digitalWrite(8, LOW); //Wyłączenie zgrzewania
  digitalWrite(9, LOW); //buzzer off
  
  }
  else {
  }
}

Jak już wspomniałem proszę o jednorazową pomoc.

Z góry dziękuję.

Pozdrawiam

Bogdan B.

Edytowano przez wmpir88
Link do komentarza
Share on other sites

(edytowany)
 if (digitalRead(7) == LOW && stan == 1) {
  digitalWrite(9, HIGH); //buzzer on
  delay(100);
  digitalWrite(9, LOW); //buzzer off
  lcd.setCursor(0,1);
  lcd.print("    ms");
  lcd.setCursor(0,1);
  lcd.print(czas) ;
  delay(250);
  lcd.clear();
  digitalWrite(8, HIGH); //zgrzewanie
  digitalWrite(9, HIGH); //buzzer on
  delay(czas); //czas trwania zgrzewania
  digitalWrite(8, LOW); //Wyłączenie zgrzewania
  digitalWrite(9, LOW); //buzzer off
  stan = 0;
  }
  else {
    stan = 1;
  }

Wklej ten kawałek kodu w odpowiednie miejsce...

 

I do części globalnej tam gdzie masz wszystkie zmienne wklej to co poniżej... 

bool stan = 1;

 

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Gość

@farmaceuta Na pewno to co napisałeś jest ok?  Nie powinno czasem być np. tak?

else if (digitalRead(7) == HIGH) {
    stan = 1;
  }

Zresztą ja też jestem mocno początkującym, dlatego tylko pytam...

Link do komentarza
Share on other sites

6 minut temu, rafal220 napisał:

@farmaceuta Na pewno to co napisałeś jest ok?  Nie powinno czasem być np. tak?

else if (digitalRead(7) == HIGH) {
    stan = 1;
  }

Zresztą ja też jestem mocno początkującym, dlatego tylko pytam...

Nie musi tak być...else wykona się wtedy jeśli na pinie 7 będzie coś innego niż stan LOW...a jak wiadomo mamy tylko dwa stany LOW/HIGH gdzie HIGH pojawi się tylko wtedy kiedy guzik/pin nie wciśnięty tak że jest ok

Link do komentarza
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

Gość

@farmaceuta Ale autor chce aby układ wrócił do gotowości dopiero po odpuszczeniu stopki.

Jeżeli w if zmienna "stan" przejdzie na "0" to przy następnym biegu programu wykona się else zanim jeszcze puścisz stopkę. 

Link do komentarza
Share on other sites

Gość
17 minut temu, ethanak napisał:

A w ogóle kłania się Bounce2 - lepiej analizować wciśnięcie/puszczenie przycisku niż stan.

Masz rację, ale autor w programie załadował takie czasy delay, że można to odpuścić...

Zresztą w ogóle ten program jest tak zrobiony, że od zgrzewania ogniw to raczej trzymałbym się z daleka. Co najwyżej jakaś zgrzewarka do grubej blachy, ze sterowaniem grupowym triaka/ tyrystorów. 

Przecież ten program nawet nie ma regulacji mocy poprzez synchronizację z zerem. xD Zastanawiam się, czy dla autora nie będzie bezpieczniej kupić gotowy moduł made in china za kilka dyszek z konkretnym triakiem 100A który nie daj Boże się nie uszkodzi w czasie zgrzewania większego pakietu akumulatorów...  

Link do komentarza
Share on other sites

1 godzinę temu, rafal220 napisał:

@farmaceuta Ale autor chce aby układ wrócił do gotowości dopiero po odpuszczeniu stopki.

Jeżeli w if zmienna "stan" przejdzie na "0" to przy następnym biegu programu wykona się else zanim jeszcze puścisz stopkę. 

Zwracam honor... racja!

Link do komentarza
Share on other sites

(edytowany)

Bardzo dziękuję za pomoc.

Jesteście wspaniali !

Nie wiem czy dobrze to zrobiłem:

/*
*  LCM1602 & Arduino Uno
*  VCC - > 5 V
*  GND - GND
*  SCL -> A5
*  SDA -> A4
*/
bool stan = 1;
int odczytanaWartosc = 0;
int czas = 0;
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27, 16, 2);
 
 
void setup()  
{
  lcd.begin(16,2);
  lcd.clear();
  lcd.backlight(); 
     pinMode(8, OUTPUT); // zasilenie- przekaźnik
     pinMode(7, INPUT_PULLUP); // przycisk
     pinMode(9, OUTPUT); // buzzer
}
void loop() 
{
  lcd.setCursor(0,0);
  lcd.print("Czas impulsu:");
  lcd.setCursor(0,1);
  lcd.print("    ms");
  odczytanaWartosc = analogRead(A1); // odczyt ustawienia potencjometru
  lcd.setCursor(0,1); 
  czas = odczytanaWartosc * (100/1023.0) ;
  lcd.print(czas);
  delay(200);
 if (digitalRead(7) == LOW && stan == 1) {
  digitalWrite(9, HIGH); //buzzer on
  delay(100);
  digitalWrite(9, LOW); //buzzer off
  lcd.setCursor(0,1);
  lcd.print("    ms");
  lcd.setCursor(0,1);
  lcd.print(czas) ;
  delay(250);
  lcd.clear();
  digitalWrite(8, HIGH); //zgrzewanie
  digitalWrite(9, HIGH); //buzzer on
  delay(czas); //czas trwania zgrzewania
  digitalWrite(8, LOW); //Wyłączenie zgrzewania
  digitalWrite(9, LOW); //buzzer off
  stan = 0;
  }
  else {
    stan = 1;
  }
}

Bo po wgraniu wyświetlacz nie wyświetla tekstu i mruga a wciśnięty i trzymany przycisk nadal cały czas wyzwala zgrzewanie 😞

Aktualizacja:

Mruganie wyświetlacza spowodowane tym, że symulator kodu na https://wokwi.com nie chciał zadziałać z oryginalnym kawałkiem kodu:

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Działanie przycisku nie zmieniło się

Aktualizacja 2:

Dodanie

else if (digitalRead(7) == HIGH) {

pomogło i teraz sprzęt działa fantastycznie.

Jeszcze raz dziękuję ❤️

Viva la https://forbot.pl !

Edytowano przez wmpir88
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.