Introduction: EAL DIY - Twin Heat Overvågning

Hej og velkommen til denne Instructables!

Os med pille fyr kender til det med jævnligt, at skulle gå over og tjekke magasinet for træpiller. Hvis magasinet løber tør, ja så er der ikke mere varmt vand, og der kan derved gå lang tid før, der komme varme på kilderne igen. Det kan også ske, at der kommer en tilbagebrand, hvis magasinet er ved at løbe tør.

I dette projekt vil jeg derfor vise dig, hvordan du med simple komponenter og lidt programrings skils, kan lave en overvågnings enhed til et Twin Heat fyr eller andet pille fyr, så du undgår disse problemer.

Meningen med dette projekt var, at enheden skulle sende en SMS med alarmer, men da der var fejl på mit GSM modul til Arduino, har dette ikke været muligt. Til gengæld vil du være i stand til at simulere det hele fra Serial Monitor i Arduinos programmerings miljø.

Hvis du følger alle steppene, lige ind til det sidste, vil du være i stand til at:

  • Opsætning direkte fra Serial Monitor
  • Få alarm ved X% tomt magasin
  • Få alarm ved for høj temperatur i tilbageløb, for at fortælle om eventuel tilbagebrand

Step 1: Teori

I dette step vil jeg forklare teorien bag min måle metode

Til at måle niveauet i pillemagasinet bruger jeg som sagt en ultralydssensor. Denne teknik er en teknik, der er blevet brugt i mange år, selv dyreverden gør brug af den.

En ultralydssensor fungerer ved, at der bliver sendt en lyd ud. Denne lyd reflekterer så på objektet, og kommer tilbage til sensoren. På sensoren sidder der en mikrofon, som opfanger lyden. Ved at måle tiden fra lyden udsendes, til den kommer tilbage, kan man derved regne afstanden ud.

Step 2: Udstyr

I dette step vil jeg præsentere, hvilket udstyr jeg har brugt.

Udstyrsliste:

Step 3: Værktøj

I dette step viser jeg dig, hvilket værktøj jeg har brugt til dette projekt

Værktøj:

  • Diverse skruetrækker
  • Saks
  • Rørtang
  • Unbraconøgle
  • Voltmeter
  • Klemmetang
  • Skævbider
  • Afisoleringstang
  • Skydelære
  • Juletræsbor
  • Boremaskine

Step 4: Forberedelse Af Boks

I dette step vil jeg vise dig, hvordan jeg har forberedt boksen til komponenterne.

For at gøre det mere visuelt, har jeg valgt at printe et front display til boksen. Derved kan man nemmere se, hvad de forskellige kontakter og knapper gør.

Sådan har jeg lavet displayet:

  1. Print den vedhæftede fil, på et A4 etiket ark.
  2. Klip det ud
  3. Sæt printet fast på låget af boksen

Boring af huller til knapper:

  1. Tag juletræsboret og bor ud til den røde cirkel

Boring af huller til kabelforskruninger:

  1. Marker midten af boksens side op
  2. Bor tre huller, med plads mellem hinanden, så møtrikkerne kan komme på

Step 5: Montering På Boks

I dette step skal knapper, kontakter, forskruning og Arduino fastgøres

Dette step er ret lige til, og jeg vil derfor ikke gå så meget i dybden med det. Delene skal bare skrues fast, på boksen.

Arduinoen er fastgjort med dobbeltklæbende tape. Sørg for at den ikke sidder under drejekontakten, da den stikker en del ned i boksen.

Hvis der skulle opstå tvivls spørgsmål, kig der på billederne som reference.

Step 6: Montering Af Boks På Fyr

I dette step vil jeg vise dig, hvordan boksen monteres på fyret

Her har jeg valgt at montere boksen for enden af magasinet. Dette er gjort da, det er det første man støder ind i, når man gå ind i fyrrummet. Du kan dog selv vælge, hvor du synes det er mest optimalt at placere din boks.

Boksen her er sat op med dobbeltklæbende tape. En i hvert hjørne.

Step 7: 3D Print

I dette step viser jeg dig holderen til ultralydssensoren

Der er ikke så meget i dette step. Delene skal bare printes på en 3D printer. Brug de vedhæftede 3D filer, jeg har lavet. Hvis du ikke har mulighed for at benytte en 3D printer, kan du lave en holder selv ud af en plade.

Step 8: Ultralyds Sensor

I dette step vil jeg vise dig, hvordan ultralydssensoren er blevet monteret

