Skocz do zawartości

Jak poprawnie sterować silnikiem dc na podstawie temperatury


krystian1826

Pomocna odpowiedź

Cześć wszystkim.

Nie dawno za czołem bawić się w arduino i nie moge poradzić sobie z kodem takiego termostatu do pieca



void loop() {
sensors.requestTemperatures();
lcd.display();
lcd.setCursor(2, 0);
lcd.print(temp_1);
lcd.setCursor(5, 1);
lcd.print(sensors.getTempCByIndex(0));
lcd.print("*C");
float temperatura = sensors.getTempCByIndex(0);

if (temperatura >= 51 && temperatura <= 56) {
 digitalWrite(13, LOW); //klapa zamknięta 
 delay(3000);
 digitalWrite(13, HIGH);
 }
 if (temperatura < 51) {
   digitalWrite(12, LOW); //klapa otwarta 
 delay(3000);
 digitalWrite(12, HIGH);
   }
   }



Problem polega na tym ze chce miedzy 51 a 56 stopni zamknąć klapę a jeśli jest poniżej 51 stopni otworzyć klapę program działa ale cały czas pyka przekaźnik na 3 sekundy bo program lata w pętli a temperatura jest poniżej , jak to zatrzymać ?

Link do komentarza
Share on other sites

Nie wiemy co to znaczy "zamknąć klapę", nie wiemy co znaczy "otworzyć klapę" ani nie wiemy co to jest "przekaźnik" - jak jest podłączony, do czego i co robi. Widzimy za to jakieś piny nr. 12 i 13 na które wysyłasz 3-sekundowe impulsy. Jakiej oczekujesz pomocy? Delay(milion) powinno poważnie zatrzymać Twój program, jeśli chodzi tylko o zatrzymanie.

Napisz może coś więcej, narysuj jakiś schemat podłączenia Arduino do reszty układu i opisz jak sterujesz tą klapą, bo na razie to wtopa na dzień dobry.

BTW: A co tam masz za czołem?

Link do komentarza
Share on other sites

Do arduino podłączony jest moduł przekaźników i na podstawie czujnika temperatury chce sterować klapą ciągu pieca w garażu, cały kod poniżej program działa w ten sposób że klika przekaźnikiem co 3 sekundy zamiast się zatrzymać i nie potrafię tego ogarnąć

#include <OneWire.h>
#include <DallasTemperature.h>
#include <LiquidCrystal.h> //Dołączenie bilbioteki
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); //Informacja o podłączeniu nowego wyświetlacza
String logo_1 = "Miarkownik";
String logo_2 = "Sterownik pieca C.O";
String temp_1 = "Temp. pieca";
OneWire oneWire(A5);
DallasTemperature sensors(&oneWire);

void setup() {
 pinMode(13,OUTPUT);
 pinMode(12,OUTPUT);
 digitalWrite(13, HIGH);
 digitalWrite(12, HIGH);
 sensors.begin();
 lcd.begin(16, 2); //Deklaracja typu
  lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.print(logo_1);
 delay(2000);
 lcd.noDisplay();
 lcd.setCursor(0, 0); //Ustawienie kursora
 lcd.display();
 lcd.print(logo_2);
 delay(3000);
 lcd.noDisplay();
 lcd.clear();
}

void loop() {
sensors.requestTemperatures();
lcd.display();
lcd.setCursor(2, 0);
lcd.print(temp_1);
lcd.setCursor(5, 1);
lcd.print(sensors.getTempCByIndex(0));
lcd.print("*C");
float temperatura = sensors.getTempCByIndex(0);

if (temperatura >= 51 && temperatura <= 56) {
 digitalWrite(13, LOW); //klapa zamknięta 
 delay(3000);
 digitalWrite(13, HIGH);
 }
 if (temperatura < 51) {
   digitalWrite(12, LOW); //klapa otwarta 
 delay(3000);
 digitalWrite(12, HIGH);
   }
} 


Link do komentarza
Share on other sites

