Arduino - ALA Project periode 2 Huisautomatisering (zonnescherm, licht, luchtkwaliteit, DHT,)



Beste lezers,

Naar aanleiding van een schoolproject in ons eerste jaar omtrent de 2e periode van onze opleiding Technicus Engineering Smart Technology MBO4 te IDCollege Gouda. Moesten we een gedeelte van het huis automatiseren. Dit project hebben we met drie man gemaakt gedurende een periode van 10weken, uiteindelijk hebben we het resultaat moeten pitchen voor de klas. Alles is in het Nederlands geschreven en misschien is dit wellicht een leuk project voor beginners met de Arduino om zelf te maken.

Met viendelijke groet,
Team-Wat?



/*
   -Taal: Nederlands
   -Project case: Huisvriendelijk maken voor "MS-Patiënt" Hetty.
   -Onderdeel van schoolproject ID-College ter Gouda.
   -Opleiding: Smart Technology
   -Klas: G GST1
   -Team: Team-Wat?
   -Teamleden: Karan, Mike, Niels & Sander
   -Code geschreven door Sander, Mike en Niels
   -begonnen datum: donderdag 31-10-2016
   -Datum afgerond: Maandag 23-1-2017

*/

//Alle Libraries Toevoegen
#include <Wire.h>
#include "LiquidCrystal.h"
#include <dht.h>
#include <Servo.h>


//
LiquidCrystal lcd(0);
Servo Servo1;

//Aangeven van
#define DHTTYPE DHT11
#define DHTPIN 7
int t;
int h;




// Constanten
int BUTTON_N = 2;                 //Knop om naar de volgende pagina te gaan
int down = 3;                     //Knop om de temperatuur lager te zetten
int up = 4;                       //Knop om de temperatuur te verhogen/Lamp knop
int motorPin = 5;                 //Mosfet die motor aanstuurt
int servoPin = 6;                 //Servo
//DHT = 7;                        //Temperatuur/vochtigheids sensor
int pin = 8;                      //Stof/pollen sensor
int buzzPin = 9;                  //Alarm
int PIR = 10;                     //PIR
int VerwarmingLed = 11;           //Led voor als de verwarming aan gaat
int VentilatorLed = 12;           //Led voor als de ventilator aan gaat
int Lamp = 13;                    //Led voor verlichting



// Variabelen
int buttonPushCounter = 0;   // counter for the number of button presses
int lichtPushCounter = 1;    // Teller voor het aantal drukken op de knop
int buttonState = 0;         // current state of the button
int lbuttonState = 0;        //
int lastButtonState = 0;     // previous state of the button
int lButtonState = 0;
int VraagTemp = 22;          // Ideale temperatuur
int state = HIGH;            // the current state of the output pin
int reading;                 // the current reading from the input pin
int previous = LOW;          // the previous reading from the input pin
int LVH = 35;                // ideale luchtvochtigheid
int lichtTijd = 20000;       // Tijd na hoelang het licht uit moet gaan

// Alle Millis
unsigned long previousMillis = 0;
long time = 0;
long debounce = 200;
unsigned long previousMillisPirLedUit = 0;
unsigned long previousMillisZonwering = 0;
unsigned long currentMillis;

//stofsensor setup
// Alles krijgt een naam als Integer:

/* ongeschreven lange variabelen zijn verlengde variabelen voor getallen-opslag,
  slaan 32-bits op(4 bytes), unsigned zorgt ervoor dat die geen negatieve getallen opslaat. */
unsigned long duration;                // Slaat de getallen op voor duratie voor stofsensor.
unsigned long starttime;               // Slaat de starttijd op voor stofsensor.
unsigned long sampletime_ms = 30000;   // Slaat de tijd op voor de stofsensor, wanneer die weer stofwaardes aan geeft.
unsigned long lowpulseoccupancy = 0;   // Lage golfslag van lucht-bezetting.
float ratio = 0;                       // Gemiddelde tussen lowpulseoccupancy en concentration met inbegrepen staffel.
float concentration = 0;               // Luchtconcentratie, hier worden de luchtdeeltjes mee waar genomen.


void setup() {
  // Sensoren en knoppen als input intializeren:  //
  pinMode(BUTTON_N, INPUT);                 //
  pinMode(up, INPUT);                       //
  pinMode(down, INPUT);                     //
  pinMode(PIR, INPUT);                      //
  pinMode(pin, INPUT);                      // Stofsensor wordt als INPUT geïnitialiseerd.
  // Leds als output intializeren:          //
  pinMode(VentilatorLed, OUTPUT);           //
  pinMode(VerwarmingLed, OUTPUT);           //
  pinMode(Lamp, OUTPUT);
  pinMode(buzzPin, OUTPUT);                 //
  pinMode(motorPin, OUTPUT);                //
  // Servo koppelen aan een poort
  Servo1.attach(servoPin);                  // Attach the Servo variable to a pin, servo.attach(pin, min, max)
  Servo1.write(0);
  starttime = millis();                     // Begin met het lezen van de stofsensor.


  //Zet de LCD aan en zet hoe groot deze is
  lcd.begin(16, 2);                         // 16 digits en 2 regels
  //Begin seriele communicatie              //
  Serial.begin(9600);                       //
  //Laat het opstart scherm 5 seconden zien, geeft ook de sensoren heel even de tijd om op te starten
  lcd.setCursor(6, 0);                      //
  lcd.print("Wat?");                        // Laat onze groepsnaam zien
  lcd.setCursor(2, 1);                      //
  lcd.print("-Industries-");                //
  delay(5000);                              //
  lcd.clear();                              //
  buttonPushCounter = 1;                    //Zet het aantal keer geklikt op 1 zodat je bij het begin van het menu begint

}


void loop() {                               //



  unsigned long currentMillis = millis();   //
  unsigned long currentMillis2 = millis();   //

  //Zorgt ervoor dat de loops "checkMenuKnop, meetEnRegel en menuWeergave continue uitgelezen blijven worden
  checkMenuKnop();                             //

  if (currentMillis - previousMillis >= 100) { //
    // save the last time you updated the menu
    previousMillis = currentMillis;            //

    meetEnRegel();                             //
    menuWeergave(buttonPushCounter);           //

  }
}


void menuWeergave(int menu) {                  //

  lcd.setCursor(0, 0);                         //Zorgt ervoor dat het eerste karakter in het allereerste vakje van de LCD komt


  if (menu == 1) {                             // Begint met het menu kopje "Temperatuur"
    Serial.println ("");                       //
    Serial.println ("Temperatuur");            //
    //hier komt lcd temp                       //


    float t = dht.readTemperature();           // Zorgt ervoor dat de temperatuur ook in deze loop uitgelezen kan worden

    lcd.setCursor(0, 0);                       //
    lcd.print("Temp: ");                       // Laat de huidige temperatuur zien
    lcd.print(t);                              //
    lcd.print((char)223);                      //
    lcd.print("C");                            //
    lcd.setCursor(0, 1);                       //
    lcd.print("Vraag Temp: ");                 // Laat de gevraagde temperatuur zien
    lcd.print(VraagTemp);                      //
    lcd.print((char)223);                      //
    lcd.print("C");                            //

    if (digitalRead(up) == HIGH) {             // Laat je de temperatuur omhoog instellen
      VraagTemp++;                             //
      Serial.print("NIEUWE TEMPERATUUR: =");   //
      Serial.println(VraagTemp);               //
    }                                          //
    else {                                     //
    }                                          //
    if (digitalRead(down) == HIGH) {           // Laat je de temperatuur omlaag instellen
      VraagTemp--;                             //
      Serial.print("NIEUWE TEMPERATUUR: =");   //
      Serial.println(VraagTemp);               //
    }                                          //


  }                                            //

  if (menu == 2) {                             // Kopje die laat zien hoe veel vocht er in de lucht zit

    float h = dht.readHumidity();              //

    Serial.println ("Humidity");               //
    lcd.setCursor(0, 0);                       //
    lcd.print("Vochtigheid: ");                // Laat de huidige luchtvochtigheid zien
    lcd.print(h);                              //
    lcd.print("%");                            //
    lcd.setCursor(0, 1);                       //
    lcd.print("gew. luchtv. ");                // Laat de gewenste luchtvochtigheid zien
    lcd.print(LVH);                            //
    lcd.print("%");                            //


    if (digitalRead(up) == HIGH) {                  // Laat je de luchtvochtigheid omhoog instellen
      LVH++;                                        //
      Serial.print("NIEUWE LUCHTVOCHTIGHEID: =");   //
      Serial.println(LVH);                          //
    }                                               //
    else {                                          //
    }                                               //
    if (digitalRead(down) == HIGH) {                // Laat je de luchtvochtigheid omlaag instellen
      LVH--;                                        //
      Serial.print("NIEUWE LUCHTVOCHTIGHEID: =");   //
      Serial.println(LVH);                          //
    }                                               //


  }


  if (menu == 3) {                             // Kopje waar je het licht handmatig aan/uit/automatisch kunt zetten
    Serial.println ("Verlichting");
    lbuttonState = digitalRead(up);
    if (lbuttonState != lButtonState) {
      // if the state has changed, increment the counter
      if (lbuttonState == HIGH) {
        // if the current state is HIGH then the button
        // wend from off to on:
        lichtPushCounter++;
        if (lichtPushCounter == 4) lichtPushCounter = 1;     // zorgt ervoor dat het menutje 1 loop blijft
        Serial.print("number of licht button pushes:  ");
        Serial.println(lichtPushCounter);
      }
      if (lichtPushCounter == 1) {                          // Laat het licht systeem op de PIR sensor code draaien
        lcd.setCursor(0, 1);
        lcd.print("Automatisch");
      }
      if (lichtPushCounter == 2) {                          // Zet het licht aan tot verdere instucties
        lcd.clear();
        lcd.setCursor(0, 1);
        lcd.print("Aan");
        digitalWrite(Lamp, HIGH);
      }
      if (lichtPushCounter == 3) {                          // Zet het licht uit tot verdere instucties
        lcd.setCursor(0, 1);
        lcd.print("Uit");
        digitalWrite(Lamp, LOW);
      }
    }


    lcd.setCursor(0, 0);
    lcd.print("Verlichting");
    lcd.setCursor(0, 0);                                                                        //
  }                                                                         //
  if (menu == 4) {                                                          // Kopje waar je kunt zien wat de concentratie stof in de lucht is
    Serial.println ("Luchtkwaliteit");                                      // Bij dit kopje kun je niets aanpassen

    lcd.print("Luchtkwaliteit");                                            //
    lcd.setCursor(0, 1);                                                    //
    lcd.print(concentration);                                               //
  }                                                                         //
  if (menu == 5) {                                                          // Laat zien of er beweging is gedetecteerd in de kamer
    Serial.println ("Beweging");                                            //
    if (digitalRead(PIR) == HIGH) {
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Beweging");
      lcd.setCursor(0, 1);
      lcd.print("gedetecteerd");
    }
    else {
      lcd.clear();
      lcd.setCursor(1, 0);
      lcd.print("Geen beweging");
      lcd.setCursor(0, 1);
      lcd.print("gedetecteerd");
    }
    //
  }                                                                         //
  if (menu == 6) {                                                          //Laat de tijd zien die ingesteld is om het licht uit te laten gaan
    Serial.println("licht uit na: ");
    Serial.println(lichtTijd);
    lcd.print("Licht uit na:");
    lcd.setCursor(0, 1);
    lcd.print(lichtTijd / 1000);
    lcd.print(" seconden");

    if (digitalRead(up) == HIGH ) {                                        // Laat je de tijd omhoog instellen
      lichtTijd += 1000;
    }
    if (digitalRead(down) == HIGH ) {                                      // Laat je de tijd omlaag instellen
      lichtTijd -= 1000;
    }

  }

}


