Ensten bygger styrning till pelletsbrännare

Berätta om dina pågående projekt.
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 »

Så DS1307RTC är inte så precis, jag som tänkt att kanske kunna använda den i ett tid och tempraturstyrt motorvärmaruttag. Men det skiter sig om den drar sig så mycket, men jag funderar på att om avvikelsen är konstant så kanske det går att kompensera avvikelsen en gång per dygn.
När det står tex Time.h eller MemoryFree.h är det en fil man inkluderar som heter så, vart ligger lägger man den filen i arduino projektet?

Hoppas att det är okej att jag kommer med frågor fast det inte precis för ditt projekt framåt. :)
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 »

Mina erfarenheter är att den drar sig BIG TIME, men det finns någon som gjort en snurra som kompenserar för felet genom att då och då ställa om klockan. Det han gjorde var att noga ta reda på hur många sekunder den drar sig under en given tidsperiod och sedan justera utifrån det.

När det gäller #include libraryfil.h så ska dom läggas i librarymappen för Arduino IDE. När man laddar ner bibliotek (library) för olika saker brukar det finnas några exempelfiler med och dom kan det vara bra att gå igenom så att man förstår hur det är tänkt att man ska använda biblioteket.

Sedan har jag (som flera påpekat också) upptäckt att kvalitén på de olika biblioteken (libraryfilerna) kan skilja rätt mycket. Exempelvis så var LiquidCrystal_I2C.h från den som jag köpte LCD'n helt kass medan från dfrobot.com funkade ypperligt.

Helt ok att fråga. Jag är själv ultrarookie, detta är mitt absolut första projekt efter "blink a led" så jag svarar på det jag kan. Är jag helt ute och cyklar så hoppas jag att ni mer erfarna hoppar in och rättar mig och fyller i.
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 »

Här är lite kommentarer om DS1307 vs DS3232

Länk ...

Den har en liten bonusfunktion; en tempsensor (som används för att temperaturkompensera klockan, men den är också läsbar för användaren. Blir perfekt för att hålla koll på temperaturen i min styrbox.
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 »

Vart har du köpt din DS3232? Såg att det finns färdiga breakout med batteri på bla ebay, man slipper få magsår pga av den knepiga lödningen iaf.
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 »

Uppdaterad kod v0.16
Allmän uppsnyggning, fler kommentarer.
Inga direkta uppdateringar i funktioner mer än att jag kör

Kod: Markera allt

lcd.clear()
i början på alla rutiner och där en ny funktion i programmet börjar.

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 boilerOverheatPin = 11;		// Set pin for overheated boiler 
byte heaterPin = 10;       			// Set pin for heater
byte burnerOverheatPin = 9;			// Set pin for overheated burner
byte resetPin = 8;					// Reset program (Not Arduino)
byte callingForHeat = 7;   			// Set pin for listening on boiler calling for heat
int flameInput = A0;				// Analog pin for flame


// Set other variables
int flameVisible;					// Is there a flame?
int calling;						// Does boiler call for heat?
boolean FOn;						// Is there a flame
int k;								// What is the boiler status?
time_t t = now();					// Sets the variable 't' to now()
long timePlusFiveSec = 5;			// Container for now + 5 seconds
long timePlusOneSec = 1;			// Container for now + 1 second
long timePlusThirtySec = 30;		// Container for now + 30 seconds
long timePlusTenSec = 10;			// Container for now + 10 seconds
long timePlusTwentySec = 20;		// Container for now + 20 seconds
long timePlusThreehundredSec = 300; // Container for now + 300 seconds (5 minutes)
long timePlusThirteenSec = 13;		// Container for now + 13 seconds
long timePlusNineSec = 9;			// Container for now + 9 seconds
int filledPellets = 0;				// Is pellets filled (start feed)
int flameThreshold = 100;			// Contains threshold for when flame is detected
volatile int choosenEffect = 2;		// Volatile container makes it possible to change effect during run


// 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);
  pinMode(boilerOverheatPin, INPUT);
  pinMode(burnerOverheatPin, INPUT);
  pinMode(resetPin, INPUT);
  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(F("Boiler Status: "));
lcd.print(k);					// Debug
  
  switch (k) {					// Act on boiler status
  case 0:						// 0 Boiler is idling, nothing to do but sending log data
  	lcd.clear();
  	lcd.setCursor(0,0);
  	lcd.print(F("Boiler idle")); 	  	
  	lcd.setCursor(0,1);
  	lcd.print(F("Running data maint."));
  	
  	break;
  	
  case 1:						// 1 Boiler should run with set effect mode
  	runBoiler(choosenEffect);
  	break;
  
  case 2:
  	blowOut();					// 2 Blow out flame, boiler is done
  	break;
  	
  case 3:
  	fillPellets();				// 3 Start by feed and ignite pellets
	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(); 					// Get flame status 
  calling = digitalRead(callingForHeat);	// Does boiler ask for heat?
  
  if ((FOn == 1) && (calling == 1))			// Set proper status according to info 
  {	
    return 1; 
  }
  
  else if ((FOn == 1) && (calling == 0))
  {
    return 2;
  }
  
  else if ((FOn == 0) && (calling == 1))
  {
    return 3;
  }
  
  else
  {
    return 0; 
  }
 }


int getFlameStatus() {					// Determents the flame status

  int flameValue;						// Int to hold the avg flame value
  int avgFlame;							// Int variable to hold the sums of flame level

  for (int i = 1; i < 51; i++) {		// Take 50 samples of the flame value
    avgFlame = analogRead(flameInput)+avgFlame; 
  }
  
  flameValue = avgFlame / 50;			// Divide the result by 50


  if (flameValue < flameThreshold)		// Determent if flame is on or off
  {
    return false;
  }
  else if (flameValue >= flameThreshold)
  {
    return true;
  }
}

void fillPellets() {					// Routine to fill pellets ans start ignition
lcd.clear();
  if (filledPellets == 0)				// Check that pellets has not all ready been filled
  {
    t=now();
    timePlusThirtySec = t + 2;			// Calculate the 30 second feeding time
   
    while (t < timePlusThirtySec){		// Fill pellets for 30 seconds
      t = now();
      lcd.setCursor(0,0);
      lcd.print(timePlusThirtySec - t);
      lcd.print(F(" "));
      digitalWrite(skruvPin, HIGH); 	// Sets the skruvPin high
      lcd.print(F("Feeding ...  "));
    }
    filledPellets = 1;					// Pellets has been filled
    digitalWrite(skruvPin, LOW);		// Turn off skruvPin (set to low)
    lcd.setCursor(0,0);
    lcd.print(F("Feeding, done!"));
    ignitePellets();					// Run the ignition routine
  }
  else{
  
  }
}

void ignitePellets() {					// Routine to ignite pellets
  lcd.clear();
  lcd.setCursor(0,1);
  lcd.print(F("Ignites pellets "));
  
  for (int c = 1; c < 11; c++) { 		// Try 10 times to ignite
 
  lcd.setCursor(0,0);
  lcd.print(F("Igniting, try no: "));
  lcd.print(c);
    digitalWrite(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
      
    }
    k = CheckBoilerStatus();
    if (k == 1)
    { 
      runBoiler(choosenEffect);
    }

  }
  digitalWrite(heaterPin, LOW);
  
  if (k == 3)
  {
   larmStop(1); 
  }

}


void runBoiler(int effect) {
  lcd.clear();
  digitalWrite(heaterPin, LOW);
  time_t q = now();
  int effectValue;
  
  
  switch (effect)
  {
  case 1:
  	lcd.setCursor(0,0);
  	lcd.print(F("Effect mode: "));
  	lcd.print(effect);
  	
  	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:
  	lcd.setCursor(0,0);
  	lcd.print(F("Effect mode: "));
  	lcd.print(effect);
    
    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:
  	lcd.setCursor(0,0);
  	lcd.print(F("Effect mode: "));
  	lcd.print(effect);
  	
    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;			// Do nothing, boiler is off
    lcd.setCursor(0,0);
  	lcd.print(F("Effect mode: "));
  	lcd.print(effect);
  	lcd.setCursor(0,1);
  	lcd.print(F("Boiler is off"));
    break;
  }


}

void blowOut () {
	// Set fan high if status is 2, for 5 minutes (300 seconds)
	lcd.clear();
	time_t r = now();
	timePlusThreehundredSec = r + 300;
	while (r < timePlusThreehundredSec) {
	lcd.setCursor(0,0);
	lcd.print(F("Blowing out flame"));
	lcd.setCursor(0,1);
	lcd.print(F("Left: ");
	lcd.print(timePlusThreehundredSec - r);
	lcd.print(F(" of 300");
	r = now();
	// Fan speed high
	}
	
	
	CheckBoilerStatus();
	
}

void larmStop(int larmMode) {
  lcd.clear();
  digitalWrite(skruvPin, LOW);
  digitalWrite(heaterPin, LOW);
  switch (larmMode)
  {
  case 0:
  // larmMode 0 = no alarm fired
  break;
  
  case 1:
  // 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"));
  break;
  
  case 2:
  // Burner fired overheat protection
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("L A R M ! ! !  "));
  lcd.print(larmMode);
  lcd.setCursor(0,1);
  lcd.print(F("Burner overheat!"));
  lcd.setCursor(0,2);
  lcd.print(F("Wait for aut reset"));
  
  break;
  
  case 3:
  /* 
  Boiler fired overheat protection (Mains power for fan and screw is off) 
  Manual reset of boiler required 
  */
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("L A R M ! ! !  "));
  lcd.print(larmMode);
  lcd.setCursor(0,1);
  lcd.print(F("Boiler overheat!"));
  lcd.setCursor(0,2);
  lcd.print(F("Reset manually"));
  
  break;
  
  case 4:
  /* 
  Chute detector fires alarm. Chute is full of pellets or smoke is coming 
  up the chute. Clean glass and clear chute.
  */
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(F("L A R M ! ! !  "));
  lcd.print(larmMode);
  lcd.setCursor(0,1);
  lcd.print(F("Chute alarm!"));
  lcd.setCursor(0,2);
  lcd.print(F("Check chute"));
  
  break;
  
  }
  // Blink LCD background to get attention
  int s = 1;
  while (s < 10) {
  lcd.backlight();
  delay(200);
  lcd.noBacklight();
  delay(200);
  }  
}

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 »

Tänkte berätta om ett litet tips som jag använder mig av när jag klockar gångtiderna på min pelletsbrännare.

Jag tar min smartphone och placerar den på matarskruvens huv med en ljudinspelningsapp igång. Sedan importeras ljudfilerna i Audacity där jag mycket lätt kan se gångtider, pauser osv. Mycket smidigt och ger mer än tillräcklig precision för detta ändamål.

Bilden visar skruvens gångtid och pausintervall på effektläge 4.
Skärmavbild 2013-12-30 kl. 11.16.06.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
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 en fråga till forumet.

Pannans överhettningsskydd (inte att förväxla med brännarens överhettningsskydd) klipper strömmen till den nuvarande styrningen (och allt annat som är kopplat till pannans matningsspänning). Jag vill inte bryta bort hela min styrning utan enbart klippa spänningen till fläkt och matarskruv för att förhindra att pannan kör på. Dett borde ur säkerhetsaspekt inte vara några problem.

Men hur gör man smartast så att min Arduino detekterar att överhettningsskyddet löst ut?
En variant är att ha en väggvårta som ger 5VDC och som sätter en pinne hög när allt är normalt men går låg när skyddet löser ut. Det känns lite som en halvtaskig lösning ändå, finns det inget annat sätt att detektera spänning i en kabel (230VAC) - kom ihåg att skruven endast går sporadiskt medan fläkten går, om än med olika hastighet, i stort sett kontinuerligt utom när pannan idlar eller är avstängd?

Hallsensor, kanske? JimmyAndersson, du hade väl labbat lite med det i din anläggning?

När det sedan gäller överhettningsskyddet på brännaren är det lite lättare eftersom det bara handlar om en brytande funktion och där är det i princip bara att lägga in det skyddet på lämplig pinne. Kanske kan bryat styrströmmen till SSR som styr fläkt och skruv där också för ökad säkerhet.

Anledningen att jag vill ha in detekteringen i Arduinon är att jag kan ge feedback via LCD och ett kort förslag på åtgärd. Exempelvis om pannans skydd löser ut: "Återställ manuellt", eller om brännarens skydd löser ut: "Invänta automatisk återställning" och sedan när skyddet återställts: "Pannan redo för start" ... typ så ...
Användarvisningsbild
Variosboy
Inlägg: 834
Blev medlem: 5 september 2005, 17:10:03
Ort: kristinehamn

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Variosboy »

Finns ju relän med 230V spole, enkelt och robust och förmodligen finns det flera tungor på dom så du kan använda till larm utanför brännarens styrning.

Edit:
Tex detta:

http://www.kjell.com/sortiment/el/el-pr ... ac)-p36179
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 »

Ja det har du ju rätt i. :humm: Jag hade fått för mig att dom var snuskigt dyra, men det där var ju klart överkomligt. Och som sagt, det är ju inget som påverkar säkerheten om relät fallerar eftersom dess uppgift är att tala om för arduinon att något hänt.
Användarvisningsbild
Variosboy
Inlägg: 834
Blev medlem: 5 september 2005, 17:10:03
Ort: kristinehamn

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Variosboy »

Nu är väl inte det som Kjell har det bästa man kan hitta, men eftersom det inte är en funktion som går av och på stup i kvarten så känns det rätt lugnt, man kommer ju troligtvis inte slita ut det genom av och påslag 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 »

Nä, det var det jag tänkte på också - och när det dessutom inte påverkar funktionen på överhettningsskyddet så känns det lugnt.
Wise
Inlägg: 431
Blev medlem: 17 maj 2005, 17:57:19
Ort: Hudiksvall
Kontakt:

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Wise »

Om du tar matningen till kortet du ska ha för fläktstyrningen från pannans överhettningsskydd, så kan du detektera att du inte får några nollpunktsgenomgångar när skyddet löser ut.
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 »

Nästa issue.

Fallschaktsensorn har jag lyckats hitta produktblad/datablad till och den skall kopplas in så här:
Skärmavbild 2013-12-31 kl. 15.22.18.png
NC / NO - ska dom kopplas med GND (0V) eller positivt? Det står angivet på annat ställe att den givaren är PNP på utgången.

Edit> Jag förstår att jag väljer NO vs NC beroende på funktion.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Icecap
Inlägg: 26628
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Ensten bygger styrning till pelletsbrännare

Inlägg av Icecap »

Jag antar att du menar pelletssensorn.

Och ena utgången brukar sitta till GND via en NPN medan andra brukar sitta till matningen via en PNP.
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 inte med :humm:
Skriv svar