Kategori: Arduino

Arduino SHT21 I2C Kullanımı

I2C (Inter-Integrated Circuit), seri haberleşme türlerinden senkron haberleşmeye bir örnektir. Haberleşme için SDA ve SCL olmak üzere iki hatta ihtiyaç duyulmaktadır. Genellikle kısa mesafeli ve düşük veri aktarım hızının yeterli olduğu yerlerde kullanılır.

I2C haberleşmesinde, haberleşmeyi kontrol eden master cihazı bulunur. Her haberleşmede bir tane master bulunmalıdır. Haberleşmenin sağlanabilmesi için haberleşme hattına en az bir adet slave (köle) cihaz bağlanmalıdır. Hatta bağlanan birden fazla slave cihazlardan hangisinin veri aktaracağına, master cihaz karar verir. Böylece hat sayısında bir değişiklik olmadan birden fazla cihazla haberleşme sağlanır.

Cihazlarda SDA pini arduino uno SDA pine (A4), SCL pini arduino unu da SCL(A5) pinini bağlanır. VCC: 3.3 bağlamaya dikkat edin!

Arduino IDE den sketch->Include Library ->Manage Libraries’den

sht21 yazarak Sodaq_SHT2x version 1.2.0 kurulumunu gerçekleştiriniz.

#include <Wire.h>
#include <Sodaq_SHT2x.h>


void setup()
{
  Wire.begin();
  Serial.begin(9600);
}

void loop()
{
  Serial.print("Nem(%RH): ");
  Serial.print(SHT2x.GetHumidity());
  Serial.print("     Sıcaklık(C): ");
  Serial.println(SHT2x.GetTemperature()); 
  Serial.print("     Çiğ Noktası(C): ");
  Serial.println(SHT2x.GetDewPoint());
  
  delay(1000);
}

Kaynaklar:

https://gelecegiyazanlar.turkcell.com.tr/konu/arduino/egitim/arduino-401/i2c-protokolu

ESP8266 – 01 Arduino IDE ile sketch yükleme

Merhaba;

AT komutlarının kullanılması

USB->TTL dönüştürücü ile esp8266 modülüne nodeMcu flash edeceğiz. esp8266-01 3.3 v ile çalışmaktadır. Bu yüzden tll dönüştürücünüzden modüle gelen rx 3.3v olması gerekmektedir. Eğer değilse level shitter ile bu işlemi gerçekleştirebilirsiniz. (level shıtter için 1k,2k değerinde direnç ile yapabilirsiniz)

Bağlantıyı şekilde ki gibi yapınız.

Bağlantıyı bu şekilde yaptığınızdan esp8266 reset atıyorsa, harici bir güç kaynağından beslemeniz gerekiyor.

Öncelikle flash atabilmeniz için dosyayı bilgisayarınıza indirin .nodemcu-flasher-master

ESP8266 Flash downloader çalıştırarak, bin dosyasının yine dosya içinde bin dosyasına referans veriniz.

Her türlü programlama yaparken once flsh butonuna yükleme bitinceye kadar basılı tutun, yükleme başlamadan önce de rst tuşuna bir kere basın. (flsh butonu basılı kalacak)

Yükleme %99 ulaştığında kırmızıyla işaretlediğim yazı çıktığında sorunsuz yükleme bitmiş olacak ve AT komutlarını kullanılır.

Arduino skecth attığınızda artık AT komutlarını kullanmayacağınızı hatırlatmak isterim.

Arduino Sketch Atma:

Bağlantıyı aşağıda gibi yapınız.

Yine hatırlatmak isterim, usb de gerekli gücü alamayabilir, bu yüzden dışarıdan beslemenizi tavsiye ederim. (usb ttl ile yeni güç kaynağınız da toprakları birleştirmeyi unutmayın)

Geliştirme Ortamının Hazırlanması (Arduino IDE):

File -> Preferences açınız.  Additional boards Manager alanına aşağıda ki adresi kopyalayın

http://arduino.esp8266.com/stable/package_esp8266com_index.json

Tool -> Board -> Boards Manager

Esp8266 install edin

  • Tool -> Board -> Generic Esp8266 Module
  • Tool -> Reset Method -> ck
  • Tool -> Upload Speed -> 115200
  • Tool -> Programmer -> AVR ISP

İlgili ayarlar bittikten sonra örnek Blink Sketch ini esp8266 yüklemek için:

  • flsh butonuna basın
  • rst butonuna basın (rst yerine gücü çekip tekrar verebilirsiniz) (flsh butonu basılı iken)
  • sketch i esp8266 a yükleyin
  • yükleme bittikten sonra flsh butonunu bırakabilirsiniz.
  • Mavi ışığın yanıp, söndüğünü göreceksiniz.
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
                                    // but actually the LED is on; this is because 
                                    // it is acive low on the ESP-01)
  delay(1000);                      // Wait for a second
  digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
  delay(2000);                      // Wait for two seconds (to demonstrate the active low LED)
}

error: espcomm_upload_mem failed hatası alıyorsanız, programlama yapmak için tuş kombinasyonunu doğru yapmamış olabilirsiniz.

Arduino 4’lü Röle Kontrolü – Serial String Okuma

Serial monitor kullanarak yazılan komuta göre roleleri açar, kapatır veya tersini yapar. Arduino’nun rx,tx pinlerine bluetooth bağlayarak bluetooh üzerinden işlem yapabilirsiniz.

Komutlar:

  • 2 karakter röle değeri (r1,r2,r3,r4)
  • 3 karakter yapılmak istenen değer (on:devreyi tamamlar  off:devreyi açar ch:devrenin durumunun tersini alır)

örn:r1ch

//röle pinleri
int role1 = 9; 
int role2 = 10; 
int role3 = 11; 
int role4 = 12; 

int roleXDurum = 0; //tüm roleler

char gelenKarakter = "";
String olusanKarakter = ""; 

void setup() {
  // initialize serial:
  Serial.begin(9600);
  
  pinMode(role1, OUTPUT);
  pinMode(role2, OUTPUT);
  pinMode(role3, OUTPUT);
  pinMode(role4, OUTPUT);

  digitalWrite(role1, HIGH);//ledi kapar 
  digitalWrite(role2, HIGH);//ledi kapar
  digitalWrite(role3, HIGH);//ledi kapar
  digitalWrite(role4, HIGH);//ledi kapar

  //Role durumlarını set et
  roleXDurum = 0;
}

// the loop function runs over and over again forever

void loop() { 
    if(Serial.available() > 0)
    {
      olusanKarakter = Serial.readStringUntil('\n');
      Serial.println(olusanKarakter);
    } 

    if(olusanKarakter.substring(0,2) == "r1")
    {
      String isim = "Role 1";
      Serial.println(isim + " isimli role ile islem baslatildi"); 
      
      if(olusanKarakter.substring(2,4) == "on")
      { 
        ledAc(role1,isim);
      }
      if(olusanKarakter.substring(2,5) == "off")
      {
        ledKapa(role1,isim);
      }
      if(olusanKarakter.substring(2,4) == "ch")
      {
        ledDurumDegistir(role1,isim);
      }
    }
    
    if(olusanKarakter.substring(0,2) == "r2")
    {
      String isim = "Role 2";
      Serial.println(isim + " isimli role ile islem baslatildi"); 
      
      if(olusanKarakter.substring(2,4) == "on")
      { 
        ledAc(role2,isim);
      }
      if(olusanKarakter.substring(2,5) == "off")
      {
        ledKapa(role2,isim);
      }
      if(olusanKarakter.substring(2,4) == "ch")
      {
        ledDurumDegistir(role2,isim);
      }
    }
    
    if(olusanKarakter.substring(0,2) == "r3")
    {
      String isim = "Role 3";
      Serial.println(isim + " isimli role ile islem baslatildi"); 
      
      if(olusanKarakter.substring(2,4) == "on")
      { 
        ledAc(role3,isim);
      }
      if(olusanKarakter.substring(2,5) == "off")
      {
        ledKapa(role3,isim);
      }
      if(olusanKarakter.substring(2,4) == "ch")
      {
        ledDurumDegistir(role3,isim);
      }
    }
    
    if(olusanKarakter.substring(0,2) == "r4")
    {
      String isim = "Role 4";
      Serial.println(isim + " isimli role ile islem baslatildi"); 
      
      if(olusanKarakter.substring(2,4) == "on")
      { 
        ledAc(role4,isim);
      }
      if(olusanKarakter.substring(2,5) == "off")
      {
        ledKapa(role4,isim);
      }
      if(olusanKarakter.substring(2,4) == "ch")
      {
        ledDurumDegistir(role4,isim);
      }
    }

    if(olusanKarakter.substring(0,2) == "rx")
    {
      String isim = "Tum Roleler";
      Serial.println(isim + " isimli role ile islem baslatildi"); 
      
      if(olusanKarakter.substring(2,4) == "on")
      { 
        ledAc(role1,isim);
        ledAc(role2,isim);
        ledAc(role3,isim);
        ledAc(role4,isim);
        
        roleXDurum = 1; 
      }
      if(olusanKarakter.substring(2,5) == "off")
      {
        ledKapa(role1,isim);
        ledKapa(role2,isim);
        ledKapa(role3,isim);
        ledKapa(role4,isim);

        roleXDurum = 0; 
      }
      if(olusanKarakter.substring(2,4) == "ch")
      {
        if(roleXDurum == 0)
        {
          roleXDurum = 1;
          
          ledAc(role1,isim);
          ledAc(role2,isim);
          ledAc(role3,isim);
          ledAc(role4,isim); 
        }
        else
        {
          roleXDurum = 0; 
          
          ledKapa(role1,isim);
          ledKapa(role2,isim);
          ledKapa(role3,isim);
          ledKapa(role4,isim);
        }
      }
    }
    olusanKarakter="";
}

void ledAc(int port, String isim)
{
  digitalWrite(port, LOW);//ledi açar
  Serial.println(isim + " isimli Led Yakildi");
}

void ledKapa(int port, String isim)
{
  digitalWrite(port, HIGH);//ledi kapar 
  Serial.println(isim + " isimli Led Kapatildi");
}

void ledDurumDegistir(int port, String isim)
{
  int val = digitalRead(port);
  if(val==1)
  {
    ledAc(port,isim);
  }
  else
  {
    ledKapa(port,isim);
  }
}

 

DHT-11 Sıcaklık ve Nem Sensörü (Temperature and Humidity sensor)

Tek dijital pin aracılığıyla sıcaklık ve nem verilerini sağlamaktadır.
Fakat kararlı sonuçlar alamadım.

Ölçüm aralığı:
Nem: 20 – 90%RH hassasiyet:±5%RH
Sıcaklık: 0-50 ℃ hassiyet:±2℃

Detaylı bilgi için dökümanı inceleyiniz. dht11

Arduinoda kullanmak için dht11 kütüphanesi indirin.
Arduino sketch->Include library->Manage libraries-> Library Manager->
dht sensor library 1.2.3

Devreyi aşağıda ki şekilde bağlıyoruz. Kütüphaneyle birlikte gelen örneği doğru bağlantı yapıldıysa serial monitor aracılığıyla sıcaklık ve nem bilgisi okursunuz.

Kullanılan malzemeler:
10 k direnç
dht11 sensör

elementz_dht11_bb

// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain

#include "DHT.h"

#define DHTPIN 2     // what digital pin we're connected to

// Uncomment whatever type you're using!
#define DHTTYPE DHT11   // DHT 11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors.  This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("DHTxx test!");

  dht.begin();
}

void loop() {
  // Wait a few seconds between measurements.
  delay(2000);

  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.readHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.readTemperature();
  // Read temperature as Fahrenheit (isFahrenheit = true)
  float f = dht.readTemperature(true);

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  // Compute heat index in Fahrenheit (the default)
  float hif = dht.computeHeatIndex(f, h);
  // Compute heat index in Celsius (isFahreheit = false)
  float hic = dht.computeHeatIndex(t, h, false);

  Serial.print("Humidity: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.print(hic);
  Serial.print(" *C ");
  Serial.print(hif);
  Serial.println(" *F");
}

nRF24L01 Arduino Bağlantısı

nRF24L01 haberleşme için SPI kullanmaktadır. Bu yüzden Arduino’nun (uno) SPI için ayrılmış portları 11 – 12 – 13 numaralı dijital pinlerini kullanılıyoruz.

Arduino için yazılmış içinde örnekleri bulunan kütüphaneyi buradan indirebilirsiniz. nRF24L01p

Arduino SPI Port açılımı

MOSI -> 11
MISO -> 12
SCK ->13
SS(Slave) ->10

nRF24L01 bağlayacağım Arduino Pin numaraları

CSN -> 7
CE -> 8
MOSI ->11
MISO ->12
SCK ->13
VCC -> 3.3 V
GND -> GND
IRQ ->Boşta

GND: Ground.
VCC: 3.3V.
CE: Chip (RX/TX) Enable, high active. If high, module is either sending or listening.
CSN: Chip Select Not, low active. If low, the chip responds to SPI commands. This is actually the ‘real’ chip select signal, and is easily confusing with CE which enables/disables the transceiver radio part.
SCK: SPI Shift Clock, up to 10 MHz.
MOSI: Master-Out-Slave-In, used to shift data from the microcontroller to the device.
MISO: Master-In-Slave-Out, used to shift data from the device to the microcontroller.
IRQ: Optional Interrupt Request pin. Signals RX/TX status like packet sent or received.

 

Örneği açtığınızda string -> PTX, PRX olarak 2 tane örnek mevcuttur.

TX gönderici, Rx alıcı örneğidir. Çift yönlü haberleşme yaptığından kendinize özel kodu gönderici ve alıcı olarak tek arduino da kullabilirisiniz.

Notlarım:

Channel ve RXAddress göndericide ve alıcıda aynı olması gerekiyor.
Örnek kodlar tek yönlü haberleşme için temel seviye kodlardır

Alıcı Kodları:

#include <SPI.h>
#include <nRF24L01p.h>

nRF24L01p receiver(7,8);//CSN,CE

void setup(){
  delay(150);
  Serial.begin(9600);
  Serial.println("RX baglanti saglandi"); 
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  receiver.channel(90);
  receiver.RXaddress("Artur");
  receiver.init();
}

String message;

void loop(){ 
  if(receiver.available()){
    receiver.read();
    receiver.rxPL(message);
    if(message.length()>0)
    {
      Serial.println(message);
      message="";
    }
  }
}

 Gönderici:

#include <SPI.h>
#include <nRF24L01p.h>

nRF24L01p transmitter(7,8);//CSN,CE

void setup(){
  delay(150);
  Serial.begin(9600);
  Serial.println("TX baglanti saglandi"); 
  SPI.begin();
  SPI.setBitOrder(MSBFIRST);
  transmitter.channel(90);
  transmitter.TXaddress("Artur");
  transmitter.init();
}

String message;

void loop(){
  if(Serial.available()>0){
    char character=Serial.read();
    //Serial.println(character);
    if(character=='g'){
      
      transmitter.txPL(message);
      boolean  state = transmitter.send(SLOW);
      Serial.print("Mesaj : '");
      Serial.print(message);
      if(state==true)
        Serial.println("' gonderildi");
      else
        Serial.println("' gonderilemedi");
        
      message="";
    }else{
      message+=character;
    }
  }
}

 

Kaynaklar:
nRF24L01 ait ek dökümantasyon nrf24l01_tutorial_0
Tutorial: Ultra Low Cost 2.4 GHz Wireless Transceiver with the FRDM Board
http://www.arduist.com/arduino-ile-nrf24l01-kullanimi/

Arduino Bootlader Yükleme Atmega328p-PU

Atmega328p-pu entegresine arduino kodlarını çalıştırabilmemiz için bootloader yüklü olması gerekmektedirç

Bu işlem için elimizde bulunan arduino uno’ya Arduino ISP kodlarını yükleyerek, entegremizi SPI üzerinden bootloader i yüklemesini gerçekleştireceğiz.

Malzeme Listesi:

  • Atmega328p entegre
  • 2 adet 22pF kondansatör
  • 1 adet 16Mhz Kristal
  • 1 adet 10 k Direç
  • 1 adet led

Arduino IDE’sinden;

  • File > Examples > ArduinoISP seçin
  • Tools > Board > Arduino Uno
  • Tools > Serial Port (arduionun bağlı bulunduğu portu seçin
  • Tools > Programmer > AVRISP mkII seçimlerini yapın..
  • Upload yapıp sketch’imizi yüklüyoruz.

ArduinoISP Sketch’ni bulamadıysanız buradan indirebilirsiniz. ArduinoISP

Şekilde ki gibi bağlantılarını gerçekleştiriyoruz.

bootloader2

Atmega328p entegremizin datasheetyile resimde ki gibidir.

arduinoDatasheet

Entegrenin üstüne sticker bağlantıda ki stickeri yapıştırarak bağlantıları rahat şekilde yapabilirsiniz.. arduino-atmega-sticker

Bağlantılar tamamlandıktan sonra bootloader yüklemek için;

Yine arduino IDEmizden;

  • Tools > Board > Arduino Nano w/ ATmega328
  • Tools > Programmer -> Arduino as ISP

Seçiyoruz, ve Tools > Burn Bootloader diyoruz. Sorun olmadığı takdirde yükleme başarıyla sonuçlanacaktır. Yüklemenin başarılı olduğunu entegremizin D13 bacağına led takın ve yanıp söndüğünü göreceksiniz.

Arduino IDE sinde yaptığımız değişiklikleri yeni sketch yüklemek için eski haline getirin.

  • Tools -> Programmer ->  AVRISP mkII
  • Arduino Uno programlamak için
    • Tools -> Board -> Arduino Nano
  • Yeni bootloader yüklediğimiz entegreyi programlamak için
    • Tools -> Board -> Arduino Nano w/ ATmega328
  • Tools > Serial Port (arduionun bağlı bulunduğu portu seçin.
  • Upload yapıp sketch’imizi yükleyebiliriz.

 

Bootloader Yüklenen Entegreye Sketch Atma

Bootloader yüklediğimiz entegremize sketch yüklemek için Arduino Uno muzu AVR programlıyıcı olarak kullanıp, entegremizi programlayabileceğiz.

Bunun için arduino unumuzda bulunan entegreyi çıkarıp, bootloader yüklediğimiz entegreye boardan aşağıda ki bağlantıları gerçekleştirerek yapacağız. Bunun için mutlaka arduino board umuzu kullanmamıza da gerek yok Usb – ttl çeviricilerle bu işlemi yapmak mümkün.

ArduinoUSBSerial

Bağlantıda rx, tx çapraz değil düz şekilde bağlıyoruz.Reset, vcc ve gnd bağladıktan sonra normalde arduinomuza sketch atar gibi atabiliyoruz.

Kaynaklar:

http://arduino.cc/en/Tutorial/ArduinoToBreadboard

Atmega8’e Arduino Uno Kullanarak Arduino NG Bootloaderı Yükleme

Arduino Nedir?

Arduino; Open Source Hardware diye tabir edilen Açık Kaynak Kodlu elektronik devrelerdir. Açık kaynak denenmesinin sebebi arduino’nun devre şemaları, PCB’ leri, yerleşim planları, varsa üzerindeki programlanabilir elemanların kodları tamamen açıktır. İsterseniz sizde kendini arduino kartınızı yapabilir hatta satabilirsin fakat tek bir şartla onun ismine Arduino diyemezsiniz. Arduino ile giriş çıkış pinlerinin ne yapmasını istiyorsanız ona göre programlar ve devrenizde kullanabilirsiniz.

Niye Arduino ?

  • Geliştirme ortamının ve sürücülerinin kurulumu çok basit olması ve bütün platformlarda çalışabilmesi (Windows, Linux ve Mac)
  • Geniş kütüphane desteği
  • Arduino ile birlikte çalışabilecek birçok ek donanım desteği (shield) bulunması
  • Çok az teknik bilgiyle mikrodenetleyici tabanlı tasarım yapılabilmesi
  • Açık kaynaklı olduğundan isteyen herkes istediği gibi kullanmaktan serbest olması

Arduino Çeşitleri

  • Arduino Uno
  • Arduino Mega
  • Arduino Lilypad
  • Arduino Adk
  • Arduino Ethernet
  • Arduino Bluetooth
  • Arduino Mini ve Mini pro
  • Arduino Nano

Anlatımlarımı satın aldığım Arduino Uno ile yapacağım.