Övervaka uppvärmning – Del 1 – Övervaka pelletsnivå

Har nu bestämt mig för att övervaka uppvärmningen hemma. Projektet kommer att göras i etapper och beskrivas i detalj allt eftersom jag blir färdig.

Första delen av projektet kommer att fokusera på övervakning av pelletsnivån. Eftersom jag har en Vera Lite som centralt gränssnitt så kommer en Arduinon att rapportera direkt till Veran via Ethernet.

Veran har inte någon enhet som baseras på avstånd, så har jag valt att nyttja en virtuell ljussensorn i Vera istället. Eftersom ljussensorn i Vera visar data som procent så krävdes det omvandling av avstånd till procent.

Pellets-Arduino1

 

 

 

 

 

Detta är resultatet i Vera, Arduinon rapporterar 82% pellets kvar (dvs det är ca 49,2 cm pellets kvar), vid 15% så triggas en scene som skickar ett sms.

 

Genom att mäta avståndet från ping sensor och matarröret i pelletslagret så fås ett statiskt värde. Jag låter Arduinon mäta avståndet till pelletsen och översätter sedan resultatet till procent med hjälp av avståndet jag mätte tidigare. Data kan nu rapporteras till en ljussensor i Vera.

Nu går det att trigga en scene när pelletsnivån understiger X%. I mitt fall så är det 60cm mellan ping sensor och matarrör. Får jag mindre än 15% pellets så skickas ett sms samt ett mail.

Komponenter

För att skapa enheten som mäter pellets så nyttjade jag följande komponenter:

Arduino Uno Rev3

Arduino Ethernet shield

Avståndssensor

 

 

Arduinon nyttjar följande portar i mitt sketch:

Nätverkskortet: (digitala portar)

  • D10
  • D11
  • D12
  • D13

Ping sensor: (digitala portar)

  • D7
  • D8

PingSensor

 

 

 

 

 

Ping sensorn kopplas på följande sätt.

  • VCC = +5v Arduino.
  • Trig = D8 Arduino.
  • Echo = D7 Arduino.
  • GND = jord / ground Arduino.

 

Projekt såg ut på följande sätt när jag kopplat upp det på en labbplatta.

Arduino-PelletsSensor

 

 

 

 

 

Påbörjar kodning.

 

Nu börjar jobbet med att få till en funktion som rapporterar in avståndet som procent via Ethernet.

Jag började med att testa en funktionen för att mäta avstånd i Arduino genom att ladda ”ping” sketchen i Arduino applikationen

Arduino-PingDefault

 

 

 

 

 

 

Funktionen var inte tillräckligt exakt som jag önskade. Jag letade lite på internet och hittade en sketch som gjorde uträkning av avstånd mycket bättre.

Detta är koden jag utgick ifrån: Ping sketch

Förklaring av koden

Koden jag hämtade fungerade riktigt bra, jag behövde inte göra mer än att bygga en funktion av allt och returnera data som procent istället för cm.

Koden jag nyttjar returnerar ”distance”, vilket är allt jag behöver.

  • distance = duration/58.2;

Eftersom ”distance” innehåller avståndet i cm så behöver jag bara skapa en formel som översätter avståndet till procent. Jag skapade en variabel som innehåller avståndet i CM ner till matarröret (PelletsMaxNiva).

  • float PelletsMaxNiva = 60.0;

 

Följande beräkning delar avståndet som ping sensorn har registrerat med avståndet till matarröret och multiplicerar det med 100 för att få det som procent.

  • float PelletsProcent = distance / PelletsMaxNiva * 100;
  • int pelletsProcentStatus = floor(PelletsProcent * 100) / 100;

// The floor() function returns the largest integral value less than or equal to __x, expressed as a floating-point number.

Eftersom jag vill veta hur många procent det är kvar så måste jag vända på resultatet så att 100% innebär att det är fullt med pellets och inte slut.

  • int Procentkvar =  (100 – pelletsProcentStatus);

 

Eftersom det kommer att larma i Vera så vill jag inte rapportera värden som är mer än 100% eller mindre än 0%.

Följande rad säkerställer att enbart värden 0-100 samt 200 returneras ur funktionen. 200 är ett värde som nyttjas i felhanteringen.

  • if (Procentkvar >= 0 && Procentkvar <= 100){
  • return Procentkvar;
  • }  else {
  • return 200;
  • }

Nu behöver jag bara rapportera in detta till vera via Ethernet, det gör jag genom funktionen httpLjusRegister(). Jag kommer att skriva mer om detta i kommande inlägg.

 

void loopen

Jag kontrollerar om min funktion returnerar 200, gör den det så skickas inte någon information till Veran, om annat värde än 200 tas emot så skickas resultatet till Vera.

int pelletsStatus = 0;  // nollar tidigare resultatet för att inte riskera att skicka ett gammalt värde.
pelletsStatus = checkPelletsStatus(); // kontrollerar avståndet till pellets och returnerar här antal procent pellets som kvarstår.
if (pelletsStatus == 200){
Serial.println(”vardet som mottogs va felande!”);   // Här ska en åtgärd sedan utföras (För tillfället så har jag inte larmsatt felande avläsningar.)
} else {

Här nyttjar jag min funktion för att skicka in via Ethernet till veran. Kommer att förklara denna funktion mer ingående i en annan post inom kort.

httpLjusRegister(71, pelletsStatus); // Skickar data till veran på enhets id 71.

}

Om du själv vill köra koden:

