ARDUINO AKILLI EV SİSTEMİ

PROJENİN ADI:  ARDUINO AKILLI EV SİSTEMİ
DANIŞMAN ÖĞRETMEN:  Aytekin TUZLALI
AMAÇ:  Robotik teknolojilerin kullanılarak iş gücünden tasarruf sağlamak, boşa harcanan elektrik enerjisi miktarını minimuma indirmek.
GEREKLİ MALZEMELER:
1  Arduino Uno R3
1  Mini Breadboard
2  LED, 2 adet 220 ohm’luk direnç
1  LDR (ışık bağımlı direnç, fotodirenç) (10 K ohm direnç)
1  DHT11 Sıcaklık ve Nem Sensörü (10 K ohm direnç)
1  Fan (DC motor ve pervane) (2N 2222 transistör ve 1 K ohm direnç)
1 FlameSensor (Alev Sensoru) yerine LM35 sıcaklık sensörü kullanılabilir, Sıcaklık 50 C dereceyi aştığında bize bildirir.
1  buzzer (zil)
1  HC-04 Hareket algılayıcı (pır) sensor
1 MQ-9 gaz sensörü (10 K ohm direnç)
LCD ekran (16x2) seri bağlantılı
Motorlar ve Arduino için 9V pil ve pil jakı
Dişi ve erkek jumper kablolar
Delikli Pertinaks
Lehim, havya, sıcak silikon tabancası ve silikon
NASIL YAPTIK:
Breadboard nasıl çalışır?
Breadboardlar işlerimizi kolaylaştırmak için yapılmış + ve – bölümleri boydan tüm bölümlere elektriği ileten, diğer bölümlerde ise satır numaraları halinde gösterilen bölümlerde yukarıda bulanan örnekte 5 hücreye elektrik göndermektedir.
Not: Analog portlar değişik değerler alabilirken dijital portlar High ve Low (0-1) değerleri alabilirler.
Not: her proje başında GND’den breadboardın eksi, 5v’tan artı kısmına bağlantı yapınız.
LDR ile ışık kontrolü:
Fotodirenç ile ışık kontörlü anlaşıldığı gibi ışık seviyesine göre ışığın yanıp/yanmamasını kontrol eden bir devredir. Fotodirençler bağlandığı analog portlarına ışığın şiddetine göre 0 ila 1024 arasında değer gönderirler.
Bağlantı Şekli: Son sayfada.
Arduinonun üzerinde bulanan GND’den breadboardımızın üzerindeki – anot (mavi olan bölüm) kısmına erkek-erkek jumper kablo yardımıyla bağlantı yapıyoruz. Led’imizin eksi ayağını breadboardumuzun eksi bölümüne bağlıyoruz. Ledimizin diğer ayağını breadboardımızın bir bölümüne yerleştiriyoruz bu ayaktan 220 ohm’luk bir direnç bağlıyoruz direncin diğer ayağından arduinomuzun 2 numaralı dijital portunu bağlıyoruz.
LDR’mizin eksi ayağını breadboardımızın eksi ayağına bağlıyoruz. Diğer ayağını led bağlantısında yaptığımız gibi direnç yardımıyla arduinomuzun A0 yazan analog portuna bağlıyoruz.

Flame Sensor ve Buzzer (Yangın sensörü) Yerine LM35 ısı sensörü kullanıldı.
Flame Sensor yani alev sensorleri genel olarak yangın alarmı gibi devrelerde kullanılmaktadır. Bizde bir yangın sensörü yapacağız. Alevi algılayan flame sensor buzzer yani zilin çalmasını sağlayacak.
Bağlantı Şekli:
Ldr bağlantımızda olduğu gibi arduinomuzun GND’sinden breadboardumuzun eksi kısmına bağlantı yapıyoruz. Bu uygulamada arduinomuzun 5v çıkışını kullanacağız bunun için arduinonun üzerinde bulanan 5V çıkışından breadboardımızın kırmızı olan artı bölümüne bağlantı yapıyoruz. Bu bağlantılar temel bağlantılar olduğu için her proje öncesi bu bağlantıları ilk olarak yapmanız tavsiye edilir.
Bu işlemleri yaptıktan sonra buzzerın eksi ayağını breadboardda bulanan eksi kısmına artı ayağını da arduinomuzun 6 numaralı dijital portuna bağlıyoruz. Flame sensor hem dijital hem de analog porta bağlanarak kullanılabilir biz analog port kullanarak devam edeceğiz. Flame sensor’ün GND ayağını breadboardumuzda ki toprak yani eksi bölümüne VCC ayağını artı bölümüne bağlıyoruz. A0 yazan ayağı ise analag portlardan A2 yazan bölüme bağlıyoruz.
DHT11 Isı ve nem sensoru ile fan kontrolü
DHT11 ısı ve nem sensoru havadaki sıcaklığı ve nemi ölçmeye yaramaktadır. Yaptığı bu ölçümleri DHT11 kütüphanesini arduinomuza yükleyerek anlayabileceğimiz şekle  getirerek sunmaktadır. DHT11 kütüphanesini http://arduinoturkiye.com/wp-content/uploads/dht11.rar linkinden indirebilirsiniz. İndirdiğiniz kütüphaneyi eklemek için Taslak>>Kütüphaneyi içe aktar>>kütüphane ekle diyerek ekleyebilir. Aynı menüden tekrar seçerek kullanabilirsiniz.
Bağlantı Şekli:          
DHT11 ısı ve nem sensorümüzün GND Ayağını eksiye VCC ayağını artıya ortada bulunan ayağını ise arduinomuzun dijital kısmındaki 7. Portuna bağlıyoruz. Fanımızın bir ayağını eksiye diğer ayağını ise dijital 3. Porta bağılyoruz.
HC-04 Haraket Algılayıcı Sensör
Arduino’nun dijital portuna bağlanarak hareket algılaması halinde 1 hareket olmaması durumunda 0 bilgisi gönderen sensördür.
Bağlantı şekli:           
Öncelikle HC-04 hareket algılayıcı sensorumuzu bağlayalım. HC-04 hareket algılayıcı sensorumuzun GND Ayağını eksiye VCC ayağını artıya ortada bulunan ayağını ise arduinomuzun dijital kısmındaki 7. Portuna bağlıyoruz.
Motor sürücü, pil, dc motoru arduinomuz ile haberleşmesini sağlamak için; Motor sürücümüzü breadboardımıza sabitliyoruz. 1. Ayağını breadboardımızın artı bölümüne, 2 ve 7. Ayakları sırası ile 8 ve 9. Dijital portlara bağlıyoruz. 3. Ve 6. Ayakları dc motorumuza 4. Ayağı arduinomuzun eksi kısmına bağlıyoruz. 5. Ve 8. Ayaklar boşta kaldı. 8. Ayağı pilden gelen artı uca 5. Ayağıda pilden gelen eksi uca bağlıyoruz.
 Yağmur Sensörü:
ARDUİNO PROGRAMI :

#define SSID "*****"         // çift tırnak işareti arasına bağlanacağınız kablosuz ağ adını girin.
#define PASS "******"     // şifrenizi girin.
const int ledPin =  13;
#define BUFFER_SIZE 128     //Tampon boyutunu belirler
char buffer[BUFFER_SIZE];   //Tamponu oluşturduk
int ledState = LOW;
const int sensorMin = 0;     // sensor minimum
const int sensorMax = 1024;  // sensor maximum
int range;
int gazValue;
int fanPin = 12; int evlamba_Led = 6;
int yagmurPin = A12; int yagmurDeger = 0;
//float sicaklik;
int yesil_led = 5; int buzzer_alarm = 4;
int pirPin = 3;  int val;
int ldrPin = A14; int ldrDeger = 0; // LDR değerini okuyacağımız değişkeni tanımlıyoruz
#include <dht11.h> // dht11 kütüphanesini ekliyoruz.
#define DHT11PIN 2 // DHT11PIN olarak Dijital 2"yi belirliyoruz.
dht11 DHT11;
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define I2C_ADDR    0x27  // Define I2C Address for the PCF8574T //---(Following are the PCF8574 pin assignments to LCD connections )
#define BACKLIGHT_PIN 3
#define En_pin  2
#define Rw_pin  1
#define Rs_pin  0
#define D4_pin  4
#define D5_pin  5
#define D6_pin  6
#define D7_pin  7
#define LED_OFF 1
#define LED_ON  0
LiquidCrystal_I2C  lcd(I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin);
void setup() {
  Serial.begin(9600); // Seri iletişimi başlatıyoruz.
  Serial3.begin(115200); //esp8266 iletişimi başlatıyoruz
  pinMode(ledPin, OUTPUT);
  Serial.println("Setup Begin!");
  delay(1000);
  sendData("AT+RST\r\n", 2000, false); // reset module
  sendData("AT+CWMODE=1\r\n", 1000, true); // configure as access point
  sendData("AT+CWLAP\r\n", 2000, true);
  connectWiFi(SSID, PASS);
  sendData("AT+CIFSR\r\n", 1000, true); // get ip address
  sendData("AT+CIPMUX=1\r\n", 1000, true); // configure for multiple connections
  sendData("AT+CIPSERVER=1,80\r\n", 1000, true);
  delay(100);
  pinMode(fanPin, OUTPUT);
  pinMode(evlamba_Led, OUTPUT);
  pinMode(yesil_led, OUTPUT);  pinMode(buzzer_alarm, OUTPUT);
  digitalWrite(yesil_led, HIGH);
  lcd.begin (16, 2); // initialize the lcd
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(LED_ON);
} // END Setup
void loop() {
  if (Serial3.available() > 0)
  {
    int ch_id, packet_len;
    char *pb;
    Serial3.readBytesUntil('\n', buffer, BUFFER_SIZE);    //Tampondaki verileri okuduk
    if (strncmp(buffer, "+IPD,", 5) == 0)
    {
      sscanf(buffer + 5, "%d,%d", &ch_id, &packet_len);
      if (packet_len > 0)
      {
        pb = buffer + 5;
        while (*pb != ':') pb++;
        pb++;
        if (strncmp(pb, "GET /?led", 8) == 0) {
          Serial.print(millis());
          Serial.print(" : ");
          Serial.println(buffer);
          Serial.print( "get led from ch :" );
          Serial.println(ch_id);
          delay(100);
          clearSerialBuffer();
          if (ledState == LOW)
            ledState = HIGH;
          else
            ledState = LOW;
          digitalWrite(ledPin, ledState);
          homepage(ch_id);
        } else if (strncmp(pb, "GET / ", 6) == 0) {
          Serial.print(millis());
          Serial.print(" : ");
          Serial.println(buffer);
          Serial.print( "get Status from ch:" );
          Serial.println(ch_id);
          delay(100);
          clearSerialBuffer();
          homepage(ch_id);
        }
      }
    }
  }
  Serial.println("AKILLI EV PROGRAMI");
  Serial.println("------------------------------");
  lcd.backlight();
  lcd.clear();
  lcd.home();
  val = digitalRead(pirPin); //read state of the PIR
  if (val == LOW) {
    Serial.println("HAREKET Yok"); //if the value read is low, there was no motion
    lcd.print("HRKT:Yok");
  }
  else {
    lcd.print("HRKT:VAR");
    Serial.println("HAREKET VAR!"); //if the value read was high, there was motion
  }                                   //PİR (HAREKET SENSÖRÜ) İLE İLGİLİ KISIM BİTTİ
  delay(10);
  int yanginSensor = analogRead(A13);
  int range = map(yanginSensor, sensorMin, sensorMax, 0, 3);
  Serial.println();
  Serial.print("YANGIN Degeri: ");
  Serial.print(yanginSensor);
  lcd.setCursor(0, 1);
  switch (range) {
    case 0:    // A fire closer than 1.5 feet away.
      Serial.print("  ** YANGIN VAR! **");
      lcd.print("ALEV:VAR");
      break;
    case 1:    // A fire between 1-3 feet away.
      Serial.print("  ** YANGIN VAR! **");
      lcd.print("ALEV:VAR");
      break;
    case 2:    // No fire detected.
      Serial.print("/  YANGIN Yok ");
      lcd.print("ALEV:Yok");
      break;
  }
  Serial.println(range);
  delay(1);  // delay between reads
  if (gazValue > 600 || range == 1 || range == 0 ) {
    digitalWrite(yesil_led, LOW);
    tone(buzzer_alarm, 400);
  }
  else {
    noTone(buzzer_alarm);
    digitalWrite(yesil_led, HIGH);
  }                           //YANGIN SENSÖRÜ İLE İLGİLİ KISIM BİTTİ
  Serial.println();
  lcd.setCursor(9, 0);
  lcd.print("ISI:");
  lcd.print((float)DHT11.temperature, 0);
  lcd.print("C");
  lcd.setCursor(9, 1);
  lcd.print("NEM:%");
  lcd.print((float)DHT11.humidity, 0);
  int chk = DHT11.read (DHT11PIN);
  Serial.print("NEM(%): ");
  Serial.print((float)DHT11.humidity, 0);
  Serial.print("  /  Cig Olusma Noktasi: ");
  Serial.println(DHT11.dewPoint(), 2);
  Serial.print("SICAKLIK(C): ");
  Serial.println((float)DHT11.temperature, 0);
  delay(2000);                  // SICAKLIK VE NEM (DHT11) İLE İLGİLİ KISIM BİTTİ
  Serial.println();
  lcd.clear();
  gazValue = analogRead(A11);
  Serial.print("CO /CH4 /LPG degeri: ");
  Serial.print(gazValue);
  lcd.setCursor(0, 0);
  delay(10);
  if (gazValue > 600)     // sensör değeri 600den az ise taramaya devam et
  { Serial.println("/   GAZ VAR!");
    lcd.print("GAZ:VAR");
  }
  else {
    Serial.println("/   GAZ yok");
    lcd.print("GAZ:Yok");
  }                         // GAZ SENSÖRÜ İLE İLGİLİ KISIM BİTTİ
  Serial.println();
  int veri = DHT11.read(DHT11PIN);
  float t = DHT11.temperature;
  lcd.setCursor(10, 1);
  if (t >= 30) {
    Serial.println("FAN Aktif");
    lcd.print("FAN: +");
    digitalWrite(fanPin, HIGH);
  }
  else
  { Serial.println("FAN calismiyor");
    lcd.print("FAN: -");
    digitalWrite(fanPin, LOW);
  }                            // FAN İLE İLGİLİ KISIM BİTTİ
  delay(10);
  Serial.println();
  yagmurDeger = analogRead(yagmurPin);
  delay(10);
  Serial.print("YAGMUR seviyesi degeri: ");
  lcd.setCursor(8, 0);
  if (yagmurDeger > 300)   {
    Serial.print(yagmurDeger);
    Serial.println("/   YAGMUR var!");
    lcd.print("YGMR:VAR");
  }
  else {
    //  digitalWrite(yagmur_led, LOW);
    Serial.print(yagmurDeger);
    Serial.println("/   YAGMUR yok");
    lcd.print("YGMR:Yok");
  }                              //YAĞMUR İLE İLGİLİ KISIM BİTTİ
  delay(10);
  Serial.println();
  ldrDeger = analogRead(ldrPin); // LDR’ den analog değeri okuyoruz
  ldrDeger = analogRead(A0); //sensörden gelen veri okunuyor  //okunan değer 600 ile 400 arasında ise ortam ışık şiddeti az seviyede
  lcd.setCursor(0, 1);
  Serial.print("ISIK Degeri: ");
  Serial.print(ldrDeger);
  if (ldrDeger > 450 && ldrDeger < 520) {
    Serial.println("/     ORTAM ISIK SIDDETI AZ");
    lcd.print("ISIK: AZ");
    digitalWrite(evlamba_Led, HIGH);
  } //okunan değer 400 den küçükse
  else if (ldrDeger > 0 && ldrDeger <= 450) {
    Serial.println("/     ORTAM AYDINLIK");
    lcd.print("AYDINLIK");
    digitalWrite(evlamba_Led, LOW);
  }
  else if (ldrDeger >= 520 ) //okunan değer 600'den büyükse
  {
    Serial.println("/    ORTAM KARANLIK");
    lcd.print("KARANLIK");
    digitalWrite(evlamba_Led, HIGH);
  }                                  // LDR (IŞIK SENSÖRÜ) İLE İLGİLİ KISIM BİTTİ
  delay(10);
  Serial.println("------------------------------");
  delay(2000);
  lcd.clear();
}
void homepage(int ch_id) {
  String Header;        //Http header' ı oluşturduk
  Header =  "HTTP/1.1 200 OK\r\n";
  Header += "Content-Type: text/html\r\n";
  Header += "Connection: close\r\n";  //Header += "Refresh: 5\r\n";
  String Content;     //Sayfamızın içeriği
  Content = "<center><h1>AKILLI EV - Merhaba DUNYA!</h1></center><hr><center><h2>Aytekin TUZLALI</h2></center><hr><h1>Led State: D";
  Content += String(ledState);
  Content += "<br><a href=\"/?led\"><input type=\"button\"value=\"LED DURUM\"></a>";
  Content += "<hr><h1>Sicaklik(C):  ";
  Content.concat(DHT11.temperature);
  Content += "<h1>Nem:%  ";
  Content.concat(DHT11.humidity);
  Header += "Content-Length: ";
  Header += (int)(Content.length());
  Header += "\r\n\r\n";
  Serial3.print("AT+CIPSEND=");   //Sayfayı belirttiğimiz AT komutu CH_ID ve içerik uzunluğu
  Serial3.print(ch_id);
  Serial3.print(",");
  Serial3.println(Header.length() + Content.length());
  delay(10);  //içeriği gönderdik
  if (Serial3.find(">")) {
    Serial3.print(Header);
    Serial3.print(Content);
    delay(10);
  }
}
void clearSerialBuffer(void) {
  while ( Serial3.available() > 0 ) {
    Serial3.read();
  }
}
String sendData(String command, const int timeout, boolean debug)
{
  String response = "";     //server' ın bize vereceği cevap
  Serial3.print(command); // server a gönderdiğimiz komut
  long int time = millis();     //timeout ın ilk değeri
  while ( (time + timeout) > millis())
  {
    while (Serial3.available())
    { // The esp has data so display its output to the serial window
      char c = Serial3.read(); // read the next character.
      response += c;
    }
  }
  if (debug)      //geribesleme istiyorsak görüntüledik
  {
    Serial.print(response);
  }
  return response;    //cevabı geri döndürdük
}
void connectWiFi(String NetworkSSID, String NetworkPASS) {
  String cmd = "AT+CWJAP=\"";
  cmd += NetworkSSID;
  cmd += "\",\"";
  cmd += NetworkPASS;
  cmd += "\"";
  sendData(cmd, 2000, true);
}
// END Loop

Hiç yorum yok:

Yorum Gönder