• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Wylaczanie przekaznikow + sensor odleglosci
#1
Cześć
Mam pewien problem w zrozumieniu logiki programu w moim projekcie mam Ardka do niego podłączony LCD 2 x 16 i na nim wyświetlam wyniki pomiaru z czujnika odległości, dodatkowo podłączona jest listwa z czterema przekaźnikami.

Zamierzałem aby po syganel ode mnie, program zaczynał mierzyć odległość i w zależności od wyniku uruchamiał przekaźniki i chyba czegoś nie rozumiem :Smileie powiem mam troszkę ciasny łeb Big Grin

Chciałbym zrobić funkcję która po jej wywołaniu włączy przekaźnik 1, aż czujnik nie wskaże 30 cm, gdy dojdzie do 30 cm powinien się włączyć przekaźnik 2, a gdy dojdzie do wartości np 3cm oba się wyłaczają. A u mnie to włączają się jak chcą Big Grin

oto mój kod




Kod:
/*
NodeMCU i2C 16x2 LCD
Kod testowy
*/

#include <LiquidCrystal_I2C.h> // Dołączenie biblioteki do obsługi LCD
LiquidCrystal_I2C lcd(0x3F, 16, 2); // Konfiguracja portu LCD 0x3F, ilość znaków w jednej linii 16, ilość linii 2

#define trigPin 6 //ustawienie pinu 6 dla czujnika
#define echoPin 7 //ustawienie pinu 7 dla czujnika

#define p1 2 //definicja przekaznika 1
#define p2 3 //definicja przekaznika 2
#define p3 4 //definicja przekaznika 3
#define p4 5 //definicja przekaznika 4

int startPracy = 8; //sygnal aby zaczela sie wykonywac funkcja


void setup()
{
 pinMode(trigPin, OUTPUT); //Pin, do którego podłączymy trig jako wyjście
 pinMode(echoPin, INPUT); //a echo, jako wejście
 
 pinMode(p1, OUTPUT); //pin mody dla przekaznikow
 pinMode(p2, OUTPUT);
 pinMode(p3, OUTPUT);
 pinMode(p4, OUTPUT);
 
 digitalWrite(p1, HIGH); //ustawienie stanu poczatkowego dla przekaznikow
 digitalWrite(p2, HIGH);
 digitalWrite(p3, HIGH);
 digitalWrite(p4, HIGH);
}

void loop()
{

 pracaPrzekaznikow(); //wywolanie funkcji dla przekaznikow

}

//funcka mierzaca odelglosc zwraca wynik w cm

int zmierzOdleglosc() {
 long czas, dystans;

 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);

 czas = pulseIn(echoPin, HIGH);
 dystans = czas / 58;

 return dystans;
 
}

void pracaPrzekaznikow(){

 lcd.init();   // Funkcja inicjalizujaca LCD
 lcd.backlight(); // Włączenie lub wyłączenie podświetlania LCD
 lcd.setCursor(0, 0); //ustawienie karetki znak 0 / linia 2
 lcd.print("Tryb Pracy"); // Wyświetlenie „Witaj Świecie” w pierwszej linii
 lcd.setCursor(0, 1);//ustawienie karetki /znak 0 / linia 2      
 lcd.print(zmierzOdleglosc()); // Wyświetlenie „Witaj” w drugiej linii
 delay(1000);
 
 if(startPracy == 8){
     
     if (zmierzOdleglosc() < 30) {// odleglosc mniejsza od 30cm
         
     digitalWrite(p1, LOW); // zmiana stanu przekaznika, start pracy
     


     lcd.init();   // Funkcja inicjalizujaca LCD
     lcd.backlight(); // Włączenie lub wyłączenie podświetlania LCD
     lcd.setCursor(0, 0); //ustawienie karetki znak 0 / linia 2
     lcd.print(zmierzOdleglosc()); // Wyświetlenie w pierwszej linii
     lcd.setCursor(0, 1);//ustawienie karetki /znak 0 / linia 2      
     lcd.print("Przekaznik 1 wlaczony"); // Wyświetlenie  w drugiej linii
     
     }  else {
       
       digitalWrite(p1, HIGH);
       digitalWrite(p2, LOW);
       lcd.init();   // Funkcja inicjalizujaca LCD
       lcd.backlight(); // Włączenie lub wyłączenie podświetlania LCD
       lcd.setCursor(0, 0); //ustawienie karetki znak 0 / linia 2
       lcd.print(zmierzOdleglosc()); // Wyświetlenie w pierwszej linii
       lcd.setCursor(0, 1);//ustawienie karetki /znak 0 / linia 2      
       lcd.print("Przekaznik 2 wlaczony"); // Wyświetlenie w drugiej linii
     
         
         
         }
         if(zmierzOdleglosc() == 3) {
         
         digitalWrite(p2, HIGH);
         
         lcd.init();   // Funkcja inicjalizujaca LCD
         lcd.backlight(); // Włączenie lub wyłączenie podświetlania LCD
         lcd.setCursor(0, 0); //ustawienie karetki znak 0 / linia 2
         lcd.print(zmierzOdleglosc()); // Wyświetleniew pierwszej linii
         lcd.setCursor(0, 1);//ustawienie karetki /znak 0 / linia 2      
         lcd.print("Praca zakonczona"); // Wyświetlenie w drugiej linii
       
       
       }


   
   
   
   
   }
 
 
 }
 
