Arduino ile Sunucuya Veri Gönderme
10

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.

 

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Yorumlar (10)

  1. 14/10/2020

    Arduino çalışmamda, butona bastığımda , uzak bir bilgisayarın veri tabanına, bir dosya içerisine butona basma saatlerimi yazmak istiyorum.
    hangi yolu ve hangi modülleri kullanmam gerekir.
    teşekkürler

    • 15/10/2020

      Merhaba İsmail, veritabanına mı yoksa bir dosya içine mi, tam anlayamadım, veritabanı ile ilgili işlemi bu yazıdaki kodları düzenleyerek yapabilirsin. Bir dosya içerisine, bahsettiğin şekilde bir işlemi gerçekleştirmek için sunucu tarafında php kullanabilirsin. Donanım olarak arduino’nun internete bağlanması için wifi veya ethernet modülü gerekir, bunun yerine esp32 serisi bir modül almanı tavsiye ederim, esp serisi modüllerde dahili wifi ve bluetooth var fiyatı uygun ve arduino gibi kodlanabilir. Yapman gereken sadece sunucunda bir dosyaya istek göndermek. Bu dosya o anki sunucu saati ve tarihi ile bir dosya oluşturabilir. Bunu burada, yorum alanında detaylandıramıyorum, çünkü çok uzun olacak. Eğer iletişim kısmından benimle iletişime geçebilirsen sana örnek bir kod gönderebilirim.

  2. Merhaba, ben Arduino’dan topladığım mesafe verilerini zannediyorum ki SQL tabanlı olan Sistrade adlı yazılıma aktarmak istiyorum. Bu paylaştığınız yöntemle bu mümkün müdür? Teşekkür ederim.

    • 21/12/2020

      Merhaba, bu yazılım hakkında herhangi bir deneyimim yok. Fakat yazıda anlattığım yöntemle herhangi bir veritabanına kolaylıkla veri eklenebilir. Ufak tefek değişikliklerle sisteminize uygun hale getirebilirsiniz.

    • 16/06/2021

      Hocam merhaba bende arduino gsm shield ile akarsu dan aldığım debi metreyi c# aktarmak istiyorum bunun için uygun olur mu yada sizin önereceğiniz bir yol var mı?

      • 21/06/2021

        elbette uygun olur. veritabanına sensör verilerini yazıp, C# ile programda kolayca veriyi okuyabilirsiniz. arduino yerine esp32 kullanan herhangi bir kart işinizi kolaylaştıracaktır.

  3. Hocam merhaba ben Arduino RFIDden aldığım veriyi uzak bir bilgisayara yönlendirmek istiyorum bunun için önerebileceğiniz bir yol var mı ?

  4. Merhabalar

    çok fazla ardunio bilgim yok ama, şöyle bir uygulama yapmam gerekiyor.

    bir lokasyondaki sıcaklık, nem vs. gibi bir kaç sensör bilgisini mysql’e yazmam lazım. verileri mysql’e aktardıktan sonra işlemek kısmı php yaratıcılığımıza kalmış, o kısımda sorun yok.

    ama sensörden verileri nasıl aktaracağım? sensörün olduğu lokasyonda internet vs olmayacak. bunu sim kart modülü gibi modüllerle mi çözmem lazım?

  5. 21/01/2022

    Hocam Merhaba Ben cisimden yansımalı bir sensörden aldığım veriyi saydırım belirli aralıklarla webserver a göndermek istiyorum. Sizin yukarıda anlattığınız sıcaklık sensöründeki veri yerine counter mantığı ile çalışacak bir sensörden alacağım veriyi yazdırmak istiyorum. Fakat UIPEthernet için şöyle bir uyarı alıyorum ‘Geçersiz ‘1.04’ kütüphane sürümü’. 1.09 sürümünü kullandığımda ise

    ‘Ethernet.begin(mac);’ satırında hata veriyor. Bu sorunu nasıl çözebilirim bir öneriniz var mıdır?

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir