Küresel ısınma dünyamızın iklimini her geçen gün daha kötü etkiliyor. Ülkeler küresel ısınmanın etkilerini azaltmak için birçok tedbiri devreye sokuyor ve anlaşmalar imzalıyorlar. Yenilenebilir enerji kaynaklarının kullanılması ve enerjinin verimli kullanılması fabrikalardan evimizin odalarına kadar her yerde dikkat edilmesi gereken bir konudur. Şehirlerde yol ve park aydınlatmalarının insan hatasından dolayı açık kalması, yüksek enerji tüketen aydınlatma araçlarının kullanılması gibi birçok sebep enerji verimliliğini düşürmektedir. Ortamın ışık, sıcaklık ve nem değerlerini ölçerek sadece gerek duyulduğunda ve doğru miktarlarda kullanılmasını sağlayan birçok elektronik ve dijital sistem mühendisler tarafından geliştirilmekte ve programlanmaktadır.
Bu projede Picobricks’teki ışık sensörünü kullanarak gün ışığına göre ayarlanan bir saat alarmı hazırlayacağız.
Proje Detayları ve Algoritma
Bu projede basit bir alarm uygulaması yapacağız. Tasarlayacağımız alarm sistemi sabah olduğunda otomatik olarak çalacak şekilde kurgulanmıştır. Bunun için projede LDR sensör kullanacağız. Gece olduğunda OLED ekranda kullanıcıya iyi geceler mesajı görüntülenecek, sabah olduğunda ise buzzer sesi ile alarm çalacak, ekranda kullanıcıya günaydın mesajı gösterilecek ve ışıklı bildirim amacıyla RGB LED beyaz renkte yanacak. Kullanıcının alarmı durdurması için ise Picobricks’in butonuna basması gerekecek. Alarm durdurulana kadar devam eden bu işlemlerden sonra butona basıldığında buzzer ve RGB LED kapanacak ve OLED ekranda kullanıcıya iyi günler mesajı gösterilecek.
Bağlantı Şeması
Projenin MicroBlocks ile Kodlanması
İlk olarak programa OLED Graphics kütüphanesini ekle ve Pico başladığında ekranda “Good night” yazısının yazması için when started bloğunun altına OLED kategorisinden initialize i2c ve write bloklarını ekle. Eğer gündüz bu projeyi yapıyorsan programı test etmek için LDR sensörü elinle kapatman gerekecek. Bu sebeple write bloğundan sonra wait bloğu ile programı 2 saniye bekletin ve o 2 saniye içerisinde elinle LDR sensörü kapat.
Otonom aydınlatma projesinde LDR sensör değerlerini say bloğu ile okumuş ve ortam aydınlıkken 90 ve üzeri, karanlıkken 90’ın altında değerler görmüştük. Bu projede de gece ve gündüz farkını belirlemek için 90 değerini kullanabiliriz. say bloğunu kullanarak bulunduğunuz ortamdaki LDR sensör değerini görüntüleyip alarmın çaldığı değeri değiştirebilirsin.
LDR sensörden gelen değer 90’dan büyük olduğunda alarmın devreye girmesi için when bloğu kullanmalı ve koşulu belirtmeliyiz. when bloğunun altına ise kullanıcı butona basana kadar alarmın çalmaya devam edebilmesi için repeat until bloğunu kullanmalı ve Picobricks’in butonuna basılması bloğunu koşul olarak belirtmeliyiz. Belirtilen koşul sağlanana kadar içindeki blokları çalıştıran repeat until bloğunun içine ise RGB LED, buzzer ve OLED ekran kodlarını yerleştirmelisin. Ekran yazılarını, RGB LED rengini ve buzzerın çalma süresini değiştirebilirsin.
Buraya kadar yazılan kodlar, sistem başladığında ve sabah olduğunda yapılacak işlemleri yerine getiren kodlardır. Şimdi alarm çalarken butona basıldıktan sonra yapılacak işlemler için gerekli kodları yazalım.
Alarm çalarken butona basıldığında program repeat until bloğunun dışına çıkacak ve bir alt satırdaki kodları çalıştıracaktır. Bu sebeple RGB LED’in kapatılması ve ekran yazısı bloklarını repeat until bloğunun altına yazmalısın.
Kodların tamamını yazarak Start tuşuna bastığında ekranda “Good night” yazısı görüntülenecek ve eğer ortam karanlıksa aydınlık olana kadar program bekleyecektir. Eğer aydınlık bir ortamda projeyi test ediyorsan Start tuşuna bastıktan sonra 2 saniye içinde LDR sensörü elinle kapat. Daha sonra ortam aydınlandığında OLED ekran, buzzer ve RGB LED ile alarmın çalıştığını göreceksin. Alarmı butona basarak durdurabilirsin.
Projenin MicroBlocks kodlarına erişmek için tıkla.
Proje Görseli
Proje Önerisi
Projeye alarm sesi olarak bip sesi yerine melodi ekleyerek geliştirebilirsin. Ya da LDR sensör ile gün ışığına göre ayarlanan alarm yerine buton ve OLED ekran üzerinden saat bilgisinin düzenlendiği ve belirtilen saatte çalan alarm geliştirebilirsin.
Projenin Micropython Kodları
from machine import Pin, I2C, ADC, PWM
from ssd1306 import SSD1306_I2C
import utime
from ws2812 import NeoPixel
WIDTH = 128
HEIGHT = 64
sda=machine.Pin(4)
scl=machine.Pin(5)
i2c=machine.I2C(0,sda=sda, scl=scl, freq=1000000)
neo = NeoPixel(6, n=1, brightness=0.3, autowrite=False)
oled = SSD1306_I2C(128, 64, i2c)
ldr = ADC(Pin(27))
button = Pin(10,Pin.IN,Pin.PULL_DOWN)
buzzer = PWM(Pin(20, Pin.OUT))
buzzer.freq(1000)
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
oled.fill(0)
oled.show()
neo.fill(BLACK)
neo.show()
if ldr.read_u16()<4000:
wakeup = True
else:
wakeup = False
while True:
while wakeup==False:
oled.fill(0)
oled.show()
oled.text("Good night",25,32)
oled.show()
utime.sleep(1)
if ldr.read_u16()<4000:
while button.value()==0:
oled.fill(0)
oled.show()
oled.text("Good morning",15,32)
oled.show()
neo.fill(WHITE)
neo.show()
buzzer.duty_u16(6000)
utime.sleep(1)
buzzer.duty_u16(0)
utime.sleep(0.5)
wakeup=True
neo.fill(BLACK)
neo.show()
oled.fill(0)
oled.show()
oled.text("Have a nice day!",0,32)
oled.show()
if ldr.read_u16()>40000:
wakeup= False
utime.sleep(1)
Projenin Arduino C Kodları
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 6
#define NUMPIXELS 1
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#include <Wire.h>
#include "ACROBOTIC_SSD1306.h"
int button;
void setup() {
Wire.begin();
oled.init();
oled.clearDisplay();
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
pinMode(10,INPUT);
pinMode(27,INPUT);
pinMode(20,OUTPUT);
pixels.begin();
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.show();
}
void loop() {
oled.setTextXY(4,3);
oled.putString("Good night");
if (analogRead(27)<200){
while(!(button == 1)){
button=digitalRead(10);
oled.setTextXY(4,2);
oled.putString("Good morning");
pixels.setPixelColor(0, pixels.Color(255, 255, 255));
pixels.show();
tone(20,494);
}
oled.clearDisplay();
oled.setTextXY(4,1);
oled.putString("Have a nice day");
noTone(20);
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.show();
delay(10000);
}
}