Skip to content

Arduino : LM35 Sıcaklık Sensörü ile LCD li Termometre

analog veri alabileceğniz en ucuz ve kolay bulunabilen sensörlerden bir tanesi lm35 dir. lm35 ile hassas uygulamalar yapmanın doğru olmayacağını hatırlatmakta fayda var.

arduino üzerinde analog giriş farklı portları kullanabilirsiniz. bu örnekte lm35 in Vout bacağı arduino nun A0 bacağına bağlanmıştır. burada hangi pinin kullanılacağı okunan sıcaklık degerinin hesaplanmasında önemlidir.

bu örneğimiz için Sicaklik = (500.0 * Vin)/1023 formulü bizim hesaplamızda işimize yarayacaktır.

lcd olarak standart 16×2 bir lcd kullanılmaktadır. devre kullanılan potansiyemetere ve direnç srasıyla lcd parlaklık ayarını yapmak ve lcd yi korumak için kullanılmaktadır.

lm35_lcd_uno

uno r3 için kod :

int Vin;  // Arduino A0 pinin kullanilacak degisken
float Sicaklik; // Sicakik degeri float olarak belirlenir

// include the library code:
#include <LiquidCrystal.h>

// LiquidCrystal kutuphanesi ile  lcd icin kullanacagimiz pinleri set edelim.
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // lcd nin satir ve sutun bilgisi
  lcd.begin(16, 2);
  // lcd nin 1. satirina ait bilgi mesaji
  lcd.print("Sicaklik: ");
}

void loop() {
  Vin = analogRead(0);    // A0 pin değerinin okunması
  Sicaklik = (500.0 * Vin)/1023; // A0 pininden okunan degerin sicaklik degerine cevrilmesi
  // set the cursor to column 3, line 1
  lcd.setCursor(3, 1);
   // Sicaklik degerini yazirma
   lcd.print("derece "); 
  lcd.print(Sicaklik); 
       
}

circuits.io platformunu test etmk için bu uygulamayı circuits.io üzerinde yapmıştım. https://circuits.io/circuits/2424060-lm35-lcd-uno-r3/ adresinden devrenin çalışır haline ulaşabilirsiniz.

raspberry üzerinden okunan verinin python ile mysqle eklenmesi ve google chart ile bu verinin grafiğinin oluşturulması örneği

daha önceki örneklerimizde raspberry nin sistem özelliklerini okumayı ve bu verileri rrd veri tabanına kaydetmeyi ve izlemesi konusunda örnekler yapmıştık.

bu yöntemin uygun olmayacağı veya istenmeyeceği durumlar olabilir. böyle bir durum olduğunu düşünerek okuduğumuz cpu sıcaklık değerini bir veri tabanına (örneğimizde mysql olacak) kaydedelim ve dinamik bir arayüz ile veri tabanına kaydettiğimiz verileri kullanıcılarımız sunacağımız bir uygulama geliştirelim.

öncelikle veri tabanımızda hangi verilerin olacağını belirlemeli ve veritabanımızı oluşturmalıyız. raspberry pinin klasik dağıtımları üzerinde mysql, php, apache gibi sunucu yazılımları mevcut değil. bunları kurmanız gerektiğini unutmayınız. internette konu hakkında dokümanlar mevcut. uygun bir zamanda detaylı olarak onuda ekleyebiliriz. bunların olduğunu var sayarak esas konumuza dönelim.

bu örneğimizde tarih ve saat verisinin yanında sadece sıcaklık değerini tutmamız yeterli olacaktır.

sudo mysql -u root -p

CREATE DATABASE raspberry_sistem;
USE raspberry_sistem;

CREATE TABLE cpu_temp ( id INT NOT NULL AUTO_INCREMENT,
                      tarih DATE NOT NULL,
                      saat TIME NOT NULL,
                      sicaklik varchar(50),
                      PRIMARY KEY ( id ));

GRANT INSERT,SELECT ON raspberry_sistem.* TO 'raspberry'@'localhost' IDENTIFIED BY 'pi';
FLUSH PRIVILEGES;

artık veritabanımız hazır. sıra sıcaklık değeri okuyarak veri tabanına eklemeye geldi. ben örneğimi python kullanarak yapacağım. benim kullandığım python kütüphaneleri sizin raspberry üzerinde olmayabilir. kodun çalışması için eksik kütüphaneleri yüklemeniz gerekmektedir.

#sicaklik_cpu.py  dosyasi
import time
import os
import fnmatch
import MySQLdb as mdb
import logging
import time
import datetime

#cpu sicaklik degerinin okunmasi
def cpu_sicaklik_oku():
 res = os.popen('vcgencmd measure_temp').readline()
 return(res.replace("temp=","").replace("'C\n",""))


#mysql veritabanina veri eklenmesi
def insertDB(cpu_sicaklik):
  sql = "INSERT INTO cpu_temp (tarih, saat, sicaklik) VALUES ('%s', '%s', '%s' )" % (time.strftime("%Y-%m-%d"), time.strftime("%H:%M"), cpu_sicaklik)

  try:

    con = mdb.connect('localhost', 'raspberry', 'pi', 'raspberry_sistem');
    cursor = con.cursor()
    cursor.execute(sql)
    con.commit()
    con.close()

  except mdb.Error, e:
    logger.error(e)

#sicaklik okuma ve veritabanina yazma fonksiyonlarini calistiralim
cpu_sicaklik = float(cpu_sicaklik_oku())
print cpu_sicaklik
insertDB(cpu_sicaklik)

kodun oldukça sadece ve anlaşılır olduğunuz düşüyorum. temel olarak sıcaklık verisinin okunmasını ve bu verinin veri tabanına eklenmesini sağlayarak iki ayrı fonksiyon oluşturduk. ve bu fonksiyonları sırası ile çağırıyoruz.

komut satırından kodumuzu test edelim.

pi@cicek /var/www/raspberry $ sudo python sicaklik_cpu.py 
54.1

sıcaklık değeri okundu ve ekrana yazıldı ve herhangi bir hata vermedi. kontrol için eklediğimiz kodu “print cpu_sicaklik” her şey tamam olduktan sonra kaldıracağız. veri tabanına gerekli veri girişi doğru şekilde yapıldığının kontrolünü de yapalım.

mysql> select * from cpu_temp;
Empty set (0.01 sec)

mysql> select * from cpu_temp;
+----+------------+----------+----------+
| id | tarih      | saat     | sicaklik |
+----+------------+----------+----------+
|  1 | 2015-07-19 | 22:35:00 | 54.1     |
+----+------------+----------+----------+
1 row in set (0.00 sec)

kodumuz sağlıklı olarak çalışıyor. şimdi bu işlemi otomatikleştirmek için crontab içine yerleştirelim.

pi@cicek /etc $ cat /etc/crontab 

*/5 *  * * *   root    sudo python /var/www/raspberry/sicaklik_cpu.py

5 dakika bir çalışacak şekilde gerekli ilavemizi de yaptıktan sonra sıra kullanıcı arayüzüne geldi. grafik çizimi için google chart servisini line chart kullanacağım. detaylı bilgiyi https://developers.google.com/chart/interactive/docs/gallery/linechart adresinden alınabilir.

bu servis sayesinde grafik kütüphaneleri ile fazla uğraşmayacağım ve işimi kolayca halledeceğim.

<!DOCTYPE html>


	<script type="text/javascript" src="https://www.google.com/jsapi"></script>
		<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
		<script type="text/javascript">
			google.load('visualization', '1', {'packages':['corechart']});
			google.setOnLoadCallback(drawChart);

			function drawChart() {
				var json = $.ajax({
					url: 'get_json.php', 
					dataType: 'json',
					async: false
				}).responseText;
				
				var data = new google.visualization.DataTable(json);
				var options = {
					title: 'Raspberry CPU Sicaklik',
					width: 600,
					height: 400
				};
				var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
				chart.draw(data, options);

				setInterval(drawChart, 500 );
			}
		</script>  



  <div id="chart_div" style="width: 600px; height: 400px;"></div>

yukarıdaki kodu index.html olarak kaydelim ve esas işi yapacak get_json.php php dosyamızı da oluşturalım

<?php

$con = mysql_connect('localhost', 'raspberry', 'pi') or die('veri tabani baglanti hatasi');
mysql_select_db('raspberry_system', $con); 
$query = mysql_query('SELECT * FROM cpu_temp');

$table = array();
$table['cols'] = array(
    array('label' => 'saat', 'type' => 'string'),
	array('label' => 'sicaklik', 'type' => 'number')
);

$rows = array();
while($r = mysql_fetch_assoc($query)) {
    $tempa = array();
	$tempa[] = array('v' => $r['saat']);
	$tempa[] = array('v' => (int) $r['sicaklik']); 
    $rows[] = array('c' => $tempa);
}

$table['rows'] = $rows;

$jsonTable = json_encode($table);

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');

echo $jsonTable;
?>

adres satırına raspberry adresini yazdığımızda göreceğimiz grafik aşağıdaki gibi olacaktır.

raspberry pi sıcaklığının değerinin öğrenilmesi ve rrd ile izlenmesi

basit bir örnekle raspberry pi üzerinde rrdtool kullanımı  yazıda rrd kullanımına değinmiştim. yazıdaki örnekte kayseri şehrinin sıcaklık değeri kullanılmıştı.

bu yazıda ise raspberry pi nin iç sıcaklık değerlerini kullanalım. kit üzerinden sıcaklık değerini iki yöntemle öğrenebiliriz.

1. yöntem  vcgencmd komutunu kullanarak

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp
temp=56.2'C

çıktısı yukarıdan görüldüğü gibi doğrudan rrd veritabanına göndermeye uygun değil bunun için aşağıdaki şekilde çıktımızı kırpalım.

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp | cut -d "=" -f2 | cut -d "'" -f1
56.2

pi@raspberrypi ~ $ /opt/vc/bin/vcgencmd measure_temp | cut -c6-9
56.2

2. yöntem ise cpu log çıktısına bakmak.

pi@raspberrypi ~ $ cat /sys/class/thermal/thermal_zone0/temp
56224

bu yapıda tam işimize yaramayabilir. çıktıyı okunabilir bir duruma getirmemiz gerekiyor.

root@raspberrypi:~# /opt/vc/bin/vcgencmd measure_temp | sed "s/temp=\([0-9]\+\.[0-9]\+\)'C/\1/"
56.2

root@raspberrypi:~# awk '{printf("%.1f\n",$1/1e3)}' /sys/class/thermal/thermal_zone0/temp
56.2

artık raspberry nin sıcaklık değerinin nasıl öğrenileceğini bildiğimize göre örneğimizde yer alan

sicaklik ="curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'";

satırı yerine uygun kodu yazarak raspberrynin sıcaklık değerini rrd grafikleri üzerinden takip edebiliriz.

linux makinelerde cpu log dizin yapısından ufak farklılıklar olabilir ancak 2. yöntemle linux kullanan tüm cihazlarda cpu sıcaklık değeri öğrenebiliriz.

basit bir örnekle raspberry pi üzerinde rrdtool kullanımı

rrdtool un kullanma mantığının temel olarak

  • veri tabanının  oluşturulması.
  • veriyi toplayacak yazılımın gerçekleştirilmesi
  • düzenli aralıklarla bu veriyi toplanması ve veri tabanına eklenmesi
  • veri tabanına giriş yapıldıktan sonra görüntülenmesi istenilen grafikleri oluştur
  • oluşturulan grafiklerin görüntüleneceği bir arayüz  meydana getirilmesi

adımlarından oluşturuğu söylenebilir. şimdi bu adımları uygulayacağımız basit bir sıcaklık uygulaması örneği yapalım. rrd uygulamamızda kullanacağımız rdd veri tabanı yapısını oluşturalım.

#!/bin/bash
rrdtool create sicaklik_rrd.rrd --start N --step 300 \
DS:sicaklik_veri:GAUGE:600:U:U \
RRA:AVERAGE:0.5:1:12 \
RRA:AVERAGE:0.5:1:288 \
RRA:AVERAGE:0.5:12:168 \
RRA:AVERAGE:0.5:12:720 \
RRA:AVERAGE:0.5:288:365

sıra geldi veri toplama ve elde edilen veriyi veritabanına ekleyecek yazılım kısmına.

#!/bin/bash
DIZIN="/var/www/sicaklik"

sicaklik ="curl -s http://weather.noaa.gov/pub/data/observations/metar/stations/LTAU.TXT | \
grep -Po ' M?\d{2} ' |  \
sed -r   -e 's/([-0-9]*)\/[-0-9]*/\1/'";

$rrd = `/usr/bin/rrdtool update $DIZIN/sicaklik_rrd.rrd N:$sicaklik`;

ile kayseri-erkilet için sıcaklık bilgisi çekilerek rrd dosyasına ekleniyor. şimdi sıra bu işlemi otomatik olarak yaptırmaya geldi.

pi@raspberrypi $ cat /etc/crontab 
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
*/5 *  * * *   root    /var/www/sicaklik/sicaklik.sh

artık 5 dakikada bir bu script çalışarak rrd veritabanı dosyamız güncellenecek. şimdi sıra veritabanından kullanacağımız grafiklerin oluşturulmasına geldi.

#!/bin/bash
DIZIN="/var/www/sicaklik"

sicaklik_birimi="C"
sicaklik_cizgi_rengi="#0000FF"

#saat
rrdtool graph $DIZIN/sicaklik_saat.png --start -4h \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]" \
GPRINT:sicaklik_veri:LAST:"Anlik Sicaklik\:%8.2lf %s"

#gun
rrdtool graph $DIZIN/sicaklik_gun.png --start -1d \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]" \
GPRINT:sicaklik_veri:LAST:"Anlik Sicaklik\:%8.2lf %s" \
GPRINT:sicaklik_veri:MAX:"Maksimum Sicaklik\:%8.2lf %s" \
GPRINT:sicaklik_veri:MIN:"Minimum Sicaklik\:%8.2lf %s"

#hafta
rrdtool graph $DIZIN/sicaklik_hafta.png --start -1w \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

#ay
rrdtool graph $DIZIN/sicaklik_ay.png --start -1m \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

#yil
rrdtool graph $DIZIN/sicaklik_yil.png --start -1y \
DEF:sicaklik_veri=$DIZIN/sicaklik_rrd.rrd:sicaklik_veri:AVERAGE \
LINE1:sicaklik_veri$sicaklik_cizgi_rengi:"Sicaklik [deg $sicaklik_birimi]"

artık işlem neredeyse bitti. burada grafik oluşturmayı farklı bir dosya gibi gösterdim ancak sicaklik verisini çektiğimiz ve veritabanına eklediğimiz script içinde olması işimi kolaylaştıracaktır. aksi halde bu dosyası da belirli zaman aralıkları ile çalıştırmamız gerekecektir.

şimdi sıra oluşturdugumuz grafikleri göstereceğimiz html dosyasını oluşturmaya geldi.

Raspberry Pi ile RRD örneği

Last Modified: < ?=$lastmod?>

Hourly

Daily

Weekly

Monthly

Yearly



olay aslında bu kadar basit. daha dinamik bir arayüz vb istiyorsak yapımızı buna göre oluşturmamız gerekmektedir. elde edeceğimiz günlük grafik ise aşağıdaki gibi olacaktır.

sicaklik_gun

Back To Top