1 | Evde fotoğraf arşivleme

1 | Evde fotoğraf arşivleme

Anılar benim için çok değerlidir. Bu anıları saklayabileceğimiz fotoğraf ve video günümüzde çok rahat çekilebilmek. Fakat bunları saklama için çok fazla metot olmasına rağmen geriye dönük fotoğraflara bakmadığımı fark ettim.

Ayrıca her platform kendince yedekliyor fakat bunları fiziksel olarak ulaşabilmek bana karmaşık hale gelmeye başladı. Bu hizmeti sağlayan firmalarda fotoğrafların boyutları küçültebiliyor. Ayrıca çekilen bir fotoğrafa/videoyu izlemek albüm yapmadığımdan dolay buluncaya kadar geçen zamandan dolayı vazgeçtiğimi tespit ettim. Ayrıca fotoğraflar ve videoları bulut çözümlerin yanında ana diskimde kopyası bulunmaktadır. Bu kopyanın da 2 farklı yerde yine kopyası var. Yani bir fotoğrafım bulut + 3 diskte yer alıyor. Fakat bulut ile fiziksel yedeklemelerim karışıyor. Kontrol edemediğimi fark ettim. Fotoğraflarım için aynı pozdan birden fazla ve karışık çok fotoğraf olduğundan düzenlemem gerekiyor.

Bu yaşadığım sorunları çözümü için uzun dönemdir aklımda olan evde NAS çözümlerine baktım.  Burada QNAP cihazlar çok ilgimi çekti. Fakat cihaz ve disk maliyeti çok yükseltti. Birde uygulamalarından verim alamadığımda, gerektiğinde müdehale etmeme beni bu yatırım maliyetinden korkuttu. Sonuçta ev kullanıcıyım. Çözüm olarak daha öncede uğraştığım raspberry pi 4 cihazını elde ettim. NAS’ta istediğim performansı bulamaz isem farklı projelerimde kullanacağımı düştüm.

Yaşadığım tecrübelerimi bir yazı dizinde anlatmaya karar verdim.

Öncelikle edindiğim donanımlar:

  • Raspberry Pi 4 4 GB
  • Orijinal kapı ve Fanı
  • Orijinal güç kaynağı
  • 32 gb micro sd class 10
  • 2 TB USB 3.0 disk

Raspberry pi ilk çıktığından beri takip ettiğim, topluluğu ve kullanımı olan bir kart. USB 3.0 desteği, gigabit ethernet portu, wifi desteği ve düşük güç tüketimi düşündüğüm sistemi kurmak için yeterli bir çözüm olacağını düşünüyorum. Fakat evimde kullandığım wifi routerım 2.4 ghz ile yayın yaptığı için kablosuz ile bağlantılarda hızlı dosya aktarımı olmuyor. İlerleyen dönemlerde hazır wifi 6 yaygınlaşıyorken yeni bir router almayı hedefliyorum. Evde yaptığım ilk testlerimde windows bilgisayarımdan saniyede 5,40 mb aktarım, ortalama 50 mbps ile dosya yazdım. Uzun vadede ki hedeflerim için hız benim için çok yeterli gelmiyor.

Yapmak istediklerim neler?

  • Eşimin ve benim telefondan olsun diğer cihazlardan olsun tüm fotoğrafları tek merkezden yönetmek
  • Çektiğimiz video ve resimleri DLNA ile televizyonumuzdan izlemek
  • Farklı bilgisayardan çalıştığımız için dökümanları tek merkezde toplamak
  • Tüm fotoğraf ve videoları belli periyotlar ile google drive dosya olarak yedeklemek
  • Telefonların hafızası dolduğundan çekilen fotoğrafları otomatik olarak buraya atmak ve telefondan temizlemek
  • Tüm fotoğraflar ve dökümanlarımıza webten ulaşabilmek.
  • Fotoğraflarımızı üzerinde ki kişileri etiketleyerek albüm oluşturmak. Sanırım bunun için yazılım geliştirmesi yapılması gerekiyor. Desteklerinizi beklerim

GitHub Paketlerini kullanarak özel npm paketleri yayınlama

Bu makalemde firmanıza/kendinize özel npm paketlerinizi yayınlamak için GitHub Paketlerini nasıl kullanacağınıza değineceğim. Bu işlem ile geliştirdiğiniz paketleri diğer uygulamalarınızda da kullanacaksınız. Asıl amacım her projem için geliştirdiğim react componentlerimi farklı uygulamalarımda da kopyalama yapmak yerine oluşturduğum npm paketinden çekmek olacak.

