Wylaczanie przekaznikow + sensor odleglosci - Damianso - 22-08-2017
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 :ie powiem mam troszkę ciasny łeb
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ą
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
Można poprosić o pomoc
RE: Wylaczanie przekaznikow + sensor odleglosci - adix - 22-08-2017
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;
}
RE: Wylaczanie przekaznikow + sensor odleglosci - Damianso - 23-08-2017
Cześć dziękuję za odpowiedź coś się poprawiło aczkolwiek nie działa to jak bym chciał, ja to chyba źle coś tłumaczę 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ń
RE: Wylaczanie przekaznikow + sensor odleglosci - adix - 23-08-2017
Spróbuje ci to opisać jak wrócę z roboty.
RE: Wylaczanie przekaznikow + sensor odleglosci - Damianso - 23-08-2017
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
RE: Wylaczanie przekaznikow + sensor odleglosci - Damianso - 23-08-2017
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);
}
}
}
|