20-06-2018, 22:45
Witam,
Mam taki kod do sterowania przekaźnikiem zgrzewarki, własnej roboty i mam taki problem, że ten oto kod po wciśnięciu przycisku zaczyna odliczać czas 3 sekundy i wykonuje zgrzewanie. Problem polega na tym, że chciałbym aby zgrzewanie włączało się od razu po naciśnięciu tego przycisku, a po zgrzaniu odliczał te 3 sekundy w celu zablokowania możliwości ponownego zgrzewania przez ten czas. Przenosiłem wielokrotnie we wszelaki sposób niektóre polecenia, np. Funkcję
digitalWrite(8, HIGH); //Zgrzewanie
delay(czas);//czas trwania zgrzewania
przenosiłem nad funkcję 3 sekundowego opóźnienia, to czas trwania zgrzewania wynosił (czas) + te 3 sekundy.
Zamiast else zastosowałem ten kod i umiejscowiłem go nad funkcją 3 sekundowego opóźnienia
digitalWrite(8, HIGH); //Zgrzewanie
delay(czas);//czas trwania zgrzewania
if (digitalRead(7) == HIGH){
digitalWrite(8, LOW); //Nie zgrzewaj
to wtedy kod działał prawie tak jak chciałem, bo jeżeli przytrzymałem przycisk przez krótszy czas niż ustawione zgrzewanie to działało prawidłowo ale jak np. mam ustawiony czas zgrzewania na 75ms, to trzymając przycisk dłużej niż ten czas, to znów zgrzewanie wynosi (czas) + 3sekundy. Już od kilku godzin siedzę przy tym kodzie i już szlak mnie trafia. Bardzo proszę o pomoc.
KOD
int odczytanaWartosc = 0;
int czas = 0;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
lcd.begin(16,2);
lcd.clear();
lcd.backlight();
pinMode(8, OUTPUT); // zasilenie- przekaźnik
pinMode(7, INPUT_PULLUP); // przycisk
}
void loop()
{
lcd.setCursor(0,0);
lcd.print("Czas Zgrzewania:");
lcd.setCursor(0,1);
lcd.print(" ms");
odczytanaWartosc = analogRead(A1); // odczyt ustawienia potencjometru
lcd.setCursor(0,1);
czas = odczytanaWartosc * (1000/1023.0) ; // zakres ustawienia czasu do 1000ms
lcd.print(czas);
delay(200);
if (digitalRead(7) == LOW) {
lcd.clear();
lcd.print("Zgrzewanie");
lcd.setCursor(0,1);
lcd.print(" ms");
lcd.setCursor(0,1);
lcd.print(czas) ;
delay(1000);
lcd.clear();
lcd.print("3") ;
delay(1000);
lcd.clear();
lcd.print("2") ;
delay(1000);
lcd.clear();
lcd.print("1") ;
delay(1000);
digitalWrite(8, HIGH); //Zgrzewanie
delay(czas);//czas trwania zgrzewania
}
else {
digitalWrite(8, LOW); //Nie zgrzewaj
}
}
Mam taki kod do sterowania przekaźnikiem zgrzewarki, własnej roboty i mam taki problem, że ten oto kod po wciśnięciu przycisku zaczyna odliczać czas 3 sekundy i wykonuje zgrzewanie. Problem polega na tym, że chciałbym aby zgrzewanie włączało się od razu po naciśnięciu tego przycisku, a po zgrzaniu odliczał te 3 sekundy w celu zablokowania możliwości ponownego zgrzewania przez ten czas. Przenosiłem wielokrotnie we wszelaki sposób niektóre polecenia, np. Funkcję
digitalWrite(8, HIGH); //Zgrzewanie
delay(czas);//czas trwania zgrzewania
przenosiłem nad funkcję 3 sekundowego opóźnienia, to czas trwania zgrzewania wynosił (czas) + te 3 sekundy.
Zamiast else zastosowałem ten kod i umiejscowiłem go nad funkcją 3 sekundowego opóźnienia
digitalWrite(8, HIGH); //Zgrzewanie
delay(czas);//czas trwania zgrzewania
if (digitalRead(7) == HIGH){
digitalWrite(8, LOW); //Nie zgrzewaj
to wtedy kod działał prawie tak jak chciałem, bo jeżeli przytrzymałem przycisk przez krótszy czas niż ustawione zgrzewanie to działało prawidłowo ale jak np. mam ustawiony czas zgrzewania na 75ms, to trzymając przycisk dłużej niż ten czas, to znów zgrzewanie wynosi (czas) + 3sekundy. Już od kilku godzin siedzę przy tym kodzie i już szlak mnie trafia. Bardzo proszę o pomoc.
KOD
int odczytanaWartosc = 0;
int czas = 0;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
void setup()
{
lcd.begin(16,2);
lcd.clear();
lcd.backlight();
pinMode(8, OUTPUT); // zasilenie- przekaźnik
pinMode(7, INPUT_PULLUP); // przycisk
}
void loop()
{
lcd.setCursor(0,0);
lcd.print("Czas Zgrzewania:");
lcd.setCursor(0,1);
lcd.print(" ms");
odczytanaWartosc = analogRead(A1); // odczyt ustawienia potencjometru
lcd.setCursor(0,1);
czas = odczytanaWartosc * (1000/1023.0) ; // zakres ustawienia czasu do 1000ms
lcd.print(czas);
delay(200);
if (digitalRead(7) == LOW) {
lcd.clear();
lcd.print("Zgrzewanie");
lcd.setCursor(0,1);
lcd.print(" ms");
lcd.setCursor(0,1);
lcd.print(czas) ;
delay(1000);
lcd.clear();
lcd.print("3") ;
delay(1000);
lcd.clear();
lcd.print("2") ;
delay(1000);
lcd.clear();
lcd.print("1") ;
delay(1000);
digitalWrite(8, HIGH); //Zgrzewanie
delay(czas);//czas trwania zgrzewania
}
else {
digitalWrite(8, LOW); //Nie zgrzewaj
}
}