Merhaba arkadaşlar, Node RED kısaca NR, yazılımcı olmadan, kodlama yapmadan veya çok az kodlama ile IoT uygulaması veya lokal uygulamalar geliştirebileceğiniz açık kaynaklı harika bir otomasyon yazılımıdır. Bu yazıda, NR kullanımına bir örnek olması için Arduino kodlaması yani C++ bilmeseniz bile bir Arduino projesini nasıl oluşturabileceğimizi anlatacağım. İhtiyacımız olan ana malzemeler bir Arduino Uno ve Windows 10 yüklü bir bilgisayar sadece.. Raspberry Pi de GPIO diye adlandırılan giriş, çıkış (I/O) olarak kullanılabilecek pinler var fakat normal bir PC’de böyle bir port yok malesef. Bu projede, PC için Arduino’yu I/O kartı gibi kullanacağız..
Blog sayfamdaki yazıda NR’in bir PC’ye nasıl kurulduğunu anlatmıştım. NR kurulumunu, daha sonra rahat bir şekilde PC’den silebilmek, kaldırabilmek, yedeklemek veya farklı işletim sistemlerini deneyimleyebilmek adına VirtualBox içinde yapabilirsiniz. Windows 10 ile çalışan PC’de VirtualBox sanallaştırma yazılımını kuruyoruz, VirtualBox içinde de bir linux dağıtımı olan Debian’ı kuruyoruz. VirtualBox içinde Debian yerine Windows da kurabilirsiniz fakat ben çok daha az kaynağa (ram, disk) ihtiyaç duyduğundan ve daha kararlı çalıştığından Debian’ı tercih ettim. Debian kurulumundaki tüm işlemleri blog sayfamdaki aynı yazıda anlattım..
Elinizde NR kurulmuş bir Raspberry Pi varsa, onunla da aşağıda anlattığım işlemleri yapabilirsiniz. Yani Arduino’yu USB kablosu ile Raspberry Pi’ye bağlayabilirsiniz.
node-red
komutu ile NR’i çalıştırdığınızı ve Windows PC’de Google Chrome web tarayıcıyı açarak adres satırına localhost:1880
yazıp enter tuşuna bastığınızı farzediyorum. Karşınıza aşağıdaki gibi boş bir NR sayfası gelecektir. Sol taraftaki renkli dikdörtgen kutuların her birine node deniyor. Onları sürükle bırak yöntemiyle ortadaki boş sayfaya çekiyoruz. Node üzerine çift tık yaptığımızda, node’un ayarlarına giriyoruz. Ayar penceresinde en üstte node’un ismi yazar. Node’u Ctrl+C ile kopyalayıp, Ctrl+V ile yapıştırabiliriz. Mouse ile dikdörtgen şeklinde seçim yapıp birden fazla node’u delete tuşu ile silebilir veya mouse ile sürükleyerek taşıyabiliriz.
Kütüphaneleri kurmak için resimde sağ üst köşede gözüken menü tuşuna basarak Manage palette seçeneğini seçiyoruz. Install sekmesine gelip aşağıdaki node kütüphanelerini kuruyoruz yani install ediyoruz.
- node-red-dashboard
- node-red-node-arduino
Dashboard’u, bir cep telefonu web tarayıcısından veya PC’deki bir tarayıcıdan, Arduino’yu kontrol etmemizi sağlayacak kullanıcı arayüzünü oluşturmak için kullanacağız. Bunun için HTML, CSS gibi konuları bilmemize ihtiyaç yok. node-arduino (Arduino Firmata) ise Arduino ile iletişim kurmamızı sağlayacak. Bu node’u kuramazsanız blog sayfamdaki “Node.js ve Node-RED kurulumu” başlığını tekrar okumanızı öneririm. Proje sonunda cep telefonu tarayısından NR ip adresini girdiğimizde (192.168.1.xx:1880/ui) aşağıdaki görüntüyü elde etmiş olacağız. Yani NR çalışırken, aynı zamanda web sunucu olarak da çalışıyor..
Arduino ayarları ve bağlantı şeması
Arduino’yu USB kablo ile bilgisayara bağlayalım. Önceden kurmadıysanız Arduino için Windows’a USB sürücüsü kurulması gerekiyor. Bu sayede, Arduino, Windows Aygıt Yöneticinde seri port olarak gözükecektir. Arduino IDE’nin çalışabilmesi için gereken Java’yı buradan, Arduino IDE’yi buradan indirin ve bilgisayarınıza kurun. Windows komut isteminde (cmd) java -version
yazarak java’nın bilgisayarınıza daha eskiden kurulup kurulmadığını anlayabilirsiniz. Arduino IDE’de Araçlar altında Kart ve Port ayarlarının doğru olduğunu kontrol ettikten sonra Dosya->Örnekler->Firmata->StandardFirmata menüsünü takip edin ve Yükle butonuna tıklayın. Firmata yazılımı Arduino’ya yüklenecektir. USB kabloyu çıkarıp, aşağıdaki şemayı breadboard ile oluşturun.
Led’lere 330ohm, butonlara 10K direnç bağlayabilirsiniz.
Node-RED flow oluşturalım
NR arayüzünde test amaçlı, aşağıdaki akış (flow) şemasını oluşturalım. Bu arada + sembolüne tıklayarak birden fazla boş flow sayfası açabilirsiniz. Örneğin Flow 2 başlığına çift tık yaparak açılan pencerede en altta Enabled yazısına tıklayarak Disabled yani o flow’u pasif veya çalışmasın durumuna getirebilirsiniz.
Bilgiler soldan sağa akacaktır. Soldaki inject node’un solundaki mavi kutucuğa tıklayınca sağda debug mesajı çıkacaktır. Bunu görebilmeniz için sağ üstte böcek sembollü tuşa basmış olmanız gerekir. Böceğin altındaki çöp kutusu tuşuna basınca da mesajlar silinecektir. Mesaja baktığımızda msg payload yani inject node’undan debug node’a gelen mesajın içeriği gözükmektedir, tipi number yani sayıdır. Milisaniye olarak sürekli artan bir sayıdır. Debug node, gelen bilginin içeriğini görmek için kullanılır. Debug node’un sağ tarafındaki kutucuğa tıklanırsa, pasif olacaktır, yani gelen mesajı göstermeyecektir. Şimdi arduino in, arduino out ve inject node’lardan oluşan aşağıdaki şemayı oluşturalım.
Soldaki arduino in node’ları butonlardan gelen bilgiyi algılayacaktır. Sağdaki arduino out node’ları led’leri yakıp söndürecektir. inject node’larda çift tık ile ayarlarına girdiğinizde msg.payload tipini boolean yapmanız, ardından Done butonuna tıklamanız gerekir. Arduino node’larda çift tık ile ayarlarına girdiğinizde Type kutusunda Digital seçin, Pin kutusunda pin numarasını yazın. En üstte Arduino yazan kutunun sağındaki kalem sembolüne tıklayarak port kutusuna sizdeki portu yazın. Bende /dev/ttyS1 olarak gözüküyor. Bu konuyla ilgili olarak blog sayfamdaki “VirtualBox’da Debian 11 ve Node-RED kurulumu” başlığını inceleyiniz. Arduino node’ların altında resimdeki gibi connected (bağlı) yazmalıdır. Bunları daha kolay yapmanın bir yöntemi de kopyala yapıştır yöntemi 🙂 Bunun için aşağıdaki json kodunu, menü tuşu ardından Import’a tıklayınca açılan pencereye yapıştırın ve Import butonuna tıklayın..
[{"id":"8bd444b8c2c88a1d","type":"tab","label":"Flow 1","disabled":false,"info":"","env":[]},{"id":"797ba27464a0a45e","type":"debug","z":"8bd444b8c2c88a1d","name":"debug 1","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":460,"y":60,"wires":[]},{"id":"7957581b07b3a04c","type":"arduino out","z":"8bd444b8c2c88a1d","name":"LED 1","pin":"5","state":"OUTPUT","arduino":"c602eb6ed5689a22","x":470,"y":260,"wires":[]},{"id":"04b05b9467602db3","type":"inject","z":"8bd444b8c2c88a1d","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":170,"y":260,"wires":[["7957581b07b3a04c"]]},{"id":"341ecac0162e2fb8","type":"inject","z":"8bd444b8c2c88a1d","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":170,"y":300,"wires":[["7957581b07b3a04c"]]},{"id":"e0c19514e3a64c4c","type":"debug","z":"8bd444b8c2c88a1d","name":"debug 2","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":460,"y":140,"wires":[]},{"id":"ddd170f15709f854","type":"arduino in","z":"8bd444b8c2c88a1d","name":"Buton 2","pin":"3","state":"INPUT","arduino":"c602eb6ed5689a22","x":150,"y":140,"wires":[["e0c19514e3a64c4c"]]},{"id":"c4c0d95b55b14b22","type":"arduino out","z":"8bd444b8c2c88a1d","name":"LED 2","pin":"6","state":"OUTPUT","arduino":"c602eb6ed5689a22","x":470,"y":380,"wires":[]},{"id":"6071b83431e655e6","type":"inject","z":"8bd444b8c2c88a1d","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":170,"y":380,"wires":[["c4c0d95b55b14b22"]]},{"id":"607536a47fb3a41d","type":"inject","z":"8bd444b8c2c88a1d","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"false","payloadType":"bool","x":170,"y":420,"wires":[["c4c0d95b55b14b22"]]},{"id":"072c7055d6888ac6","type":"arduino in","z":"8bd444b8c2c88a1d","name":"Buton 1","pin":"2","state":"INPUT","arduino":"c602eb6ed5689a22","x":150,"y":60,"wires":[["797ba27464a0a45e"]]},{"id":"c602eb6ed5689a22","type":"arduino-board","device":"/dev/ttyS1"}]
Json da xml gibi bir bilgi paylaşma formatıdır. Bir flow oluşturduysanız, bunu dışarı aktarmak için de Export’u kullanabilirsiniz. Artık sağ üstte bulunan Deploy butonuna basarak uygulamayı çalıştırabiliriz. Yaptığınız her değişiklikten sonra Deploy’a tıklamak gerekiyor. Breadboard üzerindeki butona basınca debug penceresinde mesaj olarak 1, parmağı çekince 0 yazacaktır. Inject true butona basınca breadboard üzerindeki led yanacak, false a basınca sönecektir.
Bu flow’u flow başlığına çift tık yapıp en altta enabled’a tıklayarak, disabled yani pasif hale getirelim. Cep tlelefonu tarayısından görebileceğimiz User Interface (kullanıcı arayüzü) i oluşturmak için aşağıdaki kodu import yapalım.. Burada Arduino node’ların dışında dashboard’dan text ve switch node’ları kullanıldı. Arduino in node’dan gelen bilgiyi değiştirmek için de change node’u kullanıldı..
[{"id":"2b4935223656c83d","type":"tab","label":"Flow 2","disabled":false,"info":"","env":[]},{"id":"041adfd037beb04f","type":"arduino in","z":"2b4935223656c83d","name":"Buton 1","pin":"2","state":"INPUT","arduino":"c602eb6ed5689a22","x":172,"y":138,"wires":[["1aa124a89df70f0d"]]},{"id":"446d2fee598b3d3f","type":"arduino in","z":"2b4935223656c83d","name":"Buton 2","pin":"3","state":"INPUT","arduino":"c602eb6ed5689a22","x":170,"y":200,"wires":[["468ab9340c1c4746"]]},{"id":"d6beaa8a08af8f4d","type":"ui_text","z":"2b4935223656c83d","group":"13b08099b22db9ce","order":1,"width":0,"height":0,"name":"","label":"Buton 1","format":"<font color={{msg.renk}}>{{msg.payload}}","layout":"row-spread","className":"","x":580,"y":140,"wires":[]},{"id":"1aa124a89df70f0d","type":"change","z":"2b4935223656c83d","name":"","rules":[{"t":"set","p":"renk","pt":"msg","to":"(msg.payload=1)?\"green\":\"red\"","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"(msg.payload=1)?\"TRUE\":\"FALSE\"","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":140,"wires":[["d6beaa8a08af8f4d"]]},{"id":"ab1ec14e49bb3f73","type":"ui_text","z":"2b4935223656c83d","group":"13b08099b22db9ce","order":1,"width":0,"height":0,"name":"","label":"Buton 2","format":"<font color={{msg.renk}}>{{msg.payload}}","layout":"row-spread","className":"","x":580,"y":200,"wires":[]},{"id":"468ab9340c1c4746","type":"change","z":"2b4935223656c83d","name":"","rules":[{"t":"set","p":"renk","pt":"msg","to":"(msg.payload=1)?\"green\":\"red\"","tot":"jsonata"},{"t":"set","p":"payload","pt":"msg","to":"(msg.payload=1)?\"TRUE\":\"FALSE\"","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":200,"wires":[["ab1ec14e49bb3f73"]]},{"id":"795af1c015bad908","type":"ui_switch","z":"2b4935223656c83d","name":"","label":"LED 1","tooltip":"","group":"13b08099b22db9ce","order":2,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"topic","topicType":"msg","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"","x":170,"y":300,"wires":[["29378cfa2bb2451e"]]},{"id":"29378cfa2bb2451e","type":"arduino out","z":"2b4935223656c83d","name":"LED 1","pin":"5","state":"OUTPUT","arduino":"c602eb6ed5689a22","x":570,"y":300,"wires":[]},{"id":"9d9d5e3b21cabe81","type":"ui_switch","z":"2b4935223656c83d","name":"","label":"LED 2","tooltip":"","group":"13b08099b22db9ce","order":2,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"topic","topicType":"msg","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"","x":170,"y":360,"wires":[["ad1dbb708ae72db2"]]},{"id":"ad1dbb708ae72db2","type":"arduino out","z":"2b4935223656c83d","name":"LED 2","pin":"6","state":"OUTPUT","arduino":"c602eb6ed5689a22","x":570,"y":360,"wires":[]},{"id":"c602eb6ed5689a22","type":"arduino-board","device":"/dev/ttyS1"},{"id":"13b08099b22db9ce","type":"ui_group","name":"Arduino","tab":"8074c8e957004d77","order":1,"disp":true,"width":"6","collapse":false,"className":""},{"id":"8074c8e957004d77","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false}]
Deploy’a tıkladıktan sonra yeni bir Google Chrome sayfası açıp adrese http://localhost:1880/ui girin ve enter a basın. Cep telefonu tarayıcısında bilgisayarın ip adresini aynı şekilde ip_adresi:1880/ui olarak yazın. Windows’da bilgisayarın ip adresini görmek için komut isteminde ipconfig
yazabilirsiniz. Karşınıza çıkan kullanıcı arayüzü ile led’leri yakıp söndürebilir, telefon ekranında, breadboard üzerindeki butona basıldığında TRUE, basılmadığında FALSE görürsünüz. NR her ortamda kurulabiliyor, Linux, Windows, MacOS veya Android.. İşinize yarayabilecek binlerde node’dan oluşan kütüphanesi var. Mesela, bir web sitesine http request yollayabilir, dönen cevabın içindeki bir bilgiyi sql veritabanına yazabilirsiniz. MQTT node’ları ile ESP8266/32 modüllerle haberleşerek ev otomasyon sistemi yapabilirsiniz. Öğrenmek isteyenler için internette çok kaynak var, örneğin ilk aşamada bu youtube kanalını tavsiye ederim. Daha profesyonel kullanımlar için bu kanalı öneririm.. Node Red’i red etmeyin deneyin, pişman olmazsınız derim 🙂 #projebaşlasın
Not: Blog sayfama Node-RED ve Tasmota ile ilgili bir yazı daha ekledim..