program działa w ten sposób że klika przekaźnikiem co 3 sekundy zamiast się zatrzymać i nie potrafię tego ogarnąć

"Klika" bo nie pamięta, że już to wykonał. Spróbuj zapamiętać stan urządzenia i uwzględnij ten stan przy sprawdzaniu temperatury.

Pierwszy raz czytam, że ktoś chce by program się "zatrzymał" - zatrzymał czyli zawiesił, żaden programista tego nie chce. Narysuj sobie algorytm tego programu, przeanalizuj jego działanie, zastanów się nad tym jak program ma według Ciebie działać i pokaż ten algorytm.

Pozdrawiam,

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

Nie chodzi mi o zawieszanie tylko żeby po osiągnieciu temperatury włączył przekaźnik na 3 sekundy i tyle i czekał na kolejne zmiany i właśnie dlatego nie potrafię tego zrobić poprzez nawet zaimplementowania tego zapamiętania stanu

Link do komentarza
Share on other sites

ma włączyć przekaźnik zamykając klape ,temperatura spadnie klape ma otworzyć jesli dorobie silnik dc zwykły z łańcuszkiem do klapy to nie może co chwile się załączać tylko pracować w ustawionym prze ze mnie zakresie bo zerwie łańcuszek

link z podobnym projektem

Link do komentarza
Share on other sites

Gość es2

Kod kiepski, nie sprawdza czy czujnik nie jest uszkodzony, nie ma watchdoga, temperaturę wyświetla co 3 sekundy a można by dużo częściej. Na wyświetlaczu brak informacji o zadziałaniu BOD. Dużo pracy trzeba jeszcze włożyć aby to nadawało się do użytku.

Co do podstawowego problemu

if (temperatura >= 51 && temperatura <= 56) {
 digitalWrite(13, LOW); //klapa zamknięta
 delay(3000);
 digitalWrite(13, HIGH);
 }
 if (temperatura < 51) {
   digitalWrite(12, LOW); //klapa otwarta
 delay(3000);
 digitalWrite(12, HIGH);
   }
}

Zawsze myślałem, że jakikolwiek regulacja realizowana jest jeśli coś jest większe lub mniejsze, tu mamy zamknięcie klapy gdy temperatura w zadanym przedziale. Otwarcie gdy mniejsza niż zadana. Gdy temperatura większa niż ten przedział to nic się nie dzieje. Dziwne? Dlaczego tak ma być? Nie rozumie tego.

Zamiast magicznych cyferek w "digitalWrite" zadeklaruj czytelne nazwy np OTWIERANIE_KLAPY, ZAMYKANIE_KLAPY.

Załączanie i wyłączanie przekaźnika/silnika jest spowodowane dwoma czynnikami:

- brak histerezy

- wyłączaniem przekaźnika na czas pomiaru temperatury

- ponownym włączaniem gdy temperatura spełnia określone kryteria.

Algorytm, który jest realizowany przez ten program, nie nadaje się do sterowania silnikiem, który otwiera/zamyka jakiś zawór. Ten algorytm, to bardziej to grupowego sterowania triakiem i to tez nie za bardzo.

Przeanalizuj program krok po kroku, co robi.

1. Pomiar temperatury (nie wnikam jak realizowany ale pewnie niepotrzebnie czeka 700ms)

2. jeśli temperatura w zakresie 51..56 stopni:

- włącz zamykanie klapy

- czekaj 3 sekundy

- wyłącz zamykanie klapy

3. Jeśli temperatura niższa niż 51 stopni:

- włącz otwieranie klapy

- czekaj 3 sekundy

- wyłącz otwieranie klapy

4. Skok do pkt 1

Prawdopodobnie, algorytm regulacji ma być mniej więcej taki (6 stopni to pewnie ma być histereza):

1. Jeśli temperatura niższa niż 51 stopni i klapa zamknięta otwórz klapę.

2. Jeśli temperatura wyższa niż niż 56 stopni i klapa otwarta zamknij klapę.

3. Wynika sam z siebie, jeśli temp. w zakresie 51..56 nie rób nic.

Algorytm już masz, teraz tylko napisać program.

Pojawi się kolejny kłopot. Po włączeniu zasilania nie wiadomo w jakim stanie jest klapa? Trzeba zmiany stanu zapisywać do eeprom i odczytywać po resecie. Jak już zaczniesz robić obsługę eeprom, to warto zapamiętać w niej nastawy temperatury aby nie trzeba było kompilować i wgrywać softu przy jej zmianie. W takiej sytuacji (pomijam jak wprowadzać temperaturę) trzeba dane w eeprom zabezpieczyć przez CRC. Co jak CRC złe? Warto zrobić podwójną kopię, awaria jednej, to odtwarzamy z drugiej. Co jak obie złe? Dajemy jakieś wartości domyślne i informujemy o tym fakcie na wyświetlaczu.

Link do komentarza
Share on other sites

To mamy epidemię. Kolejna osoba na przestrzeni kilku dni, która nie umie przekazać w kilku zdaniach co chce zrobić. A może inaczej, wie jaki ma być cel, ale nie umie przełożyć tego na opis działania urządzenia. Stąd biorą się problemy, bo jeśli nie umiesz ułożyć dobrego planu pracy (tak jakbyś sam miał to robić), to nie napiszesz programu. Siadasz do komputera, oglądasz filmik i usilnie myślisz "chcę tak samo, chcę tak samo" po czym odpalasz Arduino i klepiesz bezmyślnie linie trywialnego kodu zamiast posiedzieć godzinę z rękami pod tyłkiem i zastanowić się jak to ma właściwie działać.

1. Dlaczego akurat 3 sekundy?

2. Czy wiesz co znaczy stan urządzenia, bo piszesz, że "nie potrafię tego zrobić poprzez nawet zaimplementowania tego zapamiętania stanu". Moim zdaniem nie rozumiesz o czym piszesz.

Moja powtarzająca się w takich wypadkach rada: zapomnij o procesorze, silnikach i klapce i wyobraź sobie, że to Ty jesteś odpowiedzialny za sterowanie tym obiektem. Nie wiesz nic o świecie, jesteś zamknięty w czarnym pokoju bez okien i masz do dyzpozycji tylko to co sam do procesora podłączyłeś, a zatem:

- "wyświetlacz" pokazujący temperaturę (to te Twoje pomiary),
- dwie wajchy właczające jakieś dwa wyjścia.

Koniec. Ja nie wiem czy to wystarczy, może okazać się, że nie. Napisz sobie teraz przepis na działanie, koniecznie w prostych punktach/akcjach wykonywanych po kolei i ew. testach/rozgałęzieniach. Aktualny Twój program robi tak:

1. Zmierz temperaturę i coś tam wyświetlaj

2. Jeżeli temperatura jest poza zakresem 51..56, idź do pkt. 6

3. Włącz wajchę A

4. Poczekaj 3 sekundy

5. Wyłącz wajchę A

6. Jeżeli temperatura jest >51 idź do pkt. 1

7. Włącz wajchę B

8. Poczekaj 3 sekundy

9. Wyłącz wajchę B

10. Idź do pkt. 1.

A teraz przeczytaj to bardzo uważnie, prześledź drogę (którymi ścieżkami podąża praca gdy temperatura jest <51, w zakresie 51..56 oraz gdy >56) jaką będziesz za chwilę sam przechodził w ciemnym pokoju i zastanów się jaki głupek z Zarządu napisał ten plan. Po czym napisz lepszy. Nie w języku programowania tylko po polsku, w punktach jak powyżej. Dopiero gdy to będziesz miał a Twój algorytm obroni się w symulacjach myślowych po przejściu wszystkich ścieżek, możesz usiąść do komputera. W obecnym stanie nikogo nie obchodzą Twoje programy, bo nie umiesz wyrazić słowami tego co chcesz zrobić. Skup się i do roboty.

Link do komentarza
Share on other sites

Gość es2

Obejrzałem fil z linku https://www.youtube.com/watch?v=aFYfCc1Lb2c. Totalna amatorszczyzna.

Oczywiście krańcówki są problematyczne, najlepiej aby informacja z krańcówek trafiała do uC aby stwierdzić czy silnik wykonał zadanie i ewentualnie alarmować. Jeśli jednak nie ma krańcówek to należy badać prąd pobierany przez silnik. Daje to dwie informacje:

- to czy silnik pracuje

- czy napotkał opór

Tej funkcji "sterownik" z linku nie ma!

Aby jednak było to rozwiązanie godne pochwalenia się na Youtube program i sprzęt powinien realizować wszystkie opcje czy pomiar prądu i krańcówki. Rozbudowa sprzętu banalna. Potrzebne dwa wejścia (z zabezpieczeniami ESD) i rezystor do pomiaru prądu. Aby nie "walczyć" z wzmacniaczem operacyjnym wystarczy wybrać uC z wbudowanym wzmacniaczem.

Link do komentarza
Share on other sites

No dobrze, zmiażdżyłeś projekt z filmiku w wielkim stylu rasowego profesjonalisty. A czy możesz jakoś pomóc autorowi? Bo po to tu zaglądasz, prawda? Czy może się mylę?

Wyłączniki krańcowe mogą być dla niego nowością (choć nie sądzę). Napisz do czego służą i to tak żeby zrozumiał i mógł je zaimplementować u siebie wg Twojego pomysłu. Być może już to zrobił i zapomniał o tym wspomnieć.

"godne pochwalenia się na Youtube"

Słowo "godne" zawsze mnie bawi w takich kontekstach 🙂

Link do komentarza
Share on other sites

Gość es2
A czy możesz jakoś pomóc autorowi?

Już pomogłem. Dałem algorytm ("w ciemno" bo przed obejrzeniem filmu) według, którego może napisać program i zadziała tak jak na filmiku.

Wyłączniki krańcowe mogą być dla niego nowością (choć nie sądzę). Napisz do czego służą i to tak żeby zrozumiał

W necie sobie poczyta. To nie przedszkole i tabliczki mnożenia czy lutowania przewodów nie będę uczył. Na forum Majsterkowo sa takie rzeczy.

i mógł je zaimplementować u siebie wg Twojego pomysłu.

Jak uruchomi klapkę, to będzie wiedział jaki dodać warunek aby silnik nie był uruchamiany gdy osiągnął wymagana pozycję. Więcej zabawy będzie w timeout bo zacznie się jazda z niefortunnym millis a sterownik będzie działał 24/h.

Link do komentarza
Share on other sites

lutowania przewodów nie będę uczył. Na forum Majsterkowo sa takie rzeczy.

No i jak teraz czują się uczestnicy kursu lutowania? https://forbot.pl/blog/kurs-lutowania-wstep-spis-tresci-id12556

Wychodzi na to że jak skończą kurs to muszą forum zmienić.

Szkoda że na forum nie ma jakiegoś anty-piwa, chętnie bym za takie wypowiedzi wręczał...

Link do komentarza
Share on other sites

Gość es2
lutowania przewodów nie będę uczył. Na forum Majsterkowo sa takie rzeczy.

No i jak teraz czują się uczestnicy kursu lutowania? https://forbot.pl/blog/kurs-lutowania-wstep-spis-tresci-id12556

Wychodzi na to że jak skończą kurs to muszą forum zmienić.

Szkoda że na forum nie ma jakiegoś anty-piwa, chętnie bym za takie wypowiedzi wręczał...

Ale Pan pomogłeś ta wypowiedzią autorowi wątku, oj pomógł. Aż mu klapki pospadały.

Tak to już jest, ze jak ktoś się na czymś nie zna, to pisze nie na temat, aby pisać, aby więcej, tak jak w PiS, aby gadać, aby nie na temat.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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