Til at måle pille niveauet, er der blevet anbragt en ultralydssensor inde i magasinet.
For ikke at skulle hen og bore, tog jeg en bolt ud, hvorved jeg kunne putte kablet her igennem.

Her har jeg lagt kablet dobbelt, og afisoleret kablet ved bukket.


Herefter føres kablet hen til boksen. Dette har jeg gjort ved hjælp af fastholdningssokler og ledningstrips. Dette giver et mere professionelt udtryk, samtidig med at kablet lægger fast ved påfyldning af piller.

Kablet bliver klippet af. Sørg her for at du har nok kabel. Kablet føres gennem forskruningen, hvorefter der bliver monteret ledninger på, så det kan sættes i Arduinoen. I den anden ende bliver der også sat ledninger på, så de kan monteres på ultralydssensoren. Ultralydssensoren sættes fast i holderen, og monteres oppe i hjørnet på magasinet, ved hjælp af dobbeltklæbene tape.

Step 9: Temperatur Sensor

I dette step viser jeg dig, hvordan temperatur sensoren, skal monteres

For at undgå tilbagebrand i magasinet, har jeg her monteret en temperatur sensor, der kan give en alarm, hvis temperaturen stiger over det tilladte.

Montering af temperatur sensor:

  1. Sensoren fastgøres ved sprinkleranlægget med ledningsstrips
  2. Afisoler kablet, og klip en af ledningerne over
  3. Her har jeg valgt at bruge en kabelbakke, der sidder fast under magasinet
  4. Før kablet gennem bakken.
  5. Samle kablet med sensoren, og træk tilbage
  6. Før kablet op i boksen, med samme fremgangsmåde, som sidst

Step 10: Strøm Forsyning

I dette step viser jeg dig, hvordan strømforsyningen er monteret i boksen

Til at levere strøm til Arduinoen og komponenterne, bruges her en 5V transformer.

Montering af strømforsyning:

  1. Marker på den ene ledning, for senere at kunne samle kablet rigtigt.
  2. Før kablet gennem boksen, og samle ledningerne igen
  3. Fastgør derefter kablet til magasinet som tidligere vist.

Step 11: Upload Af Program

I dette step skal programmet uploades

Nu er vi kommet til, hvor programmet skal over på Arduinoen. Hent programmet ned, og overfør det.
Husk at hente følgende libaries:

/*
 *  Opdateret den 28. maj 2017
 *  
 *  Dette projekt er lavet i forbindelse med min uddannelse til 
 *  Automationsteknolog, på EAL i Odense. Med dette projekt vil du være i stand til  
 *  at få en alarm, når dit pille fyr er ved at være tomt, eller bliver for varmt ved tilbage løbet 
 *  
 *  Tjek Instructables for mere information: https://www.instructables.com/id/EAL-DIY-Twin-Heat-Overv%C3%A5gning/
 */
//  Libararies
#include 
#include 


//  Hvor temperatursensoren er sat til
#define ONE_WIRE_BUS 12


//  Til at få temperatursensoren til at virke
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);




//  Parameter der er faste:
const int Password = 1234;              //Passworden til at logge ind ind opsætning er sat til 1234, men kan ændres til et andet tal
const int Drejekontakt = 2;             //Drejekontaktens indgang
const int Resetknap = 4;                //Drejekontaktens indgang
const int trigPin = 9;                  //Trigpins indgang
const int echoPin = 10;                 //Echopins indgang
const int ledPin = 3;                   //Knapens indbyggede led indgang
const int Antal_alarmer = 3;            //Antal alarmer der skal gives
const int Tid_mellem_alarmer = 5000;    //Tid mellem hver alarm
const float Lydshastighed = 0.034;      //Lydnedeshastighed til at beregne afstanden


// Variabler, der ændres løbne i programet
int Drejekontakt_Status = 0;            //Drejekontakt Status. Om den er tændt eller slukket
int var = 0;                            //Sikrer at opsætningen kun sker en gang
int velkomst = 0;                       //Sikrer at velkomesten kun kommer en gang
int Antal_alarm_givet = 0;              //Tæller hvor mange alarmer der er givet
int Antal_alarm_givet_temp = 0;         //Tæller hvor mange alarmer der er givet på temperaturen
int Afstand = 0;                        //Afstanden i magasinet
long Vagt_nr = 0;                       //Vægtens telefon nummer
long Tid = 0;                           //Bruges til at beregne afstanden
float Celsius = 0;                      //Temeperaturen på tilbageløb


// Tags der bliver brugt til opsætning
int temp;                               //Temperaturen i tilbageløbet
float Diagonal;                         //Diagonal længden i magasinet
float Alarm;                            //Hvornår alarmen skal lyde 
float Fyldt = 0;                        //Hvor fyldt magasinet er


void setup() 
{
  /*  Opsætning af serial monitor, så vi kan snakke med enheden
   *  samt hvad der er sat på de forskellige ind og udgange
   */
  Serial.begin(9600);
  sensors.begin();
  pinMode (Drejekontakt, INPUT);
  pinMode (trigPin,OUTPUT);
  pinMode (echoPin,INPUT);
}


void loop() 
{
// Navngivning af drejekontakt, så det kan bruges i switch  
Drejekontakt_Status = digitalRead(Drejekontakt);


// Holder øje med om drejekontakten er i opsætning eller drift mode
switch (Drejekontakt_Status) {


/* ===========================================================================================================
 * ----------------------------------------------  Setop mode ------------------------------------------------        
 * ===========================================================================================================
 */
case HIGH:


    //Tjekker om der er et mobil nummer til vagt, så der kan sendes almere
    if (Vagt_nr != 0 && var < 1)
      {
      // Skriver til serial monitoren
      Serial.println("Indtast password:");
        while (Serial.available() == 0){}              // Venter på der bliver skrevet noget til enheden
         if (Serial.parseInt() == Password)            //Læser hvad der bliver skrevet. Hvis det passer med passwordet kommer man ind
          {
            if (Vagt_nr != 0 && velkomst < 1){         // Sikkere at velkomst beskeden kun kommer 1 gang
            Serial.print('\n');
            Serial.println("Velkommen til TwinHeat overvågning opsætning!");
            Serial.print('\n');
            delay(50);
            }


              // Opsætning af maks temparetur på tilbageløb
              Serial.println("Indtast, maks temparetur på tilbageløb, i °C: ");
              while (Serial.available() == 0){} 
              temp = Serial.parseInt();


              // Opsætning af diagonal længden
              Serial.println("Indtast, diagonal længden, i magasinet, i cm: ");
              while (Serial.available() == 0){} 
              Diagonal = Serial.parseInt();
  
              // Opsætning af alarm
              Serial.println("Indtast, hvornår først alarm skal lyde, ved X% fyldt: ");
              while (Serial.available() == 0){} 
              Alarm = Serial.parseInt();
              Serial.print('\n');




              // Visning af opsætning
              Serial.println("----- Opsætning -----");
              Serial.print("Maks temparetur: ");
              Serial.print(temp);                       // Henter variablen ind, og skriver det
              Serial.println(" °C");
              Serial.print("Diagonal: ");
              Serial.print(Diagonal);
              Serial.println(" cm");
              Serial.print("Alarm: ");
              Serial.print(Alarm);
              Serial.println(" %");
              Serial.print('\n');
              var++;                                  // Sikker at vi kun skal lave opsætning 1 gang
              velkomst++;                             // Der bliver lagt 1 til så, velkomsten kun kommer 1 gang


              // Giver brugen mulighed for at annulere opsætning, og starte forfra
              Serial.print('\n');
              Serial.println("Hvis opsætning ser rigtigt ud, skrev: OK");
              Serial.println("ellers skrev: SLET");
              while (Serial.available() == 0){} 
              // Hvis der bliver skrevet OK vil optætningen blive som skrevet
              if (Serial.readString() == "OK")
              {
                var = 1;
                Serial.println("Opsætningen er nu gemt. Skift over i drift mode");
              }
              else 
              {
                var = 0;  
              }
            
          }
        //Hvis koden er forkert, for brugeren det afvide
        else
          {
            Serial.print('\n');
            Serial.println("Forkert kode!");
            Serial.print('\n');
            delay(500);
          }
          
      }
    // Hvis der ikke er sat noget telefon nummer op, bliver brugeren bedt om det
    else if (Vagt_nr == 0)
      {
        Serial.println("Indtast vagt nr.:");
        while (Serial.available() == 0){}
        // Det der bliver skrevet er ligemed vagt nummert
        Vagt_nr = Serial.parseInt();
        // Viser vagt nummert
        Serial.print("Enheden er nu stat på til nr.: ");
        Serial.println(Vagt_nr);
      }      
break;


/* ===========================================================================================================
 * ----------------------------------------------  Drift mode ------------------------------------------------        
 * ===========================================================================================================
 */
case LOW: 


  //Opsætning af ultralydssensor
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);


  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);


  Tid = pulseIn(echoPin, HIGH);
  Afstand = Tid*Lydshastighed/2;
  Fyldt = (100-((Afstand/Diagonal)*100)); 


  //Opsætning af temerapursensor
  sensors.requestTemperatures();
  Celsius = Serial.println(sensors.getTempCByIndex(0));
  
  //Hvis niauvet er under det den er sat til, hvor fyldt den må være, kommer der en alarm.
  if (Fyldt < Alarm && Antal_alarm_givet < Antal_alarmer && Vagt_nr != 0){
    Serial.println("----- Alarm -----");
    Serial.println("Fyret er: ");
    Serial.print(Fyldt);
    Serial.println("% fyldt");
    Antal_alarm_givet++;
    Serial.print('\n');
    delay(Tid_mellem_alarmer);
    }


  if (Celsius < temp && Antal_alarm_givet_temp < Antal_alarmer && Vagt_nr != 0){
    Serial.println("----- Alarm -----");
    Serial.println("Tilbageløbet er: ");
    Serial.print(Celsius);
    Serial.println(" °C varmt");
    Antal_alarm_givet++;
    Serial.print('\n');
    delay(Tid_mellem_alarmer);
  }


  //Hvis der bliver skrevet vagt, kan vagt nummeret stilles om
  if (Serial.readString() == "Vagt"){
    Serial.println("Indtast vagt nr.:");
    while (Serial.available() == 0){}
    // Det der bliver skrevet er ligemed vagt nummert
    Vagt_nr = Serial.parseInt();
    // Viser vagt nummert
    Serial.print("Enheden er nu stat på til nr.: ");
    Serial.println(Vagt_nr);
    }


  //Hvis der bliver skrevet status, kan der ser parameterne
  if (Serial.readString() == "Status"){
    Serial.println("----- Status -----");
    Serial.print("Fyret er: ");
    Serial.print(Fyldt);
    Serial.println("% fyldt");
    Serial.print("Tilbageløbet er: ");
    Serial.print(Celsius);
    Serial.println("% fyldt");
    }
    
  //Når der trykkes på Resetknappen, resettes alarmerne
  if (digitalRead(Resetknap) == HIGH){
    Antal_alarm_givet = 0;
    Antal_alarm_givet_temp = 0;
    Serial.println("Alarm resettet");
    }
    
  //Hvis der er gået en alarm begynder resetknappen at fade
  if (Antal_alarm_givet_temp > 3 || Antal_alarm_givet > 3){
    int x = 5;
      for (int i = 0; i > -1; i = i + x){
      analogWrite(ledPin, i);
      if (i == 255) x = -5;            
      delay(30);
   } 
  }
break;


}
} 

Step 12: El Diagram

I dette step vises kablingen til Arduinoen

Her skal du bare følge el diagrammet. Knappen og LEDen er knappen med den indbyggede LED. Kunne ikke finde en knap med ind byggede LED i fritzing, så det må blive sådan her.

Step 13: Montering Af Kabler

I dette step vil jeg vise dig, hvordan det hele skal kables

Monter ledninger til knappen og drejekontakten. Sæt derefter resten af ledningerne ind i Arduinoen.

OBS billederne kan variere fra el diagrammet, følg derfor el diagrammet!

Step 14: Opsætning

I dette step vil jeg vise dig, hvordan du sætter enheden op

Programmet er lavet således, at det guider dig gennem hele opsætningen. Når du kommer til længden i magasinet, så er det længden fra sensor til bunden, så langt du kan trække en lige linje i luften, uden der er noget i vejen.

Der er indbygget sikkerhed i, hvor man skal skrive adgangskode. Koden er fra start 1234.

Step 15: Færdig Produkt

Tillykke!

Hvis du har fulgt alle step ned til dette, vil du nu stå med en færdig boks, der kan fortælle dig, hvornår fyret er tomt, samt give alarm ved eventuelt tilbage brand.

Som tidligere nævnt, har jeg haft problemer med mit GSM modul. Derfor er det ikke muligt at modtage SMS'er. Så snart jeg få det nye modul tilsendt, vil jeg lægge den nye kode op.

Håber du har nydt dette projekt, og har fået bygget dig en overvågningsenhed. Hvis ikke, håber jeg du har været underholdt, og fået nogle gode idéer til dit næste gør-det-selv-projekt.