Skocz do zawartości

Sterownik pieca CO


Mialek

Pomocna odpowiedź

Witam jestem nowy na forum i zaczynam zabawę z Arduino.

Do tej pory udało postawić mi się domoticza na raspberry i sterowac zdalnie swiatłem w pokoju i odczytywać temperaturę.

Teraz kupiłem Arduino ponieważ jest o wiele więcej informacji, biblotek i pomocy po polsku.

Co do tematu, napisałem kod który ma odczytywać temperaturę i dostosować uchylenie klapki cugu pieca, niestety nie mogę ustawić przycisków do sterowania temperaturą, a następnie użyć #define temperatura do sterowania, niestety muszę trzymać przycisk1 zeby dodać temperaturę, a chcę żeby po krótkim nacisnieciu dodawało? help?

##EDIT##

dokładnie to jak 2 przyciskami dodawać i odejmować temperaturę

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Servo.h>
#define przycisk1 2
#define przycisk2 3

Servo myservo;
byte pozycja = 0; //pozycja serva
int pozycjaPoprzednia = 0;
int temperatura = 0;

OneWire oneWire(A5); //Podłączenie do A5
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki


void setup(void) {
 myservo.attach(11);
 Serial.begin(9600);
 sensors.begin(); //Inicjalizacja czujnikow


}

void loop(void) { 
 pinMode(3, INPUT_PULLUP);
 pinMode(2, INPUT_PULLUP);  

 sensors.requestTemperatures(); //Pobranie temperatury czujnika
 Serial.print("Aktualna temperatura: ");
 Serial.println(sensors.getTempCByIndex(0));  //Wyswietlenie informacji
 delay(500);
int odczytCzujnika = sensors.getTempCByIndex(0);
pozycja = map(odczytCzujnika, 0, 80, 40, 100);

if (abs(pozycja-pozycjaPoprzednia) >2) {
 myservo.write(pozycja);
 pozycjaPoprzednia = pozycja;
}
if (abs(sensors.getTempCByIndex(0) <=45)) {
 Serial.println("wygaszanie");
 myservo.write(100);
}
if (abs(sensors.getTempCByIndex(0) >=80)) {
 myservo.write(100);
 Serial.println("ALARM!!!ZA!!!WYSOKA!!!TEMPERATURA!!");
 Serial.println("ZAMKNIETY DOPŁYW POWIETRZA");
}
  if (digitalRead(przycisk1) == LOW) {  //jak przycisk wcisniety
   temperatura ++;
   Serial.println(temperatura);
   }

if (digitalRead(przycisk2) == LOW) {
 temperatura --;
Serial.println(temperatura);
}

}
Link do komentarza
Share on other sites

Gość es2

Nie widzę deklaracji portów pod które podłączono przyciski jako wejścia. W zasadzie można tego nie robić, bo po resecie porty sa wejściami. Jest jedno ale... Pokaż schemat podłączenia przycisków bo może musisz zadeklarować porty jako wejścia.

Co robi "Delay(500)" ? Jeśli procek ma być nieużywany usypiaj go.

Czemu nie używasz Watchdoga?

Link do komentarza
Share on other sites

Dzięki za odpowiedź,

o co chodzi z tym watchdogiem ?

dobra ogarnełem trochę kod, ale dalej mi nie chce działać ;/

zrobiłem taki kod gdzie przyciski idealnie działają po wgraniu na płytkę

#include "ClickButton.h" //przywołaj bibloteke clickbutton.h
unsigned long aktualnyCzas = 0; //pamięć
unsigned long zapamietanyCzas = 0;

// przycisk pin
const int buttonPin2 = 4;  // buttonpin2 jako 4 pin 
const int buttonPin1 = 2;  //buttonpin1 jako 2 pin
ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP); //wyjście z opornikiem wew. jako przycisk z masa
ClickButton button2(buttonPin2, LOW, CLICKBTN_PULLUP);

int temperatura = 0; //pamięć

void setup()
{
Serial.begin(9600);

// czas przycisniecia przycisku (wszystkie w milisekundach / ms)
// (są to wartości domyślne ustawione, można je zmienić dla wygody)
button1.debounceTime   = 20;   // Timer odbicia w ms
 button1.multiclickTime = 250;  // Limit czasu dla wielu kliknięćclicks
 button1.longClickTime  = 1000; // czas, aż zarejestrują się "kliknięcia zatrzymane"
}

 void loop()
{

 button1.Update(); // Zaktualizuj stan przycisku
 aktualnyCzas = millis(); // aktualny czas jako milis
 button2.Update();
 // jeśli (przycisk== nacisniety) temperatura ++/--
 if(button2.clicks == 1) temperatura--;
if(button1.clicks == 1) temperatura++;

//problem \|/ 

if(button2.clicks == 2) (temperatura-2); // nie dziala
if(button1.clicks == 2) (temperatura+2); //nie dziala

  //wyślij temperatura
  if ((aktualnyCzas - zapamietanyCzas >=200UL) && (button1.clicks == 1)) // jesli czas mina 1s i wcisnieto button 1 to:
{ 
 zapamietanyCzas = aktualnyCzas; // zapamietany czas to aktualny czas
 Serial.println(temperatura); // wyslij do komputera temperaturę po nacisnieciu przycisku
}
if ((aktualnyCzas - zapamietanyCzas >=200UL) && (button2.clicks == 1)) // jesli czas mina 1s i wcisnieto button 1 to:
   { 
 zapamietanyCzas = aktualnyCzas;
 Serial.println(temperatura);
}
     }

ale gdy dodam sterowanie pieca juz lipka

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Servo.h>
#include "ClickButton.h" //przywołaj bibloteke clickbutton.h
Servo myservo;
byte pozycja = 0; //pozycja serva
int pozycjaPoprzednia = 0;
int temperatura_pieca = 0;   // pamiec temperatury pieca
int temperatura_ustawiona = 0;  // pamiec temperatury ustawionej

unsigned long aktualnyCzas = 0; //pamięć przycisku
unsigned long zapamietanyCzas = 0;

const int buttonPin2 = 4;  // buttonpin2 jako 4 pin 
const int buttonPin1 = 2;  //buttonpin1 jako 2 pin
ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP); //wyjście z opornikiem wew. jako przycisk z masa
ClickButton button2(buttonPin2, LOW, CLICKBTN_PULLUP);

OneWire oneWire(A5); //Podłączenie do A5
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki


void setup() {
  myservo.attach(11);
 Serial.begin(9600);
 sensors.begin(); //Inicjalizacja czujnikow
// czas przycisniecia przycisku (wszystkie w milisekundach / ms)
// (są to wartości domyślne ustawione, można je zmienić dla wygody)
button1.debounceTime   = 20;   // Timer odbicia w ms
}


void loop() {

sensors.requestTemperatures(); //Pobranie temperatury czujnika

int temperatura_pieca = sensors.getTempCByIndex(0); //temperatura pieca jako sensor temper.
// pozycja = map(odczytCzujnika, 0, 80, 40, 100);

button1.Update(); // Zaktualizuj stan przycisku
 aktualnyCzas = millis(); // aktualny czas jako milis
 button2.Update();
 // jeśli (przycisk== nacisniety) temperatura ++/--
 if(button2.clicks == 1) temperatura_ustawiona--;
if(button1.clicks == 1) temperatura_ustawiona++;

  //  if (aktualnyCzas - zapamietanyCzas >=3000UL) {
  //   Serial.print("Aktualna temperatura: ");
//  Serial.println(sensors.getTempCByIndex(0));  //Wyswietlenie informacji
//    }

     if ((aktualnyCzas - zapamietanyCzas >=200UL) && (button1.clicks == 1)) // jesli czas mina 1s i wcisnieto button 1 to:
{ 
 zapamietanyCzas = aktualnyCzas; // zapamietany czas to aktualny czas
 Serial.println(temperatura_ustawiona); // wyslij do komputera temperaturę po nacisnieciu przycisku
}
if ((aktualnyCzas - zapamietanyCzas >=200UL) && (button2.clicks == 1)) // jesli czas mina 1s i wcisnieto button 1 to:
   { 
 zapamietanyCzas = aktualnyCzas;
 Serial.println(temperatura_ustawiona);
}      

     // jesli temperatura pieca wieksza od temperatury ustawionej wkonaj
   if ((temperatura_pieca) > (temperatura_ustawiona))
     {
     myservo.write(+1);
     }
      // jesli temperatura pieca mniejsza od temperatury ustawionej wykonaj
     if ((temperatura_pieca) < (temperatura_ustawiona))
     {
      myservo.write(-1);
     }
     //  while ((temperatura_pieca) =temperatura_ustawiona);

}


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

Gość es2

Jedyne co mogłoby blokować program

 while ((temperatura_pieca) =temperatura_ustawiona);

jest zakomentowane.

Uruchom debuger i sprawdź gdzie program wisi. Arduino nie ma debugera sprzętowego (dlatego nie używam Arduino do niczego poza zabawą), więc wstaw sobie w kluczowych miejscach

Serial.println("tu bylem itp")
Serial.print("stan zmiennej xxx=");Serial.println(xxx);

będziesz wiedział co się wykonało co nie, jaki jest stan zmiennych.

Link do komentarza
Share on other sites

Bez przesady, debugger to fajna zabawka, ale jego brak to wcale nie największa wada Arduino.

W każdym razie od razu widać co jest przyczyną problemów, wystarczy chwilę pomyśleć.

Myślenie proponuję zacząć od pewnej porady. Nigdy, absolutnie nigdy nie budujcie ważnych urządzeń sterujacych jeśli nie umiecie, nie macie uprawnień, doświadczenia, ubezpieczenia, itd. itp. Sterownie piecem to na ogół niebezpieczne zajęcie, może się skończyć pożarem, poparzeniem, albo innymi nieszczęściami.

Używanie do tego zabawek z kodem pisanym przez osoby bez podstawowych umiejętności i doświadczenia to proszenie się o kłopoty. Ciekaw jestem czy równie łatwo przyszłoby autorowi wątku programowanie np rozrusznika serca w Arduino - przecież też ma procesor, jest drogie więc jakby zastąpić jakimś małym klonem Arduino to można byłoby tyle zaoszczędzić...

A wracając do problemu - pomiar temperatury za pomocą DS18B20 długo trwa - nawet 750ms dla pełnej rozdzielczości. Więc wywołanie requestTemperatures() wprowadza znaczne opóźnienie.

Natomiast klasa obsługująca przyciski wymaga regularnego wywoływania funkcji Update() aby wykryć naciskanie przycisku.

Link do komentarza
Share on other sites

Gość es2
requestTemperatures() wprowadza znaczne opóźnienie.

Tak beznadziejnie to działa? Wystarczy np w setup wysłać do czujników komendę CONVERT. W pętli cłównej np co 1 sekundę odczytać temperaturę z czujnika/czujników i ponownie CONVERT. Wysłanie komendy CONVERT czy odczyt temperatury to czasy mniejsze od 1ms.

Sprawdzę jak robię to na ESP8266. Używam rozdzielczości 12-bit a program mi nie wisi 0,7 sekundy.

Natomiast klasa obsługująca przyciski wymaga regularnego wywoływania funkcji Update()

Kolejny kit. Dlaczego nie ma bufora?

debugger to fajna zabawka

Zabawka? Jakoś bez tej zabawki nie widzę szansy na napisanie w sensownym czasie programu używającego rozbudowanych peryferii. Dlatego właśnie nie używam Arduino do niczego poza zabawą. Banalny błąd może powodować długie jego szukanie, konieczność ciągłego wgrywania programu, wątpliwe pseudo-debugowanie po USART. Nazywanie debugera zabawką (niepotrzebnym gadżetem), świadczy o nieumiejętności posługiwania się nim. Na ARM, program ląduje w wyjątku np Half Fault i bez debugera nikt nic nie wie, jak sobie tego wyjątku nie obsłuży. Obsłużyc wszystkie? Można ale jak sygnalizować błędy? LCD? A jak błąd powstał gdy LCD nie jest jeszcze zainicjalizowany albo go nie ma? Z USART to samo. LED? Led aby działał też wymaga włączenia taktowania GPIO i ustawieniu funkcji portu. Jak zrealizować pracę krokową bez debugera aby zobaczyć, która operacja/funkcja powoduje powstanie wyjątku?

Wiem, że się da bez debugera ale ile to będzie trwało? Z debugeram godzinę bez (urządzenie ma jedną LED) kilka dni.

Debuger w AVR niepotrzebny bo uC ma proste układy peryferyjne? Potrzebny, bo kompilator ma pewne ograniczenia, o których można zapomnieć. Sam naciąłem się na problem przesuwwania w lewo o 16 bitów i więcej.

Teoretycznie, kod z IDE Arduino można debugować, przynajmniej w przypadku AVR. AS7 ma opcje importu projektów Arduino.

Link do komentarza
Share on other sites

ak beznadziejnie to działa?

Najlepiej sprawdzić w źródłach biblioteki, to nie boli.

Dlaczego nie ma bufora?

Bo update odczytuje dane, więc jeśli nie robi tego co <20 ms to działá niepoprawnie. Bufory nic do tego nie mają.

Zabawka? Jakoś bez tej zabawki nie widzę szansy na napisanie w sensownym czasie programu używającego rozbudowanych peryferii

Nie przejmuj się, może kiedyś się nauczysz.

wątpliwe pseudo-debugowanie po USART.

Czyli rozumiem, że mechanizmy debugowania jądra linuksa to takie pseudo-debugowanie. es2 powinieneś to Linusowi zgłosić, biedak się nie zna a Ty wiesz najlepiej.

Nazywanie debugera zabawką (niepotrzebnym gadżetem), świadczy o nieumiejętności posługiwania się nim

Nawet nie chce mi się tego komentować.

Na ARM, program ląduje w wyjątku np Half Fault i bez debugera nikt nic nie wie, jak sobie tego wyjątku nie obsłuży. Obsłużyc wszystkie?

Tak należy obsługiwać wszystkie wyjątki. Kompilator i tak tworzy dla nich domyślne procedury obsługi, wystarczy dostarczyć własną. lepszą - która np. wyświetli blue-screen.

A przy okazji - Cortex-M faktycznie używa wyjątków Hard Failt, ale już Cortex-A nie, więc nie pisz że ARM-y tak robią, bo to nie do końca prawda.

Link do komentarza
Share on other sites

Gość es2
Nie przejmuj się, może kiedyś się nauczysz.

Po co? Po co mam uczyć się zabawki, która ma ogrom błędów, niedociągnięć ograniczeń?

[ Dodano: 18-05-2018, 09:31 ]

A przy okazji - Cortex-M faktycznie używa wyjątków Hard Failt

Nie napisałem, że wszystkie tylko na przykład.

Link do komentarza
Share on other sites

Po co? Po co mam uczyć się zabawki, która ma ogrom błędów, niedociągnięć ograniczeń?

Podam Ci kilka przykładów. Po pierwsze kod przygotowany dla debugowania jest inny niż skompilowany w wersji docelowej. Czasem błędy wtedy znikają lub się pojawiają - np. jeśli są związane z czasami wykonywania fragmentów kodu.

Druga sprawa to objętość kodu. Może się okazać, że programu nie da się skompilować w wersji do debugowania, po prostu wtedy nie mieści się do pamięci.

Kolejna sprawa to testowanie. Fajnie jest używać debuggera pisząc program, ale co zrobić jeśli błąd występuje później - w działającym urządzeniu. Nie zawsze można podłączyć wtedy JTAG-a czy inny interfejs. A zrzut logów przez UART potrafi bardzo pomóc w odkryciu przyczyny błędów.

A jak jesteśmy przy ARM-ach, to są w architekturze elementy, kiedy debugger jest bezsilny i jeszcze dużo przeszkadza.

Więc żeby nie było - debugger to bardzo fajne narzędzie, czasem przydatne, ale nie zawsze. To że AVR go nie obsługuje to wcale nie największa wada tych rdzeni.

A co do zabawek - ja tak zawsze mówię na urządzenia, którę lubię...

Link do komentarza
Share on other sites

Gość es2
Czasem błędy wtedy znikają lub się pojawiają - np. jeśli są związane z czasami wykonywania fragmentów kodu.

Narzędzi trzeba używać z głową, wiedzieć jak działają itp.

Druga sprawa to objętość kodu.

Dlatego zawsze daję uC na wyrost. W finalnym rozwiązaniu można dać mniejszy.

A zrzut logów przez UART potrafi bardzo pomóc w odkryciu przyczyny błędów.