Öncelikle github üzerinde ki işlemlerimizi yapacağız.

“Generate Token” butonuna bastıktan sonra bir kod üretecek. Bu kodu not ediniz. Ayrıca ileride git action kullanarak publish etmek için ilgili kodu repostory içinde secret içine ekleyebilirsiniz.

Bu işlemleri yaptıktan sonra yeni açtığımız repositoryinizi clone yaptığınız dizinde package.json dosyasını oluşturacağız. Bunun için ilgili dizinde aşağı da ki komutu çalıştırın.

npm init

Oluştururken name alanını aşağıda ki formata dikkat ederek oluşturun

"name": "@your_username/your_project_name"

Oluşan dosyasına aşağıda ki satırları kendi bilgileriniz ile ekleyin.

"publishConfig": {
"registry": "https://npm.pkg.github.com/your_username"
},
"repository": {
"type": "git",
"url": "ssh://git@github.com:your_username/your_project_name.git",
"directory": "@your_username/your_project_name"
}

Oluşan dosya index.js dosyası oluşturup, console.log(“bir şeyler”); ekleyin.

Oluşturduğumuz Paketlere Erişim

Oluşturduğumuz paketi yine npm komutları ile kullanacağımız için oluşturduğumuz npm paketi bilgilerini bilgisayarımıza tanımlamalıyız. Bu tanımlamayı .nmprc dosyası ile yapıyoruz. Oluşturacağınız dosyanın path görmek için CMDde aşağıda ki komut sonucu HOME pathte oluşturmanz gerekiyor.

npm config list

Dosya içeriği de aşağıda ki tanımı ekleyiniz.

registry=https://npm.pkg.github.com/@your_username
registry=https://registry.npmjs.org
registry=https://registry.npmjs.org/

.npmrc dosyasını oluşturduktan sonra aşağıda ki komut CMD çalıştırın. Password yerine bir önceki adımda oluşturduğumuz token bilgisini girmeniz gerekmektedir. Bu işlemleri yaptığınızda .npmrc dosyasının değiştiğini göreceksiniz.

npm login —registry=https://npm.pkg.github.com —scope=your_username

.npmrc dosyası aşağıda ki şekilde olacaktır.

registry=https://registry.npmjs.org/
@your_username:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=xxx

Ayrıca npm paketlerini kullanmaya devam edebilmek için aşağıda ki bloğuda .npmrc ekleyebilirsiniz

registry=https://registry.npmjs.org/

Login olunduktan sonra projenizi publish etmeiz gerekmektedir.

npm publish

Oluşturulan paketleri projeye eklenmesi

Oluşturulan paketleri kullanacak projenize aşağıda ki npm komutu ile ekleyebilirsiniz.

npm install @your_username/your_project_name@version

2 | React – Login Sayfası Düzenleme

Bir önceki yazımda kurduğumuz template üzerinden gideceğiz. Web apiye ilk erişimizi login ile olacak. Web Apiyi .net core ile geliştirdim. Jwt token kullanıyor. Refresh token ile güvenliğimizi biraz daha artırıyoruz.

Öncelikli olarak erişim için Axios kullanacağız. Bunun için package.jsonda olmadığı için  kurulum ile başlayacağız.

npm install axios

Artık kurulumuzu yaptık, isteklerimizi bu kütüphane ile yapacağız. Geçici olarak template ile gelen login sayfasını kullanacağız. (src/views/pages/login/Login.js) Kodu aşağıda ki gibi düzenleylim.

import React, { Component } from "react";
import { Link } from "react-router-dom";
import {
  CButton,
  CCard,
  CCardBody,
  CCardGroup,
  CCol,
  CContainer,
  CForm,
  CInput,
  CInputGroup,
  CInputGroupPrepend,
  CInputGroupText,
  CRow,
} from "@coreui/react";
import CIcon from "@coreui/icons-react";
import axios from "axios";

export default class Login extends Component {
  constructor(props) {
    super(props);
    this.state = {
      username: "",
      password: "",
    };
  }

  handleChange(e) {
    const targetName = e.target.name;
    const targetValue = e.target.value;
    if (targetName === "username") {
      this.username = targetValue;
    } else if (targetName === "password") {
      this.password = targetValue;
    }
  }

  async onClickBtnGirisYap(e) {
    e.preventDefault();

    const name = this.state.username;
    const pass = this.state.password;

    alert("Servis Bağlantısı Buradan ");

    return true;
  }

  //Setter
  set username(value) {
    this.setState({
      username: value,
    });
  }
  set password(value) {
    this.setState({
      password: value,
    });
  }
  render() {
    return (
      <div className="c-app c-default-layout flex-row align-items-center">
        <CContainer>
          <CRow className="justify-content-center">
            <CCol md="8">
              <CCardGroup>
                <CCard className="p-4">
                  <CCardBody>
                    <CForm>
                      <h1>Login</h1>
                      <p className="text-muted">Sign In to your account</p>
                      <CInputGroup className="mb-3">
                        <CInputGroupPrepend>
                          <CInputGroupText>
                            <CIcon name="cil-user" />
                          </CInputGroupText>
                        </CInputGroupPrepend>
                        <CInput
                          type="text"
                          name="username"
                          placeholder="Username"
                          autoComplete="username"
                          value={this.state.username}
                          onChange={this.handleChange.bind(this)}
                        />
                      </CInputGroup>
                      <CInputGroup className="mb-4">
                        <CInputGroupPrepend>
                          <CInputGroupText>
                            <CIcon name="cil-lock-locked" />
                          </CInputGroupText>
                        </CInputGroupPrepend>
                        <CInput
                          type="password"
                          name="password"
                          placeholder="Password"
                          autoComplete="current-password"
                          value={this.state.password}
                          onChange={this.handleChange.bind(this)}
                        />
                      </CInputGroup>
                      <CRow>
                        <CCol xs="6">
                          <CButton
                            color="primary"
                            className="px-4"
                            onClick={this.onClickBtnGirisYap.bind(this)}
                          >
                            Login
                          </CButton>
                        </CCol>
                        <CCol xs="6" className="text-right">
                          <CButton color="link" className="px-0">
                            Forgot password?
                          </CButton>
                        </CCol>
                      </CRow>
                    </CForm>
                  </CCardBody>
                </CCard>
                <CCard
                  className="text-white bg-primary py-5 d-md-down-none"
                  style={{ width: "44%" }}
                >
                  <CCardBody className="text-center">
                    <div>
                      <h2>Sign up</h2>
                      <p>
                        Lorem ipsum dolor sit amet, consectetur adipisicing
                        elit, sed do eiusmod tempor incididunt ut labore et
                        dolore magna aliqua.
                      </p>
                      <Link to="/register">
                        <CButton
                          color="primary"
                          className="mt-3"
                          active
                          tabIndex={-1}
                        >
                          Register Now!
                        </CButton>
                      </Link>
                    </div>
                  </CCardBody>
                </CCard>
              </CCardGroup>
            </CCol>
          </CRow>
        </CContainer>
      </div>
    );
  }
}

onClickBtnGirisYap fonksiyonun altında bağlantı sağlayabilirsiniz. Geçici olarak aşağada ki kod bloğundan bağlantıyı sağlayabilirsiniz. Bir sonra ki yazımda api erişimini sağlayacak class yapısını yapacağız.

    let istek = {
      grantType: "authorization_code",
      clientId: "xxxxxx",
      refreshToken: null,
      usernameEmail: "",
      password: "",
    };

    let axiosConfig = {
      headers: {
        "Content-Type": "application/json;charset=UTF-8",
        "Access-Control-Allow-Origin": "*",
      },
    };

      axios
        .post(
          "https://xxxx/tokens",
          istek,
          axiosConfig
        )
        .then((res) => {
          console.log("RESPONSE RECEIVED: ", res);

          const cevap = res.data;
          if (cevap.success) {
            alert(cevap.body.accessToken);
          }
        })
        .catch((err) => {
          console.log("AXIOS ERROR: ", err);
        });

https://www.npmjs.com/package/axios

1 | React – Template Kurulumu

Genellikle .net platforumda kurumsal firmaların iç uygulamalarını geliştirdim. Js tarafında herkes gibi jquery kullanarak hep çözüme ulaştırdım. Zaten web tarafında devexpress kurtarıcımız oluyordu. Şuan çalıştığım firmamda önemli dönüşümler yapıyoruz. Bunlarında bir tanesi de ön yüzü react.js ile yine yazmak oluyor. Buradan edindiğimi tecrübelerimi bir .netçi gözü ile yazı dizimi yapmayı hedefledim. React ile temel konulara girmeyeceğim. Zaten temel olarak aradığınızda çoğu yerden bulabiliyorsunuz. Benim yapmak istediğim; yazdığım web api ile haberleşen, typescript kullanarak amatör olmayan bir framework oluşturmak.

Öncelikle yeniden tasarım yapmamak için hazır template indirmekle başlayalım. Aşağıda adresini paylaştığım template indirin, bilgisayarınızda klasöre kopyalayın.

Node modules leri kurmasını sağlayın ve başlatın. Uygulamaız açılmasını bekliyorum.

npm install
npm start

Template içinde ki bileşenleri incelemnizde fayda var, çoğunu react component olarak yapacağız.

https://coreui.io/react/

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

Ubuntu’da Git-Github Kullanımı

Öncelikle:

  • Git: Versiyon kontrol sistemi
  • GitHub: Git versiyon kontrol sistemleri için uzak bir depo(repository)dur. Yani git ile kodlarınızı saklandığı buluttur.

Linux’e Git Kurulumu

sudo apt-get install git

SSH Key Oluşturma / Tanımlanması:

cd ~/.ssh
ssh-keygen -t rsa -C "mail@adresiniz.com"

SSH Key GitHub Hesabına Ekleme:

Öncelikle home dizinimize oluşturduğumuz .ssh klasörüne gelin. (Gizli dosya olduğundan Ctrl+H görüntüleyebilirsiniz) .ssh klasöründeki “id_rsa.pub” belgesini açın ve içindekini metni kopyalayın.
Github hesabınızda “account settings” ->  “SSH and GPG Keys” -> “Add SSH key” butonuna tıklayıp kopyaladığımız ssh keyi key alanına yapıştırın. (Title ssh keyi sizin tanımlayabileceğiniz birşey yazabilirsiniz)

SSH Key doğruluğunu test etme

ssh -T git@github.com

komut çalıştırıldığında “Hi githubkullanıcıadı! You’ve successfully authenticated, but GitHub does not provide shell access” yazısını gördüyseniz her şey yolunda demektedir.

Repository ile ilgili İşlemler

Başarılı kurulum ve gitHub üzerinde Repository oluşturduktan sonra yapılacak işlemlerden bazıları aşağıda ki gibidir. (repository oluşturduğunuzda ki quick setup işinize yarayacaktır) İşlemlere yeni projenizi ekleyeceğiz dizinden yeni bir terminal açarak başlayınız.

git init //boi git dosyası oluşturur
git add /var/www/html/proje //göndereceğiniz dosya veya dizin
git commit -m "ilk Commit"
git remote add origin http://github.com/xxxx/xxx.git
git push -u orign master //master branch dosyaları ekler

 

Kaynaklar:

  • www.github.com
  • www.volkanozkaragoz.com/git-github-nedir-nasil-kullanilir/

 

Ubuntu’da Apache, Mysql ve PHP 5 Kurulumu

İlk programlamayı öğrendiğim dil olan php dilini uzun süre ara vermiştim. Yeniden başlamak için sanal bilgisayarımda ubuntu kurulumunu yaptım. Ayrıca editor olarakta visual studio code kurulumunu yaptım. Php kurulumunu aşağıda ki gibi gerçekleştirdim.

Ortak Komutlar

--Ubuntu için güncellemeleri alır
sudo apt-get update

--Apache restrat
sudo systemctl restart apache2

 

Apache Kurulumu

sudo apt-get install apache2

http://localhost gittiğinizde “Apache2 Ubuntu Default Page” açıldığını görülecektir.

 

Mysql Kurulumu

sudo apt-get install mysql-server
--Varsayılan ayarları düzenleme için 
sudo mysql_secure_installation
--mysql root şifresini girerek kontrol edebilirsiniz.
mysql -u root -p

PHP Kurulumu

sudo apt-get install php libapache2-mod-php php-mcrypt php-mysql

--nano editörü açarak index.php en başa yazabilirsiniz. Değişiklik yapıldığında apache'yi yeniden başlatmalasınız
sudo nano /etc/apache2/mods-enabled/dir.conf

kontrolü için phpinfo bilgilerini sayfaya yazacak işlemi gerçekleştirelim.

sudo nano /var/www/html/info.php

<?php
 phpinfo();
