Ensten bygger styrning till pelletsbrännare
-
- Inlägg: 219
- Blev medlem: 2 februari 2013, 17:50:41
- Ort: BORÅS
Re: Ensten bygger styrning till pelletsbrännare
johano har du så korta start-stoppcykler att det inte hinner glöda färdigt innan nästa start ?
Re: Ensten bygger styrning till pelletsbrännare
ensten: Janfire har genom alla år med flamvakter använd temperatur som kriterier. På en Flex-A(2) används en bimetalltermostat och på en NH används en termokopplare typ K.
Bimetalltermostaten blir gammal med tiden och ska bytas kanske var 5-7 år, typ K givaren verkar inte slitas på samma sätt men behöver en del mer elektronik för att fungera.
Bimetalltermostaten blir gammal med tiden och ska bytas kanske var 5-7 år, typ K givaren verkar inte slitas på samma sätt men behöver en del mer elektronik för att fungera.
Re: Ensten bygger styrning till pelletsbrännare
Nej, risken är om det blir ett kort strömavbrott under uppstarten, då kommer brännaren starta om och glatt skicka på en ny startdos på den som redan ligger där och glöder....Bittämjaren skrev:johano har du så korta start-stoppcykler att det inte hinner glöda färdigt innan nästa start ?
/johan
Re: Ensten bygger styrning till pelletsbrännare
Just det som johano beskriver kan man till viss del undvika med en temperaturavkänning som flamvakt. Helt kan man inte undvika det, det finns tillfällen där det inte går att undvika - men är man lite klurig kan man ju registrera i EEPROM att en startdos pytsas i, sedan kan man registrera att flamvakten går till "varmt så det räcker" och då nolla flaggan om startdosen.
Om det blir en omstart pga. strömfel kan man avgöra att "det borde teoretisk finnas en startdos", alltså ska en start/fortsättning om det är varmt nog inte utlösa en startdos förrän en komplett start är genomförd utan lyckad resultat.
Med temperaturavkänning kan man även avgöra om det är ett kort avbrott och att eldningsdelen är så pass varm att brännaren bara kan köra vidare via en uppvärmningsfas eller om det ska till en riktig kallstart.
Om det blir en omstart pga. strömfel kan man avgöra att "det borde teoretisk finnas en startdos", alltså ska en start/fortsättning om det är varmt nog inte utlösa en startdos förrän en komplett start är genomförd utan lyckad resultat.
Med temperaturavkänning kan man även avgöra om det är ett kort avbrott och att eldningsdelen är så pass varm att brännaren bara kan köra vidare via en uppvärmningsfas eller om det ska till en riktig kallstart.
Re: Ensten bygger styrning till pelletsbrännare
Exakt så, jag ville bara lyfta problemet så ensten tar med den situationen i sin brännarstyrning.
Min stenkorkade brännare gör det inte så jag har kopplat matningen genom ett hållrelä så om strömmen går så måste man manuellt slå på brännaren igen - den startar inte av sig själv.
Jag har också lyckats orsaka några smällar i pannan, det har då varit vid misslyckad start och jag av lathet bara startat om brännaren, då skedde exakt det ovanstående och en j-vla smäll som följd...
/johan
Min stenkorkade brännare gör det inte så jag har kopplat matningen genom ett hållrelä så om strömmen går så måste man manuellt slå på brännaren igen - den startar inte av sig själv.
Jag har också lyckats orsaka några smällar i pannan, det har då varit vid misslyckad start och jag av lathet bara startat om brännaren, då skedde exakt det ovanstående och en j-vla smäll som följd...
/johan
Re: Ensten bygger styrning till pelletsbrännare
Där har jag ju det lättare: brännaren rensar brännkoppen inför varje start och omstart, alltså kan det aldrig bli dubbel startdos.
Men likaväl kan man nog hitta ett sätt som medger en bra säkerhet mot dubbla startdoser. Självklart kommer det att innebära att det någon gång blir en "tom" start men det ger ingen smällar - och då kan man testa en omstart.
Men likaväl kan man nog hitta ett sätt som medger en bra säkerhet mot dubbla startdoser. Självklart kommer det att innebära att det någon gång blir en "tom" start men det ger ingen smällar - och då kan man testa en omstart.
Re: Ensten bygger styrning till pelletsbrännare
Nu är jag i behov av support.
Jag tänkte att vi börjar med allmänna frågeställningar.
Mitt program (i arduinon) äter minne.
Finns det någon best practice för att "lämna tillbaka" minne? Rutinen som äter minne kör några if satser och while-loopar.
Det verkar gå åt 2 byte varje gång loopen går. Hur vet jag detta? Jag har laddat ner ett library som hämtar info om tillgängligt minne i SRAM.
Som sagt, jag har andra loopar som inte påverkar minnet någonting, frågan är om det finns något generalfel i mina tankebanor.
Jag tänkte att vi börjar med allmänna frågeställningar.
Mitt program (i arduinon) äter minne.
Finns det någon best practice för att "lämna tillbaka" minne? Rutinen som äter minne kör några if satser och while-loopar.
Det verkar gå åt 2 byte varje gång loopen går. Hur vet jag detta? Jag har laddat ner ett library som hämtar info om tillgängligt minne i SRAM.
Som sagt, jag har andra loopar som inte påverkar minnet någonting, frågan är om det finns något generalfel i mina tankebanor.
Re: Ensten bygger styrning till pelletsbrännare
Tja, svårt att säga utan att se koden?
En if-sats eller while-loop käkar ju inget minne i sig själv, så då är det antingen något som allokeras av dig eller i någon biblioteksfunktion du använder.
/johan
En if-sats eller while-loop käkar ju inget minne i sig själv, så då är det antingen något som allokeras av dig eller i någon biblioteksfunktion du använder.
/johan
Re: Ensten bygger styrning till pelletsbrännare
Du använder inte String-objekt?
De har i alla fall förut varit ganska hårt drabbade av minnesläckor i Arduino-miljön...
De har i alla fall förut varit ganska hårt drabbade av minnesläckor i Arduino-miljön...
Re: Ensten bygger styrning till pelletsbrännare
Finns det möjlighet att (grovt) väga startkoppen? mäta gengas direkt? eller använda temperatursensor för att veta om det redan glöder?
- tecno
- Inlägg: 27248
- Blev medlem: 6 september 2004, 17:34:45
- Skype: tecnobs
- Ort: Sparreholm, Södermanland N 59° 4.134', E 16° 49.743'
- Kontakt:
Re: Ensten bygger styrning till pelletsbrännare
eller använda temperatursensor för att veta om det redan glöder?
Läser inte du vad som skrivits i tråden?
Re: Ensten bygger styrning till pelletsbrännare
Jag har löst minnesproblemet. EXAKT vad som var fel vet jag inte. Men det jag gjorde var att jag öppnade filen i en annan editor på min lokala dator (har kört över Teamviewer tidigare, vilket gjort det lite knöligt med översikten) och gått igenom koden ordentligt och städat upp. Felet verkar ha berott på att jag populerade variabler som inte användes samt att någon variabel sattes två gånger.
Jag har också lärt mig att textsträngar lika bra kan läggas i programminnet (istället för SRAM) genom att all text sätt inom F() så här:
vilket frigjorde några hundra byte ytterligare. Nu börjar koden se respektabel ut i alla fall.
Jag har också lärt mig att textsträngar lika bra kan läggas i programminnet (istället för SRAM) genom att all text sätt inom F() så här:
Kod: Markera allt
lcd.print(F("Min fina text här));
Re: Ensten bygger styrning till pelletsbrännare
Nu lägger jag upp något som kan liknas vid en ringa begynnelse av koden.
Det som återstår är
Att koda in interrupt för fallschaktsensorn
Ytterligare larmlägen
Ytterligare säkerhetskod
Vettiga outputs på LCD
Påbörja kommunikation med mina RF trancievers och bygge av en remote-enhet för information och övervakning.
Och här kommer koden, version 0.12
Det som återstår är
Att koda in interrupt för fallschaktsensorn
Ytterligare larmlägen
Ytterligare säkerhetskod
Vettiga outputs på LCD
Påbörja kommunikation med mina RF trancievers och bygge av en remote-enhet för information och övervakning.
Och här kommer koden, version 0.12
Kod: Markera allt
#include <MemoryFree.h>
#include <Time.h> // For the clock
#include <DS1307RTC.h> // For the RTC
#include <Wire.h> // For serial communication
#include <LiquidCrystal_I2C.h> // For running thel i2c LCD
// Declare variables
// Set pin numbers
byte skruvPin = 12; //Set pin for feeder
byte heaterPin = 10; //Set pin for heater
byte callingForHeat = 7; //Set pin for listening on boiler calling for heat
int flameInput = A0; //Analog pin for flame
// Set other variables
int flameVisible;
int calling;
boolean FOn;
int k;
time_t t = now();
long timePlusFiveSec = 5;
long timePlusOneSec = 1;
long timePlusThirtySec = 30;
long timePlusTenSec = 10;
long timePlusTwentySec = 20;
long timePlusThreehundredSec = 300;
long timePlusThirteenSec = 13;
long timePlusNineSec = 9;
int filledPellets = 0;
int flameThreshold = 500;
int choosenEffect = 2;
int counter = 1;
int flameValue = 1;
// Other settings
LiquidCrystal_I2C lcd(0x27,20,4);
void setup()
{
// Initiate some hardware
lcd.init();
lcd.backlight();
Wire.begin();
Serial.begin(9600);
pinMode(skruvPin, OUTPUT);
pinMode(callingForHeat, INPUT);
pinMode(heaterPin, OUTPUT);
setSyncProvider(RTC.get);
}
void loop()
// Things that starts right away
// Check current boiler status
{
FOn=getFlameStatus(); // Get flame status bool (on or off)/(True or False)
k=CheckBoilerStatus(); // Get the status from boiler int 0-3
lcd.setCursor(0,1); // Debug
lcd.print(k); // Debug
switch (k) { // Act on boiler status
case 0: // 0 Boiler needs to be started
break;
case 1: // 1 Boiler should run with set effect mode
runBoiler(1);
break;
case 2:
blowOut();
break;
case 3:
fillPellets();
break;
}
}
int CheckBoilerStatus() // Checking boiler status and set it as an int 0-3
/*
Controls the status of the boiler
0 = Boiler is hot enough, no need to start, flame is out
1 = Boiler has flame and wants more heat, run pellet feed and fan
2 = Boiler has flame but is hot enough, run fan until flame is out
3 = Boiler has no flame and is not hot enough, start from beginning with feeding pellet and start heating
*/
{
FOn = getFlameStatus();
calling = digitalRead(callingForHeat);
if ((FOn == 1) && (calling == 1))
{
return 1;
}
else if ((FOn == 1) && (calling == 0))
{
return 2;
}
else if ((FOn == 0) && (calling == 1))
{
return 3;
}
else
{
return 0;
}
}
int getFlameStatus() {
int avgFlame;
for (int i = 1; i < 51; i++) {
avgFlame = analogRead(flameInput)+avgFlame;
}
flameValue = avgFlame / 50;
if (flameValue < flameThreshold)
{
return false;
}
else if (flameValue >= flameThreshold)
{
return true;
}
}
void fillPellets() {
if (filledPellets == 0)
{
t=now();
timePlusThirtySec = t + 2;
// Serial.println(t);
// Serial.println(timePlusThirtySec);
while (t < timePlusThirtySec){
t = now();
lcd.setCursor(0,0);
lcd.print(timePlusThirtySec - t);
lcd.print(F(" "));
digitalWrite(skruvPin, HIGH);
lcd.print(F("Feeding ... "));
}
filledPellets = 1;
digitalWrite(skruvPin, LOW);
lcd.setCursor(0,0);
lcd.print(F("Feeding, done!"));
ignitePellets();
}
else{
}
}
void ignitePellets() {
lcd.setCursor(0,1);
lcd.print(F("Ignites pellets "));
lcd.print(CheckBoilerStatus());
for (int c = 1; c < 11; c++) {
lcd.setCursor(0,0);
lcd.print(F("Igniting, try no: "));
lcd.print(c);
lcd.setCursor(0,3);
lcd.print(CheckBoilerStatus());
digitalWrite(heaterPin, HIGH);
Serial.println(F("HeaterPin High"));
t = now();
timePlusTenSec = t + 1;
while (t < timePlusTenSec) {
t = now();
lcd.setCursor(0,1);
lcd.print(F("Fan high "));
//Run fan at high speed
}
t = now();
timePlusTenSec = t + 1;
while (t < timePlusTenSec) {
t = now();
lcd.setCursor(0,1);
lcd.print(F("Fan low "));
//Run fan at low speed
lcd.setCursor(0,1);
lcd.print(counter);
}
CheckBoilerStatus();
if (CheckBoilerStatus() == 1)
{
lcd.setCursor(0,1);
lcd.print(F("Choosen effect: "));
lcd.print(choosenEffect);
runBoiler(choosenEffect);
}
}
digitalWrite(heaterPin, LOW);
lcd.setCursor(0,0);
counter = CheckBoilerStatus();
lcd.print(counter);
Serial.print(counter);
delay(10000);
if (counter == 3)
{
larmStop(1);
}
}
void runBoiler(int effect) {
digitalWrite(heaterPin, LOW);
time_t q = now();
int effectValue;
switch (effect)
{
case 1:
timePlusTwentySec = q + 20;
while (q < timePlusTwentySec)
{
lcd.setCursor(0,3);
lcd.print(F("Feeds in: "));
lcd.print(timePlusTwentySec - q);
lcd.print(F(" "));
q = now();
};
digitalWrite(skruvPin, HIGH);
delay(1000);
digitalWrite(skruvPin, LOW);
CheckBoilerStatus();
break;
case 2:
timePlusThirteenSec = q + 13;
while (q < timePlusThirteenSec)
{
lcd.setCursor(0,3);
lcd.print(F("Feeds in: "));
lcd.print(timePlusThirteenSec - q);
lcd.print(F(" "));
q = now();
};
digitalWrite(skruvPin, HIGH);
delay(1000);
digitalWrite(skruvPin, LOW);
CheckBoilerStatus();
break;
case 3:
timePlusNineSec = q + 9;
while (q < timePlusNineSec)
{
lcd.setCursor(0,3);
lcd.print(F("Feeds in: "));
lcd.print(timePlusNineSec - q);
lcd.print(F(" "));
q = now();
};
digitalWrite(skruvPin, HIGH);
delay(1000);
digitalWrite(skruvPin, LOW);
CheckBoilerStatus();
break;
case 4:
effectValue = 4;
break;
case 5:
effectValue = 5;
break;
case 6:
effectValue = 6;
break;
case 7:
effectValue = 7;
break;
case 0:
effectValue = 0;
break;
}
}
void blowOut () {
// Set fan high if status is 2 for 5 minutes (300 seconds)
time_t r = now();
timePlusThreehundredSec = r + 300;
while (r < timePlusThreehundredSec) {
// Fan speed high
}
CheckBoilerStatus();
}
void larmStop(int larmMode) {
digitalWrite(skruvPin, LOW);
digitalWrite(heaterPin, LOW);
// Set fan to High for five minutes
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("L A R M ! ! ! "));
lcd.print(larmMode);
lcd.setCursor(0,1);
lcd.print(F("Start failed!"));
lcd.setCursor(0,2);
lcd.print(F("Restart manually"));
int s = 1;
while (s < 10) {
lcd.backlight();
delay(200);
lcd.noBacklight();
delay(200);
}
}
Re: Ensten bygger styrning till pelletsbrännare
Sitter här med en utskriven kopia på din kod, jag är nybörjare på arduino så jag gör det av nyfikenhet.
Jag undrar vad är det för skillnad på Time.h och DS1307RTC.h
Finns det inte klocka i RTC:n??
Jag undrar vad är det för skillnad på Time.h och DS1307RTC.h
Finns det inte klocka i RTC:n??
Re: Ensten bygger styrning till pelletsbrännare
Hmmmm
Jag KAN ha missuppfattat det hela men jag TROR att Time.h ger tillgång till funktioner som använder informationen i DS1307RTC.h
Det där måste jag läsa på om. Ursprungligen hade jag en klocka som visade tid och datum på översta raden på LCD'n men den har jag tagit bort under labbtiden, dels för att göra koden renare och mer lättläst och för att minska risken för buggar. Vidare så märkte jag att tiden driver med flera minuter per dygn så den är rätt värdelös som klocka. Jag använder RTC'n numera enbart för att räkna sekunder som olika funktioner ska köras. Jag har beställt en annan RTC enligt tidigare inlägg i tråden som jag ska prova med när den kommer. Jag vill gärna ha datum och tid för att kunna logga olika saker.
Jag KAN ha missuppfattat det hela men jag TROR att Time.h ger tillgång till funktioner som använder informationen i DS1307RTC.h
Det där måste jag läsa på om. Ursprungligen hade jag en klocka som visade tid och datum på översta raden på LCD'n men den har jag tagit bort under labbtiden, dels för att göra koden renare och mer lättläst och för att minska risken för buggar. Vidare så märkte jag att tiden driver med flera minuter per dygn så den är rätt värdelös som klocka. Jag använder RTC'n numera enbart för att räkna sekunder som olika funktioner ska köras. Jag har beställt en annan RTC enligt tidigare inlägg i tråden som jag ska prova med när den kommer. Jag vill gärna ha datum och tid för att kunna logga olika saker.