Poza debugerem używam takze logów, najczęściej przez USB, jak nie ma to USART. To jednak zajmuje pamięć, więc stwierdzenie

Może się okazać, że programu nie da się skompilować w wersji do debugowania, po prostu wtedy nie mieści się do pamięci.

jest nietrafione.

debugger to bardzo fajne narzędzie, czasem przydatne, ale nie zawsze. To że AVR go nie obsługuje

Większość obsługuje, tylko archaiczne AtTiny13, Mega8 czy większość AT90Sxxxx nie ma debugera. Najpopularniejszy Mega328 w ArduinoUNO ma debuger tyle, ze ArduinoIDE nie obsługuje go. Dlaczego? Czasy debugowania tylko diodą świecącą, jak to robi Kardaś bezpowrotnie minęły. W swoich konstrukcjach mam dużo LED, bardzo pomocne przy debugowaniu, mam interfejs SWD, JTAG, ostatecznie DebugWire. Mam zewnętrzne porty np Usart czy SPI lub I2C do którego podłączam wyświetlacz. Bardzo rzadko używam tylko debugera (ostatnio w dekoderze DCC), przeważnie trzeba debuger wspomagać, natomiast pracy bez debugera sobie nie wyobrażam, dlatego nie lubię ESP do którego używam Arduino, bo LUA nie chce mi się uczyć.

Link do komentarza
Share on other sites

Ja tak z ciekawości... dlaczego chcesz koniecznie pisać w Lua (btw. pisownia), jeśli natywnym językiem dla ESP jest C, a port Arduino też działa całkiem zacnie...

Link do komentarza
Share on other sites

Gość es2
requestTemperatures() wprowadza znaczne opóźnienie.

Faktycznie wprowadza, przy 12-bit jest to 750ms (żenada). Na AVR napisałem swoją bibliotekę, która:

- używa usart do obsługi 1-Wire

- odczytuje temperature z czujników następnie wysyłam CONVERT

- po sekundzie wykonuje ponownie powyższe.

W AVR robię to wszystko na przerwaniach, więc program główny działa bez opóźnień. Dotyczy to jednego projektu, w pozostałych w pętli głównej, więc reset 1-Wire blokuje pętlę główna na 700us (niektóre 1-Wire wymagają resetu min 680us).

Na ESP jeszcze nie zaimplementowałem powyższych rozwiązań i program jest blokowany na 750ms. Nie wiem czy kiedykolwiek to zrobię, bo raczej rezygnuję z ESP jako uC, ESP będzie tylko modułem Wi-Fi z komunikacja po SPI.

[ Dodano: 18-05-2018, 13:58 ]

Ja tak z ciekawości... dlaczego chcesz koniecznie pisać w Lua (btw. pisownia), jeśli natywnym językiem dla ESP jest C

ESP8266 jest dla mnie za słabe aby było samodzielnym uC (1 usart, 1 i2c, 1 spi, 1 wejście adc). Może zmienię zdanie jak poćwiczę ESP32 ale ich wyposażenie też mnie nie zachwyca. Nie wiem czy jest możliwość debugowania, jak nie to nie bedę z tym walczył. Na ESP jest system operacyjny 9RTOS zdaje się). Mogę polegnąć na banalnej rzeczy jak transmisja 9-bit po SPI (problem znam z Debiana i komputerów przemysłowych).

[ Dodano: 18-05-2018, 14:01 ]

port Arduino też działa całkiem zacnie...

Otóż nie. Mam już dość szukania pasującej biblioteki dla np wyświetlacza, mam dość ich poprawiania.

Najczęściej biblioteki do Arduino sa kiepskie. Nie używają przerwań czy DMA. Program główny "wisi" podczas powolnej transmisji do np LCD. 1-Wire dla Arduino na AVR (na ARM zdaje się też) zawiesza przerwania. Jak pamiętam to reset 1-Wire też, czyli na min 460us zawieszony jest uC całkowicie.

Arduino to zabawka. Jak zacznie się ją ulepszać, to z bibliotek Arduino zostanie 5 czy 10% a zostanę z systemem bez sprzętowego debugowania. Wydaje mi się, że to strata czasu. Przyznaję natomiast, że portuję biblioteki z Arduino do swoich projektów po, najczęściej gruntownych zmianach.

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.