Arduino jako sterownik palnika?

Masz problem z Arduino? Tutaj możesz szukać pomocy.
ODPOWIEDZ
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Arduino jako sterownik palnika?

Post autor: sztapl » 1 lut 2015, 22:24

Mam pytanie. Czy da się tak zaprogramować arduino żeby pełnił funkcję sterownika do palnika oleju opałowego. Sterownik to Siemens LOA 24, Mój sterownik już szwankuje a wydaje mi się że arduino to fajna sprawa. Nie wszystkie funkcje sterownika są potrzebne a nowe by się przydały. Poza tym Arduino jest o połowę tańsze niż sterownik. Ja sam na pewno nie dam rady tego zaprogramować bo nie jestem programistą. Ma ktoś ochotę przyjrzeć się tematowi?

Wsumie to mogę podać sekwencję co ma następować po czym więc programista nie musi nawet wiedzieć jak działa oryginalny sterownik.

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


razorxx100
Starszy majsterkowicz
Posty: 329
Rejestracja: 1 sie 2014, 22:57

Re: Arduino jako sterownik palnika?

Post autor: razorxx100 » 2 lut 2015, 00:23

Zalezy jak wyglada sterowanie takim palnikiem:)
Z tego co widze to sterownik chodzi po okolo 180 zl, adruino mozna nabyc bez problemu za 10 zl + zapewne jakies smieciowe sprawy potrzebne do sterowanie czyli laczny koszt moze zamknac sie przy 20 zl.
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Arduino jako sterownik palnika?

Post autor: sztapl » 2 lut 2015, 01:32

Więc widać że się opłaca. Sterowanie jest proste. najpierw rozgrzewa się olej w zbiorniku potem sterownik włącza wentylator po około 2 sekundach iskrownik i elektrozawór następnie po około 4 sekundach fotokomórka wykrywa czy jest zapłon i jeżeli jest to odłącza iskrownik jeżeli nie ma zapłonu to odłącza wszystko i przechodzi w stan czuwania zapala się lampka na przycisku sterownika. po nacisnięciu przycisku zaczyna od początku. Fotokomurka monitoruje nonstop czy jest zapłon jeżeli w trakcie pracy nastąpi zgaszenie płomienia to przechodzi w stan czuwania. Więc można po krótce opisać tak od stanu wyjściowego czyli czuwania:

1 Zagrzanie oleju.
2 Start wentylatora
po 2 s.
3 Iskrownik i elektrozawór
4 s.
4 Włącza się odczyt fotodiody
Zapłon Brak zapłonu
5 Wyłącza się iskrownik 5 wyłącza wszystko

Po prawdzie to zagrzanie oleju jest troszkę bardziej zagmatwane ale dla sterownika nie ważne. Grzanie oleju (teraz) mam tak zrobione że w zbiorniku jest pływak. W zbiorniczu wiadomo olej jest zabierany do palnika i pływak włącza pompę i dopompowuje olej. przy włączeniu palnika jeżeli jest zamało oleju pompa dopompuje. Jeżeli z jakiegoś powodu nie może dopompować to grzałka się nie włączy. Pompa ma wyłącznik czasowy ustawiony na 20 sekund jeżeli nie dopompuje w tym czasie to się wyłączy. Pompa ma zainstalowane zabezpieczenie czasowe żeby w razie awarii pływaka nie załało całej kotłowni. Więc jeżeli chodzi o punkt 1 po zagrzaniu oleju jest wysyłany sygnał gotowości z termostatu. Wiadomo że sygnał gotowości będzie się włączał i wyłączał podczas pracy palnika ale w oryginalnym palniku raz podany sygnał gotowości włącza podaną sekwencje i pużniej podczas pracy nie ma znaczenia czy jest sygnał czy nie, ważne żeby go dostał raz na początku.


Mr Leweręce ten sterownik jest od palnika korting i pasuje do wielu innych i jest kompatybilny z sterownikami danfoss.
A palnik który ma obsługiwać to palnik mojej konstrukcji. jest to palnik który spala każdy rodzaj oleju. Ja używam do palenia zużytego oleju śilnikowego. Więc tak naprawdę to nie ma znaczenia że siemens a pozatym to nie jest to sterownik skonstruowany przez siemens tylko landys and gyr czy jakoś tak ale tej firmy już nie ma


Drodzy koledzy pomoże mi ktoś. Ja sam na pewno nie dam rady.
PS
Punkt 1 można określić jako Sygnał gotowości.

Pomoc która jest mi potrzebna to napisanie skryptu. Z resztą sobie poradzę.
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Arduino jako sterownik palnika?

Post autor: sztapl » 7 mar 2015, 14:49

Dostałem jakiś szkic do palnika ale nie pasował do moich potrzeb więc go przerobiłem na swoje potrzeby ale mam problem z kompilowaniem oto szkic:

int foto;
int termostat; // czujnik na piecu
int i; // pruby bez zaplonu
int oil; // temperatura oleju
int plywak; // plywak w zbiorniku oleju

#include <OneWire.h>
#include <ds18b20.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const byte ONEWIRE_PIN = 10;
byte sensorAddress[8] = {0x28, 0xFF, 0x73, 0x56, 0x11, 0x14, 0x0, 0x8C };
OneWire onewire(ONEWIRE_PIN);
ds18b20 sensor(&onewire);
float tempoil = sensor.readTemperature(sensorAddress);


void setup() {


sensor.begin();

i=0;
oil=75; // wstaw odpowiednia temp oleju ( 70 st C)
lcd.init();
lcd.backlight();


pinMode(4,INPUT_PULLUP); //termostat
pinMode(A0,INPUT); //foto
pinMode(5, INPUT_PULLUP); //plywak
pinMode(6,OUTPUT); //iskra
pinMode(7,OUTPUT); //wentylator
pinMode(8,OUTPUT); //grzalka
pinMode(9,OUTPUT); //elektrozawor
pinMode(10,OUTPUT); //pompa

digitalWrite(6,HIGH); //iskra
digitalWrite(7,HIGH); //wentylator
digitalWrite(8,HIGH); //grzalka
digitalWrite(9,HIGH); //elektrozawor
digitalWrite(10,HIGH); //pompa




}

void loop(){


sensor.request(sensorAddress);
while(!sensor.available());
float tempoil = sensor.readTemperature(sensorAddress);
termostat = digitalRead(4);
foto = analogRead(0);
plywak = digitalRead(5);





if (tempoil < oil && termostat == LOW && i<3 && plywak == HIGH) // jezeli olej zimny i nie dopompowany
{
dopompuj();
}

if (tempoil < oil && termostat == LOW && i<3 && plywak == LOW) //jezel olej zimny i dopompowany
{
podgrzej();
}

if (termostat == LOW && i<3 && tempoil >= oil - 10 && plywak == LOW) // jezeli olej zagrzany i dopompowany
{
on(); // wykonaj sekwencje on

check(); //wykonaj sekwencje check




}


if (termostat == HIGH)
{

lcd.clear();
delay(500);
lcd.print(" TERMOSTAT OFF");
delay(500);
lcd.clear();
lcd.print(" TERMOSTAT OFF");
delay(500);
pauza();

}




if(i==3)
{

awaria();
}





}




void on () { // Procedura zaplonu
if (digitalRead(4)==LOW && foto<600) //termostat zalaczony, brak plomienia
{

lcd.clear();
lcd.setCursor(3,0);
lcd.print("PROCEDURA ");
lcd.setCursor(4,1);
lcd.print ("ZAPLONU ");
digitalWrite(6,HIGH); // wylczam iskre
digitalWrite(7,HIGH); // wylczam wentylator
digitalWrite(8,HIGH); //wylczam grzalke
digitalWrite(9,HIGH); // wylczam elektrozawor

digitalWrite(8,LOW); // grzalka pracuje
digitalWrite(7,LOW); // wlczam wentylator
delay(3000); // czekaj 3 s
digitalWrite(6,LOW); // podaje iskre
delay(500); // czekam 0,5 sekundy
digitalWrite(9,LOW); // wlczam elektrozawor, nastepuje zaplon

delay(7000); //czekam 7 sekund do odczytu fotokomorki
lcd.clear();

}

}


void check()
{

foto = analogRead(0); // odczyt fotokomorki

if (termostat == LOW && i<3 && foto>600 ) // termostat zalaczony, jest plomien
{

i=0;
praca ();
} else {

lcd.clear();
lcd.print("PONAWIAM ZAPLON");
delay(500);
i++;

}


}


void praca() {


digitalWrite(6,HIGH); // wyalczam iskre
digitalWrite(9,LOW); // wlaczam elektrozawor
digitalWrite(7,LOW); // wlaczam wentylator
digitalWrite(8,LOW); // grzalka pracuje

if ( tempoil <= oil ); // kontrola temperatury oleju w zbiorniku
digitalWrite(8,LOW); //wlaczam grzalke

if (digitalRead(5),HIGH); // brak oleju
digitalWrite(10,LOW); //dopompowuje olej

lcd.setCursor(0,0);
lcd.print (" Palnik pracuje ");
lcd.setCursor(3,1);
lcd.print("prawidlowo ");


}


void pauza ()
{

digitalWrite(6,HIGH); // wylaczam iskre
digitalWrite(9,HIGH); // wylaczam elektrozawor
digitalWrite(7,HIGH); // wylaczam wentylator
digitalWrite(8,HIGH); // wylaczam grzalke


}
void awaria ()
{

digitalWrite(6,HIGH); // wylaczam iskre
digitalWrite(9,HIGH); // wylaczam elektrozawor
digitalWrite(7,HIGH); // wylaczam powietrze
digitalWrite(8,HIGH); // wylaczam grzalke
lcd.clear();
delay(1000);
lcd.print (" AWARIA PALNIKA");
delay (1000);
lcd.clear();
lcd.print (" AWARIA PALNIKA");
delay (1000);


}

void podgrzej ()
{

digitalWrite(8,LOW); // wlaczam grzalke



lcd.clear();
delay(1000);
lcd.print (" PODGRZEWAM OLEJ");
delay (1000);
lcd.clear();
lcd.print (" PODGRZEWAM OLEJ");
delay (1000);


}


void dopompuj ()
{
if (digitalRead(5)==HIGH); // brak oleju
digitalWrite(10,LOW); //dopompowuje
lcd.clear();
delay(1000);
lcd.print (" POMPUJE OLEJ");
delay (1000);
lcd.clear();
lcd.print (" POMPUJE OLEJ");
delay (1000);

}



Przy próbie kompilacji takie coś:


pruba.ino:15:1: error: 'ds18b20' does not name a type
pruba.ino:16:17: error: 'sensor' was not declared in this scope
pruba.ino: In function 'void setup()':
pruba.ino:22:1: error: 'sensor' was not declared in this scope
pruba.ino: In function 'void loop()':
pruba.ino:53:2: error: 'sensor' was not declared in this scope
Błąd kompilacji.

Nie mogę sobie poradzić. Myślę że biblioteki mam zainstalowane poprawnie ale nic nie mogę wykminić
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Arduino jako sterownik palnika?

Post autor: sztapl » 8 mar 2015, 11:38

Szanowni koledzy, pochyli się ktoś nad moim problemem i wskaże mi gdzie popełniłem błąd? Zapewne moja roztargniona szelmowska dusza spaskudziła jakiś mało istotny detal.
Awatar użytkownika
bojfik
Młodszy majsterkowicz
Posty: 6
Rejestracja: 10 mar 2015, 20:13

Re: Arduino jako sterownik palnika?

Post autor: bojfik » 10 mar 2015, 20:55

sztapl pisze:Szanowni koledzy, pochyli się ktoś nad moim problemem i wskaże mi gdzie popełniłem błąd? Zapewne moja roztargniona szelmowska dusza spaskudziła jakiś mało istotny detal.
Zadeklaruj DUŻYMI literami tak jak tu: OneWire onewire(2); i tak samo tu DS18B20 sensor(&onewire);
Arduino rozróżnia duże i małe litery, jest to bardzo istotne dale już nie szukałem ale tak jak sam napisałeś - chodzi o detale :)
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Arduino jako sterownik palnika?

Post autor: sztapl » 29 mar 2015, 12:12

Całe to moje programowanie bez Arduino to o kant d... Arduino przyszło podpiąłem przekaźniki czujniki itp i wtedy się okazało że nic nie działa jak należy więc napisałem wszystko od początku. i teraz mam co chciałem. Jest to mój pierwszy projekt w życiu więc chyba nieźle. O Arduino to się dowiedziałem jakieś 2 miesiące temu.
int foto;
int tempoil;
int i;
int oil;

 #include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2) ;

#include <OneWire.h>
#include <DS18B20.h>
const byte ONEWIRE_PIN = 2;
byte sensorAddress[8] = {0x28, 0xFF, 0x82, 0x5, 0x69, 0x14, 0x4, 0x1C};
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

void setup() {
 
    while(!Serial);
Serial.begin(9600);
 
  lcd.init(); // initialize the lcd
  lcd.backlight();
  


oil=30;
i=0;
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT); //pływak
  pinMode(A0,INPUT); //foto
  pinMode(5,OUTPUT);//pompa
  pinMode(6,OUTPUT); //iskra
  pinMode(7,OUTPUT); //wentylator
  pinMode(8,OUTPUT); //grzalka
  pinMode(9,OUTPUT); //elektrozawor
  pinMode(10,OUTPUT);//awaria
  
 
  digitalWrite(5,LOW);//pompa
  digitalWrite(6,LOW); //iskra
  digitalWrite(7,LOW); //wentylator
  digitalWrite(8,LOW); //grzalka
  digitalWrite(9,LOW); //elektrozawor
  digitalWrite(10,LOW);//awaria

  sensors.begin();
  
}

void loop(){
   
    sensors.request(sensorAddress);

  while(!sensors.available());
  float tempoil = sensors.readTemperature(sensorAddress);
  Serial.print(tempoil);
  Serial.println(F(" 'C"));
 
  foto = analogRead(0);


  if ( i<3 && foto<600 && tempoil > oil) //brak płomienia , 3 pruby , olej zagzany
  {
    on();   // wykonaj sekwencje zapłonu
  
    check(); //wykonaj sekwencje check
    
}      
   
   if ( i<3 && foto<600 && tempoil<oil) //brak plomienia olej zimny
   {
   podgrzej();
   }

   if (foto>600 && tempoil<oil) // jest plomien olej zimny
  {
       digitalWrite(8,HIGH); // grzalka pracuje
       
  }
  else {
        digitalWrite(8,LOW); // grzalka nie pracuje

  }
   if(i==3) // 3 pruby i brak zapłonu
  {
   if (digitalRead(3)==LOW) {
  i=0;
}
   awaria();
  }
 
  if (digitalRead(4)==HIGH && foto>600 && i<3){ //kontrola oleju , jest plomien
    digitalWrite(5,HIGH); //pompuje
    Serial.println("POMPUJE");
  lcd.clear();
  lcd.print ("POMPUJE OLEJ");
  delay(500);
  }
else {
  digitalWrite(5,LOW);
  
}

  if (digitalRead(4)==LOW && foto>600 && i<3){
                                                   // pompa wyłączona jest płomień
    Serial.println("PALNIK PRACUJE PRAWIDLOWO");
         lcd.setCursor(0,0);
  lcd.print (" Palnik pracuje ");
  lcd.setCursor(3,1);
  lcd.print("prawidlowo ");
  delay(500);
  }


}



  
void on () { // Procedura zaplonu , najpierw dopompuje a potem zapłon
  {
     while (digitalRead(4)==HIGH) {
    dopompuj () ;
  }
   Serial.println("PROCEDURA ZAPLONU");
   
       lcd.clear();
    lcd.setCursor(3,0);
    lcd.print("PROCEDURA ");
    lcd.setCursor(4,1);
    lcd.print ("ZAPLONU ");
    
    digitalWrite(5,LOW); //wylaczam pompe
    digitalWrite(6,LOW); // wylczam iskre
    digitalWrite(7,LOW); // wylczam wentylator
    digitalWrite(8,LOW); //wylczam grzalke
    digitalWrite(9,LOW); // wylczam elektrozawor
    
    digitalWrite(7,HIGH); // wlczam wentylator
    delay(3000); // czekaj 3 s
    digitalWrite(6,HIGH); // podaje iskre
    delay(1000); // czekam 0,5 sekundy
    digitalWrite(9,HIGH); // wlczam elektrozawor, nastepuje zaplon
    delay (3000);

        
  }
  
  }


void check()
{
 
  foto = analogRead(0); // odczyt fotokomorki
       

    if (i<3 && foto>600 ) // , jest plomien przechodzi do pracy
    {
  
   i=0;
    praca ();
    }
    
    else
    {
  
    i++;
      
    }
    
           
  } 
  
  
void praca() {

   digitalWrite(5,LOW);//wylaczam pompe
   digitalWrite(6,LOW); // wylczam iskre
   digitalWrite(9,HIGH); // wlczam elektrozawor
   digitalWrite(7,HIGH); // wlczam wentylator
   digitalWrite(10,LOW); //zeruje awarie
   Serial.println("PALNIK PRACUJE PRAWIDLOWO");
     lcd.setCursor(0,0);
  lcd.print (" Palnik pracuje ");
  lcd.setCursor(3,1);
  lcd.print("prawidlowo ");
    }
   
void awaria ()
{
   digitalWrite(5,LOW); //wylaczam pompe
   digitalWrite(6,LOW); // wylaczam iskre
   digitalWrite(9,LOW); // wylaczam elektrozawor
   digitalWrite(7,LOW); // wylaczam powietrze
   digitalWrite(8,LOW); // wylaczam grzalke
   digitalWrite(10,HIGH);//awaria
Serial.println("AWARIA!!!");

  lcd.clear();
  lcd.print (" AWARIA PALNIKA");
  delay (500);
    
  
}
void dopompuj () // dopompowuje - procedura przed zapłonem, pompuje - w czasie pracy
{
    
    digitalWrite(6,LOW); // wylczam iskre
    digitalWrite(7,LOW); // wylczam wentylator
    digitalWrite(8,LOW); //wylczam grzalke
    digitalWrite(9,LOW); // wylczam elektrozawor
    digitalWrite(5,HIGH); //dopompowuje
  Serial.println("DOPOMPOWYWANIE");

  lcd.clear();
  lcd.print (" DOPOMPOWYWANIE");
       delay (500);

    
   }
void podgrzej()
{
       while (digitalRead(4)==HIGH) {
    dopompuj () ;
       }
       
       while (digitalRead(4)==LOW && tempoil<oil)
       {
           digitalWrite(8,HIGH); //zalaczam grzalke
           digitalWrite(5,LOW); //wyłączam grzałke
  Serial.println("GRZANIE");
    lcd.clear();
  lcd.print (" PODGRZEWAM OLEJ");
  delay(500);
       }
       
}
sztapl
Majsterkowicz
Posty: 117
Rejestracja: 21 gru 2014, 16:01
Lokalizacja: Limerick

Re: Arduino jako sterownik palnika?

Post autor: sztapl » 2 kwie 2015, 23:04

Jak to w życiu bywa obszerne testy pokazały że układ nie działa tak jak chciałem. W niektórych momentach układ się zapętlał tak że trzeba było resetować arduino, Już mam poprawione i przetestowane wszystkie możliwe sytuacje. W końcu wszystko działa jak należy . Teraz tylko włożyć do palnika i sprawdzić w praktyce.
GaaD
Młodszy majsterkowicz
Posty: 1
Rejestracja: 1 mar 2018, 22:03

Re: Arduino jako sterownik palnika?

Post autor: GaaD » 1 mar 2018, 23:03

Witam
Trochę dostosowuję ten kod do własnych potrzeb.
Dyskusja toczy się też na elektrodzie.
Czym zastąpić delay aby w tym fragmencie:

Kod: Zaznacz cały

    digitalWrite(7,HIGH); // wlczam wentylator
    delay(3000); // czekaj 3 s 
    
czas był odliczany na LCD?
czytam tutoriala o Timers ale te wątki są ponad moje siły.

Dodatkowo chciałbym dodać licznik czasu pracy aby stan

Kod: Zaznacz cały

void praca() {

   digitalWrite(5,LOW);//wylaczam pompe
   digitalWrite(6,LOW); // wylczam iskre
   digitalWrite(9,HIGH); // wlczam elektrozawor
   digitalWrite(7,HIGH); // wlczam wentylator
   digitalWrite(10,LOW); //zeruje awarie
   Serial.println("PALNIK PRACUJE PRAWIDLOWO");
     lcd.setCursor(0,0);
  lcd.print (" Palnik pracuje ");
  lcd.setCursor(3,1);
  lcd.print("prawidlowo ");
    }
był zliczany i wyświetlany w godzinach, nie wiem tylko czy podgrzewanie lub dopompowywanie oleju nie przewie liczenia czasu pracy.

Pozdrawiam
Wojtek
Awatar użytkownika
Slawek
Starszy majsterkowicz
Posty: 448
Rejestracja: 29 mar 2015, 15:05

Re: Arduino jako sterownik palnika?

Post autor: Slawek » 2 mar 2018, 07:35

Użyj millis(), podpowiem co szukać w Google : delay without delay ;)

Pozdr
ODPOWIEDZ

Strony partnerskie: