Bridge

Bir Yún cihazı için bu örnek, REST çağrıları aracılığıyla karttaki dijital ve analog pinlere erişmek için Bridge kütüphanesinin nasıl kullanılacağını gösterir. Tarayıcı üzerinden REST tarzı çağrıları kullanırken kendi API'nizi nasıl oluşturabileceğinizi gösterir.

Bu örneği çalıştırırken, bilgisayarınızın Yún cihazıyla aynı ağda olduğundan emin olun. Kartı programladığınızda, bir raptiye değer isteyebilir, raptiye bir değer yazabilir ve raptiyeyi giriş veya çıkış olarak yapılandırabilirsiniz.

REST şifresi kapatıldığında, aşağıdaki URL yapısına sahip bir tarayıcı kullanabilirsiniz:

  • http: //myArduinoYun.local/arduino/digital/13: digitalRead(13); çağırır digitalRead(13);
  • http: //myArduinoYun.local/arduino/digital/13/1: digitalWrite(13,1); çağırır digitalWrite(13,1);
  • http: //myArduinoYun.local/arduino/analog/9/123: analogWrite(9,123);
  • http: //myArduinoYun.local/arduino/analog/2: analogRead(2);
  • http: //myArduinoYun.local/arduino/mode/13/input: pinMode pinMode(13, INPUT);
  • http: //myArduinoYun.local/arduino/mode/13/output: pinMode pinMode(13, OUTPUT);

İsterseniz tarayıcı yerine komut satırından CURL komutunu kullanabilirsiniz.

Gerekli Donanım

  • Yún kartı veya kalkan
  • aynı kablosuz veya kablolu ağdaki bilgisayar ve Yún cihazı

Yazılım Gerekli

  • internet tarayıcısı

Devre

Bu örnek için devre yok.

Kod

Örnek kod, Yún cihazına kartın pinlerinden bilgi okumak ve bunlara bilgi yazmak için REST isteklerinin nasıl yapıldığını gösterir.

Bridge, YunServer ve YunClient kütüphanelerini eklemeniz gerekir:

#include <Bridge.h>
#include <YunServer.h>
#include <YunClient.h>
[Kodu Al]

Yún cihazının bağlı istemcileri dinlemesini sağlayan bir sunucu başlatın.

YunServer server;

setup() , hata ayıklama amacıyla seri iletişimi başlatın ve Bridge başlarken pin 13 üzerindeki yerleşik LED'i yüksek konuma getirin. Bridge.begin() engelliyor ve tamamlanması yaklaşık 2 saniye sürüyor. Bridge başladıktan sonra LED'i kapatın.

void setup ( ) {
Seri . başlar ( 9600 ) ;
pinMode ( 13 , ÇIKIŞ ) ;
digitalWrite ( 13 , DÜŞÜK ) ;
Köprü. begin ( ) ;
digitalWrite ( 13 , YÜKSEK ) ;

setup() öğesinin ikinci bölümünde, YunServer örneğine yalnızca localhost'tan gelen bağlantıları dinlemesini söyleyin. Linux'a yapılan bağlantılar, pinleri ayrıştırmak ve kontrol etmek için 32U4 işlemciye aktarılacaktır. Bu, 5555 numaralı bağlantı noktasında gerçekleşir. Sunucuyu server.begin() ile server.begin() .

sunucusu. listenOnLocalhost ( ) ;
sunucusu. begin ( ) ;
}

loop() , bağlantıyı yönetmek için bir YunClient örneği oluşturacaksınız. İstemci bağlanırsa, istekleri özel bir işlevde (aşağıda açıklanmıştır) işleyin ve bittiğinde bağlantıyı kapatın.

loop() sonuna bir gecikme koymak işlemcinin çok fazla iş yapmasını önlemede yardımcı olacaktır.

void loop ( ) {
YunClient istemcisi = sunucu. accept ( ) ;

if ( müşteri ) {
süreç ( müşteri ) ;
istemcisi. stop ( ) ;
}

gecikme ( 50 ) ;
}

Adında bir işlevi oluşturma process kendi bağımsız değişken olarak YunClient kabul eder. Gelen bilgileri tutmak için bir dize oluşturarak komutu okuyun. REST komutlarını işlevlerine (dijital, analog ve mod) göre ayrıştırın ve bilgileri uygun şekilde adlandırılmış işleve iletin.

geçersiz süreç ( YunClient istemcisi ) {
String command = istemci. readStringUntil ( '/' ) ;

if ( komut == "dijital" ) {
digitalCommand ( istemci ) ;
}
if ( komut == "analog" ) {
analogCommand ( istemci ) ;
}
if ( komut == "mod" ) {
modeCommand ( istemci ) ;
}
}

Dijital komutlarla başa çıkmak için bir fonksiyon oluşturun. İstemciyi argüman olarak kabul edin. Komutun raptiyesini ve değerini tutmak için bazı yerel değişkenler oluşturun.

void digitalCommand ( YunClient istemcisi ) {
int pin , değer ;

client.parseInt() kullanarak client.parseInt() PIN ile çalışmasını client.parseInt() .

Raptiyeden sonraki karakter "/" ise URL'nin 1 veya 0 değerine sahip olacağı anlamına gelir. Bu değer pime bir değer atar ve YÜKSEK veya DÜŞÜK döndürür. Sonunda "/" yoksa, belirtilen pimdeki değeri okuyun.

pin = istemci. parseInt ( ) ;

if ( müşteri. read ( ) == '/' ) {
değer = istemci. parseInt ( ) ;
digitalWrite ( pin , değer ) ;
}
başka {
değer = digitalRead ( pin ) ;
}

Değeri istemciye yazdırın ve veri deposu anahtarını geçerli pin değeriyle güncelleyin.

Değeri F() de istemciye sararak, flash bellekten yazdırırsınız. Bu, URL'ler gibi uzun dizelerle uğraşırken yararlı olan SRAM'daki alanın korunmasına yardımcı olur.

Anahtar raptiye ve tür olacaktır. Örneğin, dijital pim 2 için D2 kaydedilecektir. Değer, pimin o anda ayarlandığı veya pimden okunduğu değer olacaktır.

istemcisi. baskı ( F ( "Pin D" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. baskı ( F ( "olarak ayarlandı" ) ) ;
istemcisi. println ( değer ) ;

Dize tuşu = "D" ;
anahtar + = raptiye ;
Köprü. put ( anahtar , Dize ( değer ) ) ;
}

Analog giriş pimleri ile çalışırken tuşu D yerine A yerine ayarlamak için analog aramaları aynı şekilde işlemek üzere bir işlev ayarlayın:

void analogCommand ( YunClient istemcisi ) {
int pin , değer ;

pin = istemci. parseInt ( ) ;

if ( müşteri. read ( ) == '/' ) {
değer = istemci. parseInt ( ) ;
analogWrite ( pin , değer ) ;

// Müşteriye geri bildirim gönderin
istemcisi. baskı ( F ( "Pin D" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. baskı ( F ( "analoga ayarlı" ) ) ;
istemcisi. println ( değer ) ;

Dize tuşu = "D" ;
anahtar + = raptiye ;
Köprü. put ( anahtar , Dize ( değer ) ) ;
}
başka {
değer = analogOkuma ( pim ) ;

istemcisi. baskı ( F ( "Pin A" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. baskı ( F ( "analog okur" ) ) ;
istemcisi. println ( değer ) ;

Dize tuşu = "A" ;
anahtar + = raptiye ;
Köprü. put ( anahtar , Dize ( değer ) ) ;
}
}

Pin modu değişikliklerini işlemek için bir işlev daha oluşturun. YunClient'i argüman olarak kabul edin ve pin numarasını tutmak için yerel bir değişken oluşturun. Pin değerini dijital ve analog fonksiyonlarda olduğu gibi okuyun.

void modeCommand ( YunClient istemcisi ) {
int pin ;
pin = istemci. parseInt ( ) ;

URL'nin geçerli olduğundan emin olun

if ( müşteri. read ( ) ! = '/' ) {
istemcisi. println ( F ( "hata" ) ) ;
dönüş ;
}

Geçerli bir URL ise URL'yi dize olarak saklayın. Mod bir input veya output , pimi yapılandırın ve istemciye bildirin. Dize bu değerlerle eşleşmezse bir hata döndürün.

Dize modu = istemci. readStringUntil ( ' \ r ' ) ;

if ( mode == "giriş" ) {
pinMode ( pin , INPUT ) ;
// Müşteriye geri bildirim gönderin
istemcisi. baskı ( F ( "Pin D" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. print ( F ( "INPUT!" olarak yapılandırıldı ) ) ;
dönüş ;
}

if ( mode == "çıktı" ) {
pinMode ( pin , ÇIKIŞ ) ;
// Müşteriye geri bildirim gönderin
istemcisi. baskı ( F ( "Pin D" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. print ( F ( "OUTPUT!" olarak yapılandırıldı ) ) ;
dönüş ;
}

istemcisi. print ( F ( "hata: geçersiz mod" ) ) ;
istemcisi. baskı ( mod ) ;
}

Çizimin tamamı aşağıdadır:

/ *
Arduino Yún Köprüsü örneği

YunShield / Yún için bu örnek,
Köprü kitaplığını dijital ve
REST çağrıları üzerinden kart üzerindeki analog pinler.
Aşağıdaki durumlarda kendi API'nizi nasıl oluşturabileceğinizi gösterir
tarayıcı üzerinden REST tarzı çağrıları kullanarak.

Bu shetch'te oluşturulan olası komutlar:

"/ arduino / dijital / 13" -> dijitalOkuma (13)
"/ arduino / dijital / 13/1" -> digitalWrite (13, YÜKSEK)
"/ arduino / analog / 2/124" -> analog Yaz (2, 123)
"/ arduino / analog / 2" -> analogOkuma (2)
"/ arduino / mod / 13 / giriş" -> pinMode (13, INPUT)
"/ arduino / mode / 13 / output" -> pinMode (13, ÇIKIŞ)

Bu örnek kod, genel alanın bir parçasıdır

http: egitim.aspx e = Köprü

* /


#include <Bridge.h>
#include <BridgeServer.h>
#include <BridgeClient.h>

// Varsayılan 5555 bağlantı noktasını, Yún web sunucusunu dinleyin
// gönderdiğiniz tüm HTTP isteklerini orada yönlendirir
BridgeServer sunucusu ;

void setup ( ) {
// Köprü başlangıcı
pinMode ( 13 , ÇIKIŞ ) ;
digitalWrite ( 13 , DÜŞÜK ) ;
Köprü. begin ( ) ;
digitalWrite ( 13 , YÜKSEK ) ;

// Gelen bağlantıyı yalnızca localhost'tan dinleyin
// (harici ağdan hiç kimse bağlanamadı)
sunucusu. listenOnLocalhost ( ) ;
sunucusu. begin ( ) ;
}

void loop ( ) {
// Sunucudan gelen istemcileri alın
BridgeClient istemcisi = sunucu. accept ( ) ;

// Yeni bir müşteri var mı?
if ( müşteri ) {
// İşlem isteği
süreç ( müşteri ) ;

// Bağlantıyı ve serbest kaynakları kapatın.
istemcisi. stop ( ) ;
}

gecikme ( 50 ) ; // Her 50 ms'de bir anket
}

void process ( BridgeClient istemcisi ) {
// komutu oku
String command = istemci. readStringUntil ( '/' ) ;

// "dijital" komut mu?
if ( komut == "dijital" ) {
digitalCommand ( istemci ) ;
}

// "analog" komut mu?
if ( komut == "analog" ) {
analogCommand ( istemci ) ;
}

// "mod" komutu mu?
if ( komut == "mod" ) {
modeCommand ( istemci ) ;
}
}

void digitalCommand ( BridgeClient istemcisi ) {
int pin , değer ;

// Pin numarasını oku
pin = istemci. parseInt ( ) ;

// Bir sonraki karakter bir '/' ise, bir URL'miz olduğu anlamına gelir
// "/ digital / 13/1" gibi bir değere sahip
if ( müşteri. read ( ) == '/' ) {
değer = istemci. parseInt ( ) ;
digitalWrite ( pin , değer ) ;
} başka {
değer = digitalRead ( pin ) ;
}

// Müşteriye geri bildirim gönderin
istemcisi. baskı ( F ( "Pin D" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. baskı ( F ( "olarak ayarlandı" ) ) ;
istemcisi. println ( değer ) ;

// Veri deposu anahtarını geçerli pin değeriyle güncelleyin
Dize tuşu = "D" ;
anahtar + = raptiye ;
Köprü. put ( anahtar , Dize ( değer ) ) ;
}

void analogCommand ( BridgeClient istemcisi ) {
int pin , değer ;

// Pin numarasını oku
pin = istemci. parseInt ( ) ;

// Bir sonraki karakter bir '/' ise, bir URL'miz olduğu anlamına gelir
// "/ analog / 5/120" gibi bir değerle
if ( müşteri. read ( ) == '/' ) {
// Değeri oku ve komutu çalıştır
değer = istemci. parseInt ( ) ;
analogWrite ( pin , değer ) ;

// Müşteriye geri bildirim gönderin
istemcisi. baskı ( F ( "Pin D" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. baskı ( F ( "analoga ayarlı" ) ) ;
istemcisi. println ( değer ) ;

// Veri deposu anahtarını geçerli pin değeriyle güncelleyin
Dize tuşu = "D" ;
anahtar + = raptiye ;
Köprü. put ( anahtar , Dize ( değer ) ) ;
} başka {
// Analog pimi oku
değer = analogOkuma ( pim ) ;

// Müşteriye geri bildirim gönderin
istemcisi. baskı ( F ( "Pin A" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. baskı ( F ( "analog okur" ) ) ;
istemcisi. println ( değer ) ;

// Veri deposu anahtarını geçerli pin değeriyle güncelleyin
Dize tuşu = "A" ;
anahtar + = raptiye ;
Köprü. put ( anahtar , Dize ( değer ) ) ;
}
}

void modeCommand ( BridgeClient istemcisi ) {
int pin ;

// Pin numarasını oku
pin = istemci. parseInt ( ) ;

// Sonraki karakter bir '/' değilse hatalı biçimlendirilmiş bir URL'ye sahibiz
if ( müşteri. read ( ) ! = '/' ) {
istemcisi. println ( F ( "hata" ) ) ;
dönüş ;
}

Dize modu = istemci. readStringUntil ( ' \ r ' ) ;

if ( mode == "giriş" ) {
pinMode ( pin , INPUT ) ;
// Müşteriye geri bildirim gönderin
istemcisi. baskı ( F ( "Pin D" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. print ( F ( "INPUT!" olarak yapılandırıldı ) ) ;
dönüş ;
}

if ( mode == "çıktı" ) {
pinMode ( pin , ÇIKIŞ ) ;
// Müşteriye geri bildirim gönderin
istemcisi. baskı ( F ( "Pin D" ) ) ;
istemcisi. baskı ( pim ) ;
istemcisi. print ( F ( "OUTPUT!" olarak yapılandırıldı ) ) ;
dönüş ;
}

istemcisi. print ( F ( "hata: geçersiz mod" ) ) ;
istemcisi. baskı ( mod ) ;
}

See Also

  • Bridge Library- Köprü Kütüphanesine referansınız
  • Console Ascii Table- Konsola yazdırılan eksiksiz bir ASCII tablosu
  • Console Pixel- Konsoldan bir LED'i açma ve kapatma
  • Console Read- Console.read () işlevini kullanarak köprüden gelen verileri okuma
  • Data Logger- Üç analog sensörden bir SD karta veri kaydedin.
  • File Write- Dosya Yún dosya sistemine nasıl yazılır.
  • Http Client- İnternete bağlanan ve içeriği indiren temel bir HTTP istemcisi.
  • Http Client Console- Bağlanan, içeriği indiren ve WiFi ve Konsol kullanarak içeriği gösteren HTTP istemcisi.
  • Mailbox Read Message- Köprü kitaplığını kullanarak Posta Kutusu adlı ileti sırasını okuma.
  • Process- Bir Yún kullanarak linux süreçleri nasıl çalıştırılır.
  • Remote Due Blink- DUE panolarına uzaktan taslak yükleme.
  • Shell Commands- Bir Yún kullanarak linux kabuk komutları nasıl çalıştırılır.
  • Temperature Web Panel- Yún'ın yerleşik web sunucusu üzerinden bir analog girişten veri sunma.
  • Time check- Bridge üzerinden Linux'tan zamanı alır, sonra saatleri, dakikaları ve saniyeleri ayrıştırır.
  • WiFi Status- Wifi bağlantınızın durumu hakkında bilgi yazdırır.
  • Yún First Configuration- Seri Monitör ve USB bağlantı noktasını kullanarak Yún cihazınızı kolayca yapılandırın.
  • Serial Terminal- Yún'ın 32U4 işlemcisini, Yún'daki Linux tarafı için seri terminal olarak kullanın.