Ensten bygger styrning till pelletsbrännare

Berätta om dina pågående projekt.
Bittämjaren
Inlägg: 219
Blev medlem: 2 februari 2013, 17:50:41
Ort: BORÅS

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Bittämjaren »

johano har du så korta start-stoppcykler att det inte hinner glöda färdigt innan nästa start ?
Användarvisningsbild
Icecap
Inlägg: 26629
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Icecap »

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.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av johano »

Bittämjaren skrev:johano har du så korta start-stoppcykler att det inte hinner glöda färdigt innan nästa start ?
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....

/johan
Användarvisningsbild
Icecap
Inlägg: 26629
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Icecap »

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.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av johano »

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
Användarvisningsbild
Icecap
Inlägg: 26629
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Icecap »

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.
Användarvisningsbild
ensten
EF Sponsor
Inlägg: 3759
Blev medlem: 19 oktober 2004, 15:55:20
Ort: Hudiksvall

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av ensten »

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.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av johano »

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
Zkronk
Inlägg: 1439
Blev medlem: 23 augusti 2005, 16:44:36
Ort: Uppsala

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Zkronk »

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...
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av blueint »

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?
Användarvisningsbild
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

Inlägg av tecno »

eller använda temperatursensor för att veta om det redan glöder?

Läser inte du vad som skrivits i tråden?
Användarvisningsbild
ensten
EF Sponsor
Inlägg: 3759
Blev medlem: 19 oktober 2004, 15:55:20
Ort: Hudiksvall

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av ensten »

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:

Kod: Markera allt

lcd.print(F("Min fina text här)); 
vilket frigjorde några hundra byte ytterligare. Nu börjar koden se respektabel ut i alla fall.
Användarvisningsbild
ensten
EF Sponsor
Inlägg: 3759
Blev medlem: 19 oktober 2004, 15:55:20
Ort: Hudiksvall

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av ensten »

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

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);
  }  
}

Användarvisningsbild
orvar-e
EF Sponsor
Inlägg: 5973
Blev medlem: 9 mars 2007, 09:01:32
Ort: Borlänge

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av orvar-e »

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??
Användarvisningsbild
ensten
EF Sponsor
Inlägg: 3759
Blev medlem: 19 oktober 2004, 15:55:20
Ort: Hudiksvall

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av ensten »

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.
Skriv svar