Arduino ile Sunucuya Veri Gönderme

Bu konumuzda arduino kullanarak sensör vb. aracılığıyla elde ettiğimiz datayı, internete bağlanarak bir veritabanına aktarıp, php tabanlı basit bir web sayfasında bu verileri işleyerek görsel bir arayüz oluşturacağız. Bir sunucuya, arduino ile veri aktarımının, basit bir örneği olacak olan bu konu ile işin mantığını anlayıp, farlı projeler geliştirebilir, diğer cihazlar ve sensörleri kullanarak internet tabanlı çalışabilen, grafik vb. yöntemlerle görselleştirebileceğiniz, veritabanı kullanabilen uygulamalar geliştirebilir ve bu konuda temel bilgiyi edinebilirsiniz.

Konuya başlamadan önce, gerekli ekipmanların ve çalışır durumda bir sunucunuzun olduğunu varsayıyorum. Sunucuyu kendi bilgisayarınızda barındırmanız için bir çok uygulama mevcut. Ücretsiz ve gelişmiş özelliklere sahip “WampServer” kullanabilir veya ücretsiz alan adı ve hosting hizmeti sağlayan bir çok alternatiften birini seçebilir ya da bu iş için ücretli seçeneklere göz atabilirsiniz. Konuyla ilgili detaylı bilgi, merak ettikleriniz ve takıldığınız durumlarda lütfen yorum yaparak soru ve sorunlarınızı bize iletin.

Arduinomuzu internete bağlamak için “ENC28J60” ethernet lan modülünü kullanacağız. Cihazı internete bağlamak için farklı modüller ve kablosuz seçenekler de değerlendirilebilir.

ENC28J60 Ethernet Shield için gerekli kütüphane (UIPEthernet) dosyalarını bu github bağlantısına tıklayıp bilgisayarınıza indirebilirsiniz.

Veritabanımıza veri göndermek için bir veri kaynağına ihtiyacımız olacak. Konumuzda DS18B20 Sıcaklık sensöründen alacağımız sıcaklık verilerini kullanacağız, siz herhangi bir modül veya projenize uygun veri kaynaklarını kullanabilirsiniz, burada amacımız en kolay şekilde veri almak ve bu verileri internete bağlanarak bir veritabanına yazmak ve bu veritabanındaki verileri bir web sayfasında görsel olarak takip etmektir. Temel niteliğinde olacak bu anlatım, geliştirilebilir, farklı araçlarla kullanılabilir.

DS18B20 sensörü için OneWire isimli kütüphaneyi kullanacağız. Bu bağlantıya tıklayıp gerekli dosyaları ve bilgiyi edinebilirsiniz.

Ethernet Modülü ve Sıcaklık Sensörünün Arduino Uno’ya Bağlanması:

Ethernet modülü bağlantısı;

SS => 10

MOSI (SI) => 11

MISO (SO) => 12

SCK => 13

Veritabanı Oluşturalım:

phpmyadmin veya benzeri bir veritabanı yönetim arayüzü ile veritabanımıza bağlanıp aşağıdaki kodu çalıştırarak gerekli tabloları oluşturalım.

					

CREATE TABLE `test`.`temperature` (

`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY COMMENT ‘ID’,
`event` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘Zaman Damgasi’,
`sensor` VARCHAR( 30 ) NOT NULL COMMENT ‘Sensor Kimligi’,
`celsius` VARCHAR( 10 ) NOT NULL COMMENT ‘Sicaklik Degeri’,
INDEX ( `event` , `sensor` )
) ENGINE = InnoDB;

Kodu çalıştırdığımızda veritabanımızda test isimli id, event, sensor, celsius alanlarından oluşan bir veritabanı oluşturulacak. Kodu kendinize göre özelleştirebilirsiniz.

 

Veritabanı Bilgileri:

Sunucumuzun anadizininde mysql.php isimli, boş bir php dosyası oluşturup aşağıdaki kodu içine ekleyelim ve gerekli alanları kendi bilgilerimize göre düzenleyelim. Bu dosya, veritabanı bağlantısı için gerekli bilgileri tutacak. Diğer dosyalar bu dosyaya ulaşıp veritabanı bilgilerini alacak.

					

<?php
$MyUsername = “kullaniciadiniz”;  // mysql kullanici adinizi yazin
$MyPassword = “parolaniz”;  // mysql parolanizi yazin
$MyHostname = “localhost”;      // mysql sunucu adresini yazin. varsayilan adres localhosttur.

$dbh = mysql_pconnect($MyHostname , $MyUsername, $MyPassword);
$selected = mysql_select_db(“test”,$dbh);
?>

 

Verileri Görüntüleme:

Sunucumuzun anadizininde index.php isimli boş bir php dosyası oluşturalım. Bu dosya, veritabanında kayıtlı verilere görsel olarak erişebilmemizi sağlayacak. Tasarımı oldukça basit olan bu dosyayı kendinize göre düzenleyebilir, farklı tasarımlar veya Chart.js gibi açık kaynak grafikler ile süsleyip güzel bir görsellik elde edebilirsiniz.

					

<?php
// MySQL Baglan
include(‘mysql.php’);
?>

<html>
<head>
<title>Arduino Veri Tablosu</title>
<style type=”text/css”>
.table_titles, .table_cells_odd, .table_cells_even {
padding-right: 20px;
padding-left: 20px;
color: #000;
}
.table_titles {
color: #FFF;
background-color: #666;
}
.table_cells_odd {
background-color: #CCC;
}
.table_cells_even {
background-color: #FAFAFA;
}
table {
border: 2px solid #333;
}
body { font-family: “Trebuchet MS”, Arial; }
</style>
</head>

<body>
<h1>Arduino Veri Tablosu</h1>
<table border=”0″ cellspacing=”0″ cellpadding=”4″>
<tr>
<td class=”table_titles”>ID</td>
<td class=”table_titles”>Tarih-Saat</td>
<td class=”table_titles”>Sensor</td>
<td class=”table_titles”>Sicaklik</td>
</tr>
<?php
// Kayitlari veritabanindan oku
$result = mysql_query(“SELECT * FROM temperature ORDER BY id ASC”);

// Satir renk gecisi
$oddrow = true;

// tum kayitlari isle
while( $row = mysql_fetch_array($result) )
{
if ($oddrow)
{
$css_class=’ class=”table_cells_odd”‘;
}
else
{
$css_class=’ class=”table_cells_even”‘;
}

$oddrow = !$oddrow;

echo ‘<tr>’;
echo ‘   <td’.$css_class.’>’.$row[“id”].'</td>’;
echo ‘   <td’.$css_class.’>’.$row[“event”].'</td>’;
echo ‘   <td’.$css_class.’>’.$row[“sensor”].'</td>’;
echo ‘   <td’.$css_class.’>’.$row[“celsius”].'</td>’;
echo ‘</tr>’;
}
?>
</table>
</body>
</html>

 

Veritabanına Veri Ekleme:

Sunucu anadizinine veriekle.php adında boş bir php dosyası oluşturalım. Bu dosya aracılığı ile GET metodu kullanarak veritabanımıza veri yazdıracağız. Aşağıdaki kodu dosyamıza kopyalayalım.

					

<?php
// MySQL baglan
include(“mysql.php”);

// get ile veri alan Sql kodu
$SQL = “INSERT INTO test.temperature (sensor ,celsius) VALUES (‘”.$_GET[“serial”].”‘, ‘”.$_GET[“temperature”].”‘)”;

// Sql kodunu calistir
mysql_query($SQL);

?>

 

GET ile Veri Gönderme:

Yukarıdaki dosyaları sunucumuzda hazırladıysak artık veri gönderimini test edebiliriz.

http://sunucuadresiniz/veriekle.php?serial=288884820500006b&temperature=20.79

burada sunucuadresiniz kısmına site adresinizi, sunucu ip adresinizi yada lokalde çalışıyorsanız localhost yazıp kendimize göre düzenliyoruz. bu bağlantıyı bir tarayıcıda açtığımızda veritabanına 288884820500006b serinumaralı sensörden 20.79 derece sıcaklık kaydı yapılmış olacak. sunucu anasayfanıza giderek, bağlantıyı çalıştırmanız sonucu oluşturulmuş yeni kaydı gözlemleyebilirsiniz.

 

Arduino İçin Gerekli Kodlar:

Yukarıdaki kısımları eksiksiz tamamladıysanız artık arduino için gerekli kodlamayı yapabiliriz.

					

#include <UIPEthernet.h> // Ethernet Kutuphanesi
#include <OneWire.h> // Sensor icin OneWire Kutuphanesi

// #define DEBUG

// **** ETHERNET ****
// Arduino Uno pin: 10 = CS, 11 = MOSI, 12 = MISO, 13 = SCK
// Ethernet MAC adresi
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };

EthernetClient client;
char server[] = “192.168.1.100”; // sunucu ip (localhost yazmayin, kod arduinoya yuklendiginde localhost arduinoyu isaret edecektir)
unsigned long PreviousMillis = 0;
unsigned long interval = 300000; // Bekleme suresi (1 dakika)
unsigned long intervalTime;

// **** Sicaklik Sensoru ****
// Sensor data pini (pin 2 olarak ayarlandi)
OneWire ds(2);

void setup() {
#ifdef DEBUG
Serial.begin(9600);
#endif

Ethernet.begin(mac);

intervalTime = millis();

#ifdef DEBUG
Serial.println(“Teknotezgah.com – Sicaklik Olcumu”);
Serial.println(“-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n”);
Serial.print(“IP Adresi : “);
Serial.println(Ethernet.localIP());
Serial.print(“Alt Ag Maskesi : “);
Serial.println(Ethernet.subnetMask());
Serial.print(“Varsayilan Ag Gecidi: “);
Serial.println(Ethernet.gatewayIP());
Serial.print(“DNS Server IP : “);
Serial.println(Ethernet.dnsServerIP());
#endif
}

void loop() {
unsigned long CurrentMillis = millis();

if ( CurrentMillis < PreviousMillis )
{
intervalTime = CurrentMillis+interval;
}

if ( CurrentMillis > intervalTime )
{
intervalTime = CurrentMillis + interval;

if (!client.connect(server, 80)) {
#ifdef DEBUG
Serial.println(“-> Baglanti Hatasi: Reset ENC!”);
#endif
Enc28J60.init(mac);
} else {
client.stop();
}

if (client.connect(server, 80))
{
#ifdef DEBUG
Serial.println(“-> Baglandi”);
#endif

client.print( “GET /veriekle.php?”);

TemperaturesToGetVariables();

client.println( ” HTTP/1.1″);
client.println( “Host: 192.168.1.100″ );
client.print(” Host: “);
client.println(server);
client.println( “Connection: close” );
client.println();
client.println();
client.stop();
}
else
{
#ifdef DEBUG
Serial.println(“–> Baglanti Hatasi !!”);
#endif

//Enc28J60.init(mac);
}
}
else
{
Ethernet.maintain();
}
}

void TemperaturesToGetVariables(void)
{
byte counter;
byte present = 0;
byte sensor_type;
byte data[12];
byte addr[8];
float celsius;
byte sensorcounter;

ds.reset_search();
sensorcounter = 1;

while ( ds.search(addr) )
{
if (sensorcounter>1) client.print(“&”);

client.print(“serial”);
client.print(sensorcounter);
client.print(“=”);

#ifdef DEBUG
Serial.print(” Sensor : “);
Serial.println(sensorcounter);
Serial.print(” Serial : “);
#endif

for( counter = 0; counter < 8; counter++)
{
if (addr[counter]<10) client.print(“0”);
client.print(String(addr[counter], HEX));
if (counter<7) client.print(“%20”);

#ifdef DEBUG
if (addr[counter]<10) Serial.print(“0″);
Serial.print(String(addr[counter], HEX));
if (counter<7) Serial.print(” “);
#endif
}

#ifdef DEBUG
Serial.println();
#endif

client.print(“&temperature”);
client.print(sensorcounter);
client.print(“=”);

// Check CRC
if (OneWire::crc8(addr, 7) != addr[7])
{
client.println(“ERROR”);
}
else
{
ds.reset();
ds.select(addr);
ds.write(0x44);

delay(750);

present = ds.reset();
ds.select(addr);
ds.write(0xBE);

for ( counter = 0; counter < 9; counter++)
{
data[counter] = ds.read();
}

int16_t raw = (data[1] << 8) | data[0];

byte cfg = (data[4] & 0x60);

if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;

celsius = (float)raw / 16.0;
client.print(celsius);

#ifdef DEBUG
Serial.print(” Temperature: “);
Serial.print(celsius);
Serial.println(” C”);
#endif
}

sensorcounter++;
}
return;
}

Kodlarda sunucu bilgilerini kendi sunucu adresiniz ile güncelleyin ve arduinoya kodu yazın. Cihazı çalıştırdığınızda belirlediğiniz aralıklarla sensör verilerini web sitenize otomatik olarak gönderilecektir.

Bu yazıdaki proje ile temel edinip birçok web tabanlı proje geliştirebilirsiniz. Konu çok uzamasın diye, belirli bir bilgi birikimine sahip olduğunuzu varsayarak yazdım. Takıldığınız noktaları yorum yazarak sorabilirsiniz. Gözümden kaçan hata, yazım yanlışı ve eksiklikler olabilir. Bu gibi sorunlarla karşılaşmanız durumunda, gerekli düzenlemeyi yapmam için, lütfen bana bildirin.

 

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir