30 Aralık 2015 Çarşamba

C'DE BASAMAK HESABI

#include <stdio.h>
#include <stdlib.h>

int main(){
int number, digits, checksum;
printf("Print '0' to exit!!!\n\n");
while (1){
digits = 0;
checksum = 0;
printf("Enter the number : ");
scanf("%d", &number);

if (number == 0){
digits = 1;
printf("Number of digits : %d \n", digits);
printf("Sum of digits : %d \n", checksum);
system("pause");
return 0;
}
else{
number = abs(number);
while (number > 0){
checksum = checksum + (number % 10);
number = number / 10;
digits++;
}
printf("Number of digits : %d \n", digits);
printf("Sum of digits : %d \n", checksum);
}
}
}

C'DE KOMBİNASYON HESAPLAMA

#include <stdio.h>

int factorial(int number){
if (number < 2){
return 1;
}
return number * factorial(number - 1);
}

int main()
{
int n, r, result;
printf("Print any negative number to exit!!!\n\n");

while (1){
printf("Enter N : ");
scanf("%d", &n);
if (n < 0){
break;
}
printf("Enter R : ");
scanf("%d", &r);
if(r < 0){
break;
}

else if(n < r){
printf("N can't less than R ! Enter new and correct numbers : \n");
}

else{
result = factorial(n) / (factorial(r) * factorial(n - r));
printf("C(%d,%d) = %d\n", n, r, result);
}
}
}

C'DE PERMÜTASYON HESAPLAMA

#include <stdio.h>

int factorial(int number){
if (number < 2){
return 1;
}
return number * factorial(number - 1);
}

int main()
{
int n, r, result;
printf("Print any negative number to exit!!!\n\n");

while (1){
  printf("Enter N : ");
scanf("%d", &n);
if (n < 0){
break;
}
printf("Enter R : ");
scanf("%d", &r);
if(r < 0){
break;
}

else if(n < r){
printf("N can't less than R ! Enter new and correct numbers : \n");
}

  else{
result = factorial(x) / factorial(x - y);
printf("P(%d,%d) = %d\n", x, y, result);
}
}
}

26 Aralık 2015 Cumartesi

PROC DOSYASIYLA METNİ TERS ÇEVİRME

PROC DOSYASIYLA METNİ TERS ÇEVİRME





reverseString.c Kodları

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/slab.h>


static char *string;
static char *reversedString=NULL;
static int i,j;
static int temp=0;

module_param(string, charp, 0000);

static void reverser(char *string)
{
for(i = 0; string[i] != '\0'; i++);
   {
      temp = i-1;
      j = i-1;
   }

reversedString = kmalloc((temp + 1) * sizeof (char), GFP_KERNEL);
for(i = 0; i <= temp; i++)
   {
      reversedString[i] = string[j];    
      j--;
   }
}

static int show(struct seq_file *m, void *v){
  seq_printf(m, "Bu proc dosyasi ile metni ters cevirebilirsiniz\n");
  return 0;
}

static int proc_open(struct inode *inode, struct  file *file){
  return single_open(file, show, NULL);
}

static const struct file_operations proc_fops = {
  .owner = THIS_MODULE,
  .open = proc_open,
  .read = seq_read,
  .llseek = seq_lseek,
  .release = single_release,
};

int init_module(void){
  printk(KERN_INFO "Proc dosyasi yuklendi.\n");
  printk(KERN_INFO "Orjinal metin : %s\n",string);
  reverser(string);
  printk(KERN_INFO "Ters cevrilmis metin : %s\n",reversedString);
  proc_create("reverseString", 0, NULL, &proc_fops);
  return 0;
}

void cleanup_module(void){
  remove_proc_entry("reverseString", NULL);
  printk(KERN_WARNING "Proc dosyasi silindi.\n");
}

MODULE_LICENSE("GPL");

Makefile Kodları

obj-m += reverseString.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

24 Aralık 2015 Perşembe

N. FIBONACCI SAYISINI PROC YARDIMIYLA HESAPLAMA

N. FIBONACCI SAYISINI PROC YARDIMIYLA HESAPLAMA

EXPORT_SYMBOL() fonksiyonu, içindeki fonksiyonu diğer modullerin kullanabilmesi için ihraç eder.

seq_printf() fonksiyonu, “cat” komutu çalıştırıldığında bize “proc” dosyası içindeki bilgiyi verir.

single_open() fonksiyonu, “proc” dosyasını açar.

static const struct file_operations proc_fops = {
.owner = THIS_MODULE,
.open = proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
}; ,“Proc” dosyası için dosya işlemlerinde kullanılacak fonksiyonları yeniden düzenleme/isimlendirme kısmı.

proc_create() fonksiyonu, “proc” dosyası oluşturur.

remove_proc_entry() fonksiyonu, “proc” dosyasını siler.

static int a değişkeni, modülün kernele yüklenmesi sırasında terminalden verdiğimiz parametreyi tutar.

module_param() fonksiyonu, modülün a tamsayısı için gerekli olan parametreleri alır.

extern int ...(...) ihraç(export) edilen fonksiyonu kullanmamızı sağlar.

module02 üzerinden alınan “a” değişkeni “extern int” yardımıyla module01 üzerindeki fonksiyonla işlenip, module02’deki “printk” fonksiyonu ile “kernel”e bilgi amaçlı (KERN_INFO) yazdırılmıştır.





Kod yazımı bittikten sonra Makefile dosyasının içine derlenmesi istenilen dosyalar eklenir.


Oluşturduğumuz module01.c ve module02.c dosyalarını make komutu yardımıyla derleme işlemi yapılır. Bu işlem yapıldıktan sonra kernel’a yüklenebilecek .ko dosyaları oluşturulmuş olur.


Bu işlemler yapıldıktan sonra oluşturulan .ko dosyaları sırasıyla insmod module01.ko ve insmod module02.ko yazarak dosyalar kernel’a yüklenir.Yüklenen dosyaların çıktılarını ekranda görebilmek için resimde görüldüğü gibi dmesg | tail -1 yazarak ekran çıktıları görülür.


Yukarıdaki resimde 9. indisli Fibonacci sayısının çıktısı log dosyasından görüntülenmiştir.Ardından ise 10. indisli Fibonacci sayisi doğru bir şekilde görüntülenmiştir.


Ardından kerneldan bu modulleri silmek için sırasıyla rmmod module01 ve rmmod module02 yazılır.



NOT: Fibonacci sayilarinin 0. indisli değeri 0 kabul edilmiştir.

module01.c Kodları

#include<linux/module.h>
#include<linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>

static int fibonacci(int n){
if ( n == 0 )
return 0;
else if ( n == 1 )
return 1;
else
return ( fibonacci(n-1) + fibonacci(n-2) );


EXPORT_SYMBOL(fibonacci);

static int show(struct seq_file *m, void *v){
seq_printf(m, "Hello proc!\n");
return 0;
}

static int proc_open(struct inode *inode, struct  file *file){
return single_open(file, show, NULL);
}

static const struct file_operations hello_proc_fops = {
.owner = THIS_MODULE,
.open = proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};

int init_module(void){
proc_create("modul-02-proc", 0, NULL, &hello_proc_fops);
return 0;
}

void cleanup_module(void){
remove_proc_entry("modul-02-proc", NULL);
printk(KERN_WARNING "proc entry removed");
}

module02.c Kodları 

#include <linux/init.h>
#include <linux/module.h> 
#include <linux/moduleparam.h>
#include<linux/kernel.h>

static int a;
module_param(a, int, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
extern  int fibonacci(int);

int init_module(void)
{
printk(KERN_INFO "%d",fibonacci(a));
return 0; 
}

void cleanup_module(void){ 
printk(KERN_WARNING "Goodbye cruel world"); 
}

Makefile Kodları 

obj-m += module01.o
obj-m += module02.o

all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean



18 Aralık 2015 Cuma

ARDUINO İLE AKILLI EV SİSTEMLERİ PROTOTİPİ

 
Şekil 1 – Verici (Transmitter) ve Alıcı (Receiver) Devrelerinin Fritzing Şeması

Şekil 2.1 – Verici (Transmitter) Devresi

Şekil 2.2 – Alıcı (Receiver) Devresi

Şekil 3.1 - Kart Okutulmadan Önceki Hali

Şekil 3.2 - Kart İlk Kez Okutulduktan Sonraki Hali

Şekil 3.3 - Kart İkinci Kez Okutulduktan Sonraki Hali
  

Proje Amacı :

Yapılan bu projede amaç bir akıllı ev sistemi prototipi yapmak. Şöyle ki; eve giren kişilerin üzerinde taşıdığı kart aracılığıyla RFID tarafından tanınan kişiler, eve girdiğinde evdeki elektronik cihazlar çalışacak. Evde kalan olmadığında bu sistem; evde çalışması gereksiz olan elektronik cihazları otomatik olarak kapatarak, tasarruf sağlayacak. Biz, bu projede elektronik parça maliyetinden dolayı LED lamba yaktık. LED lamba yerine amaçlara veya ihtiyaçlara yönelik araçlar da kullanılabilir, kişiselleştirilebilir. Örneğin; kişi eve geldiğinde lambaların açılmasının yanı sıra kahve makinesinin ona kahve hazırlamasını, evin sıcaklığının arttırılmasını, kombinin çalışmasını isteyebilir. Bu da daha çok cihazın birbiriyle haberleşmesini sağlamak ile olacaktır.

Akıllı ev sistemlerinin çok basit bir prototipini oluşturduk :

Yakılan LED lamba aslında kapıdan giren kişinin evinde olması gereken şeyleri simgeliyor. Kartın okunmasıyla lambanın yanması sistemlerin açılması, kartın tekrar okunmasıyla lambanın sönmesi sistemlerin kapanmasını simgeliyor. Eve girerken cihazların çalıştırılmasına, çıkarken de kapatılmasına benzetebiliriz. Kart okuma sistemi ile otomatikleştirilen işler ile zamandan tasarruf edilebilir. Ayrıca kartların unique(eşsiz) seri numaralarına göre yetkilendirme yapılabilir ve bununla beraber kartların çalıştıracağı sistemler ayarlanabilir. Kablosuz iletişim modülleri ile de veri akışı sağlanıp, gerektiği yerde tercihe bağlı olarak telefonunuza uyarı mesajları gönderilebilir. Daha çok birbiriyle konuşan cihaz eklenerek istenilen akıllı ev sistemi oluşturulabilir.

Bu projede kullandığımız cihazlar ve araçlar    :   

  • [2] Arduino UNO R3
  • [2] NRF24L01
  • [1] MFRC522
  • [1] LED Lamba
  • [1] 230K Ohm Direnç
  • [2] Breadbord

Verici (Transmitter) Devresinin Arduino Kodları


#include <SPI.h>                //Serial Peripheral Interface (SPI) Master/Slave                        //ilişkisi için kullanılan kütüphane
#include <nRF24L01.h>            //NRF24L01, RF modeli için kullanılan kütüphane
#include <RF24.h>                //RF modülleri için kullanılan kütüphane
#include <RF24_config.h>            //RF modülleri için kullanılan ayar kütüphanesi
#include <MFRC522.h>            //RFID modülü için kullanılan kütüphane

#define RST_PIN 9                //RST_PIN tanımlaması
#define SS_PIN 10                //SS_PIN tanımlaması

String theMessage;                //Mesajın tutulacağı değişkenin tanımlanması
byte readCard[16];                //Kartın seri numarasını tutacak dizi
int successRead;                //Kartın okunması durumu
int msg[1];                    //Sonlandırma bilgisi için kullanacağımız dizi

RF24 radio(3,5);                //RF24 objesi “radio”nun tanımlanması                            //RFID pinlerimizle çakıştığı için (SPI pinleri                             //[3-5])
MFRC522 mfrc522(SS_PIN, RST_PIN);        //MFRC522 objesi “mfrc522”nin tanımlanması    //(SPI pinleri [RST_PIN(9) - SS_PIN(10)])
MFRC522::MIFARE_Key key;           
const uint64_t pipe = 0xE8E8F0F0E1LL;    //NRF modülleri arasında iletişimin sağlanacağı                        //kanalın tanımlanması

void setup(void){
Serial.begin(9600);            //Seri Haberleşmenin 9600 frekans ile başlatılması                        //saniyede 9600 bit gönderilir
SPI.begin();                //SPI’nın aktif hale getirilmesi
mfrc522.PCD_Init();            //Kartları başlatma
Serial.println("RFID KART KAYIT UYGULAMASI");    //Ekrana verilen mesajlar
Serial.println("--------------------------");
Serial.println("Lutfen 1 numarali karti okutun");
Serial.println();
radio.begin();                //NRF’nin aktif hale getirilmesi
radio.openWritingPipe(pipe);        //Göndericinin kanala ayarlanması
}
  
void loop(void){
do{
successRead = getID();    //Okuma başarılı olana kadar getID fonksiyonunun //çağırılması
}while (!successRead);

theMessage = *readCard;        //Kartın seri numarasının değişkene atanması
int messageSize = theMessage.length();    //Mesaj uzunluğunun alınması
for (int i = 0; i < messageSize; i++) {    //Mesaj gönderme döngüsü :
int charToSend[1];        //Gönderilecek karakterler için dizi tanımlanması
charToSend[0] = theMessage.charAt(i);        //Mesajdaki karakterlerin alınması
radio.write(charToSend,1);    //Karakterlerin gönderilmesi
}
msg[0] = 2;                 //Sonlandırma değişkeninin verilmesi
radio.write(msg,1);            //Değişkenin gönderilmesi
successRead=false;            //Kart okuma durumunun kaydedilmesi
}

int getID(){
if (!mfrc522.PICC_IsNewCardPresent()){    //Yeni bir kart okunmadıysa :
return 0;           
}
if (!mfrc522.PICC_ReadCardSerial()){
return 0;
}
Serial.print("Kart UID'si: ");        //Kartın seri numarasının alınma döngüsü :
for (int i = 0; i < mfrc522.uid.size; i++){
readCard[i] = mfrc522.uid.uidByte[i];    //Kartın seri numarasının BYTE – BYTE //okunup,atanması
Serial.print(readCard[i], HEX);    //Kartın seri numarasının HEXADECIMAL //olarak ekrana verilmesi
}
Serial.println("");
mfrc522.PICC_HaltA();        //Kart okumanın durdurulması
return 1;                //Sonucun döndürülmesi
}

Alıcı (Receiver) Devresinin Arduino Kodları

#include <SPI.h>                //Serial Peripheral Interface (SPI) Master/Slave                        // ilişkisi için kullanılan kütüphane
#include <nRF24L01.h>            //NRF24L01, RF modeli için kullanılan kütüphane
#include <RF24.h>                //RF modülleri için kullanılan kütüphane

int msg[1];                    //Sonlandırma bilgisi için kullanacağımız dizi
RF24 radio(9,10);                    //RF24 objesi “radio”nun tanımlanması                     //(SPI pinleri [9-10])
const uint64_t pipe = 0xE8E8F0F0E1LL;        //NRF modülleri arasında iletişimin sağlanacağı    //kanalın tanımlanması
String theMessage = "";                //Mesajın tutulacağı değişkenin tanımlanması
byte readCard[16];                //Kartın seri numarasını tutacak dizi
bool yaniyor=false;                //LED’in yanma durumu için bayrak                                //tanımlanması

void setup(void){
Serial.begin(9600);            //Seri Haberleşmenin 9600 frekans ile başlatılması                        //saniyede 9600 bit gönderilir
radio.begin();                //NRF’nin aktif hale getirilmesi
radio.openReadingPipe(1,pipe);        //Alıcının kanala ayarlanması
radio.startListening();            //Diğer cihazın dinlenmesi
pinMode(LED1, OUTPUT);        //LED için sinyal gönderilmesi
}

void loop(void){
if (radio.available()){            //Veri gönderilmeye hazırsa :
bool done=false;   
while (!done){       
done = radio.read(msg, 1);    //Verinin okunması
char theChar = msg[0];    //Gönderilen karakterlerin değişkende //tutulması
if (msg[0] != 2){        //Sonlandırma değişkeni gelmemişse :
theMessage += theChar;    //Gönderilen karakterlerin string değişkenine eklenmesi
}

else {
Serial.println(theMessage);    //Gelen mesajın ekrana verilmesi
theMessage="";            //Mesajın sıfırlanması
if(!yaniyor){            //LED yanmıyorsa :
digitalWrite(3,HIGH);    //LED’e elektrik verilmesi
yaniyor=true;        //LED’in durumunun kaydedilmesi
}
else{                //LED yanıyorsa :
yaniyor=false;        //LED’in durumunun kaydedilmesi
digitalWrite(3,LOW);    //LED’in söndürülmesi
}
Serial.println(msg[0]);    //Diğer NRF modülünden gelen //bitirme karakterinin ekrana //verilmesi
}
}
}
}