Jag har fetmarkerat texten du behöver ändra för att själv rapportera in data till Vera.

  • #include <SPI.h>
    #include <Ethernet.h>
  • #define echoPin 7 // Echo Pin
    #define trigPin 8 // Trigger Pin
    char server[] = ”Address till din vera”;   // Skriv här namnet till din vera.
    byte mac[] = { 0xDE, 0xAA, 0xBE, 0xEF, 0xFE, 0xED };  // Här kan du välja en annan mac adress.
    IPAddress ip(10,10,10,123);  // Sätt här ett ip på samma subnät som din vera.
    EthernetClient client;
    int serverPort = 3480;  // Porten på din vera, detta ska vara default så det ska inte behövas ändars.
  • float loopDelay   = 900000 // Vänta X ms innan man åter skickar ett värde till Vera. 900000 = 15 minuter.
  • int maximumRange = 200; // Maximum range needed
    int minimumRange = 0; // Minimum range needed
    int pelletsStatus = 0; // anger hur många CM pellets som är kvar.
    float PelletsMaxNiva = 60.0; // Ange detta med .0 eftersom jag räknar med float längre ner! värdet ska återspegla avståndet till matarröret.
    long duration, distance; // Duration used to calculate distance

 

Följande rad måste även ändras så att du rapporterar in data på rätt enhet i vera. siffran 71 ska ersättas med enhets id på enheten som skapades enligt guiden.

httpLjusRegister(71, pelletsStatus); // Skickar data till veran.

I följande länk står det hur du skapar en virtuell ljussensor i Vera: Guide

 

Resultat

Pellets-Arduino-3-Debug

 

 

 

 

 

 

 

 

 

Följande debug fick jag via serieporten, Jag tycker att det ser rätt så ok ut.

Tyvärr så missade jag att ändra texten i Arduinon, så nu står det: ”Skickade ljus data till vera”

 

Nu är det bara att skapade en scene i Vera som aktiveras om ”ljuset” understiger 15% och sedan larma på det.

Arduino-Pelletsscene

 

 

Eftersom jag tidigare har gjort en funktion för att skicka sms med Vera så har jag valt att nyttja det när det blir lite pellets. (guiden finns här).

Jag har kört loggning över natten och fått en graf, för tillfället så stämmer det relativt bra med hur mycket pellets som är precis under sensorn.

PelletsLoggning

 

 

 

 

 

 

 

 

 

Orsaken till att det blir mer pellets några gånger än tidigare i grafen beror på att pellets rasar från kanterna ner mot hålet som mattarröret skapar.

I början så tas det extra mycket pellets precis under sensorn därav ser det ut att gå extra mycket.

PelletsGivaren

 

 

 

 

 

 

 

Från och med nu har jag full kontroll på hur mycket pellets det finns kvar direkt i Vera. Utöver kontrollen av nivån så får jag en graf som visar mycket pellets det går och när jag fyller på.

Har nu kört Arduinon tills det blev dags att fylla på pellets, när pelletsnivån nådde 15% så fick ett sms att det är dags att fylla på pellets.

PelletsGraf

 

 

 

 

 

 

 

 

Är mycket nöjd med resultatet.

Arduinon kommer att kompletteras med mer komponenter och funktioner i nästa del av projektet. Den kommer även att flyttas och få en mycket mer professionell paketering!

Sketchen för att göra detta själv finns här: PelletsScript

// Markus

8 reaktioner på ”Övervaka uppvärmning – Del 1 – Övervaka pelletsnivå”

  1. Pingback: Guide – Vera UI7 – Appar |

  2. Pingback: Guide – Vera UI7 – App – DataMine |

  3. Pingback: Vera UI7 – Mysensor – Distanssensor |

  4. Superintressant. Jag är intresserad av att göra samma sensor, men som helst skickar resultatet till min Tellstick duo (433mhz). Några av komponenterna du använde finns inte längre på länkarna du lagt upp – vad är en Vera lite?

  5. Tackar
    Nu när vintern börjar närma sig så kanske det är dags att göra del två i pellets projektet.

    Jag tror jag har några 433Mhz sändare och koden kvar sedan jag höll på med min Telldus Duo. Ska se om det är nått som fungerar så fort jag hinner. Vad kör du din tellstick med för OS?

    En Vera Lite är en Z-wave kontroller som jag nyttjar i mitt hemautomations system, den är nu ersatt av Vera Edge: https://www.m.nu/vera-edge-p-1699.html

    Uppdaterade till länken till Arduino, bra att du sa till.
    // Ispep

  6. Pingback: Går Det Att Använda Z-wave Som Larm? |

  7. Björn Johansson

    Går det att använda denna guiden och på nåt sätt skicka informationen till en raspberry med domoticz?? Kanske en dum fråga, men hur får du informationen till din vera? Via ethernet kabel eller trådlöst på nåt sätt?

    Mvh Björn

    1. Absolut, ändra bara vart datat ska skickas. Ser att jag inte tydligt skrivit ut det i den här guiden, men det är Ethernet jag skickar med.

      Kommer inom kort att uppdatera det här projektet, förhoppningsvis med en NodeMCU (ESP8266) som sedan skickar direkt till en MQTT kö och HTTP tjänst.
      Guiden nedan visar hur du konfigurerar en RPI för att ta emot via MQTT.
      https://www.automatiserar.se/guide-raspberry-pi/#InstallationMQTT

      // Ispep

Lämna en kommentar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *