Skocz do zawartości

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


Pomocna odpowiedź

Napisano (edytowany)

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

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

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

@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ę. 

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

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!

(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

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