?>

--PHP Versiyonlari göstermesi başarılı kurulumu gösterir
http://localhost/info.php

Yaptığımız php geliştirmeleri /var/www/html dizinine kopyalandığında çalıştırabilirsiniz.

 

PHP-Cli Kurulumu

sudo apt-get install php-cli

 

phpMyAdmin Kurulumu

mysql veritabanımızı arayüz ile işlemleri gerçekleştirmek için kurulabilir.

sudo apt-get install phpmyadmin

--http://localhost/phpmyadmin yazıldığında çıkması için 
sudo nano /etc/apache2/apache2.conf

açılan editorde en aşağıya yazıp apache'yi restart edin
Include /etc/phpmyadmin/apache.conf

http://localhost/phpmyadmin -> username:root

Ubuntu’da .Net Core Kurulumu

Merhaba;

Windows 10 pro bilgisayarıma virtualBox üzerinden ubuntu 64 bit versiyonunu kurdum. Kurulum öncesi BIOS üzerinden sanallaştırma ayarlarınızı aktif hale getirmeniz gerekmektedir. Ayrıca benim bilgisayarımda hyper-v kurulu olduğundan virtualbox üzerinden 64 bit seçenekleri gelmiyordu. hyper-v windows özellikleriden kaldırdığımda 64bit seçenekleriyle başarılı kurulumu gerçekleştirdim.

Ubuntu’da SSH Kurulum:

  • Terminalden: sudo apt-get install openshh-server

  • VBDen network ayarlarını: Adapter1->Attached to: Bridged Adapter; Promiscuous Mode: Allow All
  • Sanal makine DHCP üzerinden ip alacaktır.
  • Windows üzerinden putty den bağlantı sağlanır

Ubuntu .NET SDK Kurulumu:

  • https://www.microsoft.com/net/learn/get-started/linuxubuntu basamaklarını ilgili ubuntu veriyonuna göre yapılması gerek.
  • Benim 17.10 x64 versiyonu için yaptıklarım, 1 kereye mahsus yapılacak işlemler.
    Register the trusted Microsoft signature key:
    
    ~$ curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
    ~$ sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
    
    Register the Microsoft Product feed:
    
    ~$ sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-artful-prod artful main" > /etc/apt/sources.list.d/dotnetdev.list'
  • .net sdk kurulumu
    ~$ sudo apt-get update
    ~$ sudo apt-get install dotnet-sdk-2.0.2
  • Başarılı kurulum sonrası “dotnet” komutu ile versiyon ve sürüm bilgilerini aşağıda ki komutlarla görebilirsiniz.
    ~$ dotnet --version
    ~$ dotnet --info

Ubuntu Üzerinde ilk Uygulamanın Geliştirilmesi:

  • Tüm uygulamalarımı “uygumalarim” klasörü altında toplamayı düşündüğüm için yeni klasör oluşturdum ve ilkProjem isimli console projesi oluşturdum.
    ~$ mkdir uygulamalarim
    ~$ cd uygulamalarim
    ~$ dotnet new console -o IlkProjem
    
  • Projemizin dizini listelediğimiz de .csproj ve program.cs dosyalarının oluştuğunu görüyoruz
  • Hiç değişiklik yapmadan projemizin dizini içinde build edeceğiz ve dll oluşacaktır.
    ~$ dotnet build

  • Projemizi çalıştırıyoruz. Sorunsuz ise “HelloWorld” yazsını görmemizi bekliyorum
    ~$ dotnet run

İlk Uygulamanın geliştirilmesi:

  • Dizin üzerinden nano text editorüyle “Hello World!” yazımızı değiştirip, derleyeceğiz.
  • ~$ sudo nano Program.cs
  • Açılan editorden yön tuşlarıyla ilgil yazımızı değiştirip, ctrl+x diyip, kayıt edip çıkıyoruz. Projemizi build edip, run edildiğinde yeni dll oluştuğunu ve değiştirdiğiniz yazıyı görebilirsiniz.
  • Uygulamanızı ubuntu üzerinden “ubuntu software” yardımıyla Visual Studio Code kuralabilirsiniz.

Kaynaklar:

  • https://www.microsoft.com/net/learn/get-started/linuxubuntu
  • https://code.visualstudio.com/docs/setup/linux
  • http://buraksenyurt.com/post/ubuntu-da-ilk-net-core-adimlarim

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);
  }
}