void meetEnRegel() {                                                        //Alle stukken code die constant uitgelezen moeten worden
  //Temparatuur regeling                                                    //
  float h = dht.readHumidity();                                             //
  float t = dht.readTemperature();                                          //



  if (t <= VraagTemp - 2) {                                                 //Kijkt of de temperatuur onder de vraagtemperatuur zit en past dit wanneer nodig aan
    digitalWrite(11, HIGH);
    digitalWrite(12, LOW);
    Serial.print("het is onder de ");
    Serial.print(VraagTemp - 2);                                            //Zorgt ervoor dat de temperatuur niet precies hoeft te kloppen, is dus duurzamer want de verwarming/ventilator zijn niet de hele tijd elkaar aan het afwisselen
    Serial.print(" graden : de verwarming gaat aan"); //
  }
  else {
    digitalWrite(11, LOW);
  }
  if (t >= VraagTemp + 2) {                                                 //Kijkt of de temperatuur boven de vraagtemperatuur zit en past dit wanneer nodig aan
    digitalWrite(11, LOW);
    digitalWrite(12, HIGH);
    Serial.print("het is boven de ");
    Serial.print(VraagTemp + 2);                                            //Zorgt ervoor dat de temperatuur niet precies hoeft te kloppen, is dus duurzamer want de verwarming/ventilator zijn niet de hele tijd elkaar aan het afwisselen
    Serial.print(" graden : de ventilator gaat aan");
  }
  else {
    digitalWrite(12, LOW);
  }

  Serial.println();
  Serial.print("LDR read: ");
  Serial.print(analogRead(0));

 unsigned long currentMillis = millis();

  //Stofsensor
  duration = pulseIn(pin, LOW);                    // Leest de golf (als hoog of laag) op een pin van de stofsensor, in dit geval is die laag.
  lowpulseoccupancy = lowpulseoccupancy + duration; // Lage golf-bezetting is gelijk aan age golf-bezetting + duratie.

  if ((millis() - starttime) > sampletime_ms)
  {
    ratio = lowpulseoccupancy/(sampletime_ms*10.0);                   // Gemiddelde is gelijk aan de lage golfslag gedeeld door de sensorwaarnemingstijdsduur x 10.
    concentration = 1.1 * pow(ratio, 3) - 3.8 * pow(ratio, 2) + 520 * ratio + 0.62; // Gebruik van de datasheet/specsheet grafiek. "pow rekent een getal-waarde om naar een kracht!"
    Serial.print("LageGolfslag Bezetting: ");                         // Serieel printen
    Serial.println(lowpulseoccupancy);                                // De waarde die in de serieele monitor wordt uitgelezen.
    Serial.print ("Gemiddelde: ");
    Serial.println(ratio);
    Serial.print("Concentratie: ");
    Serial.println(concentration);
    lowpulseoccupancy = 0;                                            // Waarde van lage golf-bezetting wordt weer op 0 gezet.
    starttime = millis();                                             // Begin tijd wordt in millis weergegeven.

    if (ratio > 2.20) {

      // Speelt de toonhoogte:
      tone(buzzPin, 1000, 2000);                         // Pieper/buzzer piept of 1000Hz voor 2 seconden.
      Serial.println("Pieper: AAN voor 2 seconden");     // Piep wordt in serieele monitor aangegeven.
      // DC motor snelheid is 220(kan van 0 t/m 255)
      analogWrite(motorPin, 255);                        // De DC-motor gaat aan en wordt analogisch aangeschreven, omdat je snelheid moet bepalen.
      Serial.println("DC motor: AAN");                   // In de serieele monitor wordt aangegeven dat de DC motor draait.
    }
    if (ratio <= 2.19) {
      analogWrite(motorPin, 0);           // DC motor gaat analogisch uit.
      Serial.println("DC motor: UIT");    // "DC motor gaat uit" in serieele monitor
    }
  }
  //PIR Sensor
  unsigned long currentMillis2 = millis();                       //Dit stukje leest de PIR sensor uit, en zet wanneer nodig het licht aan
  if (lichtPushCounter == 1) {                                   //Laat dit stukje alleen afspelen als het licht op automatisch staat
    if (digitalRead(PIR) == HIGH) {
      Serial.println();
      Serial.println("Beweging gedetecteerd");
      Serial.println("-------------------------");
      Serial.println("Het Lamp Gaat/staat aan");
      digitalWrite(Lamp, HIGH);                                  //Zet het licht aan wanneer er beweging is gedetecteerd
      previousMillisPirLedUit = currentMillis;
    }
    else {
      Serial.println();
      Serial.println("Geen beweging gedetecteerd: het Lamp staat uit of gaat over enkele minuten Uit");  //Zet het licht na een bepaalde tijd uit
      if (currentMillis2 - previousMillisPirLedUit >= lichtTijd) {

        digitalWrite(Lamp, LOW);                                 //Zet het licht uit wanneer er een bepaalde tijd geen beweging is gedetecteerd

      }
    }
  }

  if (lichtTijd == 32000) {                                      //Zorgt ervoor dat je niet in de min kunt gaan met het instellen van het licht of boven de 32000 komt wat de maximum delay waarde van de arduino is
    lichtTijd = 0;
  }
  if (lichtTijd == -1000) {
    lichtTijd = 31000;
  }

  if (digitalRead(Lamp) == LOW) {
    Serial.println();
    Serial.println("Het Licht staat uit");
  }

  //Zonwering
  if (analogRead(0) > 500 ) {                                                    //Leest de lichtsterkte
    Servo1.write(110);                                                           //Doet het zonnescherm dicht
    Serial.println("Zonwering klapt uit");

    previousMillisZonwering = currentMillis;
  }
  if (currentMillis - previousMillisZonwering >= 8000) {                         //Wacht 8 seconden na het verdwijnen van genoeg licht tot het zonnescherm weer omhoog gaat

    Servo1.write(0);                                                             //Zet het zonnescherm dicht
  }

  //Luchtvochtigheid
  if (h <= LVH - 5) {
    Serial.println("luchtbevochtiger aan");                                      //Zet luchtbevochtiger aan wanneer het zoveel % onder de gewenste waarde zit
  }
  if (h >= LVH + 5) {
    Serial.println("Lucht-ontvochtiger aan");                                    //Zet lucht-ontvochtiger aan wanneer het zovel % boven de gewenste waarde zit
  }
}

void checkMenuKnop() {


  // read the pushbutton input pin:
  buttonState = digitalRead(BUTTON_N);

  // compare the buttonState to its previous state
  if (buttonState != lastButtonState) {
    // if the state has changed, increment the counter
    if (buttonState == HIGH) {
      // if the current state is HIGH then the button
      // wend from off to on:
      buttonPushCounter++;
      if (buttonPushCounter == 7) buttonPushCounter = 1;
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
      lcd.clear();
    } else {
      // if the current state is LOW then the button
      // went from on to off:
      Serial.println("off");
    }

    // Delay a little bit to avoid bouncing
    delay(50);
  }
  // save the current state as the last state,
  //for next time through the loop
  lastButtonState = buttonState;

}







Geen opmerkingen:

Een reactie posten