Odleglosc mierzy sie dobrze LCD wyswitla dobrze ale przekaźniki nie działają z moim planem Sad

Można poprosić o pomoc
 
Odpowiedź
#2
Nie chce mi się kodu ci przerabiać(i nie mam czasu) ale wytłumacz ci jak to ma działać .
Kod:
if (zmierzOdleglosc() < 3000){
   if (zmierzOdleglosc() < 29){
//załącz przekaźnik 2;
}

   if (zmierzOdleglosc() < 30){
//załącz przekaźnik 1;

}
}
else{
//wyłącz przekaźnik 1;
//wyłącz przekaźnik 2;

}
Tak to powiano mniej więcej działać.

Jeśli by stało się ze na progach przełączania miał byś klikanie na przemian przekaźników to podmień na:
Kod:
if (zmierzOdleglosc() < 30){
//załącz przekaźnik 1;
//załącz przekaźnik 2;
}
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#3
Cześć dziękuję za odpowiedź coś się poprawiło aczkolwiek nie działa to jak bym chciał, ja to chyba źle coś tłumaczę Big Grin bo obecny status jest prawie podobny do tego przed zmianami, cała praca tych przekaźników to ma działać jak funkcja w programie do podmiany płynu w zbiorniku coś jak ten algorytm


1. Start programu (u mnie jest to ustawienie wartości zmiennej na np 8)
2. Uruchomienie przekaźnika 1
3. Wypompowanie 30 cm płynu (pomiar sensorem)
4. Wypompowało 30 cm płynu(pomiar dobry 30cm)
5. Wyłaczenie przekaźnika 1
6. Załaczenie przekaźnika 2
7. Pomiar sensorem aż do np 4 cm
8. Pomiar pokazuje 4 cm
9. Wyłączenie przekaźnika 2
10. koniec programu podmiany płynu

I tak np co trzeci tydzień
 
Odpowiedź
#4
Spróbuje ci to opisać jak wrócę z roboty.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
Odpowiedź
#5
Ok dziekuję ogólnie to doszedłem do takiego etapu wraz z jedna osoba z innego forum programistycznego
i efekt jest dobry tzn raz działa jeden przekaźnik, raz drugi, teraz się tylko zastanawiam jak zatrzymac oba po wypompowaniu


Kod:
if (czynnosc){
 
 if (max < odleglosc()) { // ma np pompować wodę
   //pompuj wode pompa 2
   digitalWrite(p2, LOW);
   digitalWrite(p1, HIGH);
   

 } else { // jak przekroczyło zmień na wypompowywanie
 
   czynnosc = false;
   
 }}

} else {

 if (min > odleglosc()) { // wypompuj
   //wypompuj wode
   digitalWrite(p1, LOW);
   digitalWrite(p2, HIGH);

   
 } else { // jak spadło to zmień na pompowanie
   czynnosc = true;
 
   
 }
 
}

Gdzieć musi zaistnieć warunek z wyłaczeniem tlyko nie wiem w którym miejscu Big Grin
 
Odpowiedź
#6
Problem rozwiązany system działa jak chciałem poniżej rozwiązanie

Kod:
if (czynnosc){
 
 if (min > odleglosc()) { // wypompowanie
   
   digitalWrite(p1, LOW);

 } else { // jak przekroczyło zmień na wypompowywanie

   czynnosc = false;
   
 }

} else {

 if (max < odleglosc()) { //uzupelnianie wody
   
   digitalWrite(p1, HIGH);
   digitalWrite(p2, LOW);
   
 } else { // jak spadło to zmień na pompowanie
   //czynnosc = true;
 
      if(odleglosc() <7){ // jezeli przy dolewaniu dojdzie do 7cm stop oba przekazniki
       digitalWrite(p1, HIGH);
       digitalWrite(p2, HIGH);
   }
 }
 
}
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości