Arduino'dan bir ESP8266 wifi modülünde temel işlemler

Arduino'dan bir ESP8266 wifi modülünde temel işlemler

Arduino'dan bir ESP8266 wifi modülünde temel işlemler

Cuando etkileyici Piyasadaki ilk modülleri piyasaya sürdü kablosuz internet entegre ile ESP8266 y el firmware AT komutlarını kullanarak bunu nasıl ele alacağız, biz kullanıcıların ilgisini çeken şey onu derlemelere entegre etmekti. mikrodenetleyiciler ve sorunlar (eskiden) karanlığı bilmekten ibaretti ESP8266 AT komut tablosu, beslenme ihtiyaçları veya ESP8266 ürün yazılımı güncellemesi.

İçindekiler

    Daha sonra hızlı bir şekilde programlamak için alternatifler geldi. ESP8266 ve modül uygulamaları kablosuz internet başka endişelere yol açan çok farklı formatlar: hangi ESP8266 wifi modülünü seçmelisiniz farklı antenlerin menziline (harici olanlar dahil) veya bu yeni modüllerin donanımlarımıza fiziksel entegrasyonuna bağlı olarak.

    Elbette tüm bu değişiklikler nedeniyle işletmenin en temel yönlerine, en temel yönetimine önem verilmemiş olabilir. ESP8266 wifi modülü. olmasına rağmen polarite.es Kullanımı hakkında bilgi bulabilirsiniz. ESP8266 ve sistemin işleyişini genel bir şekilde açıklamaya yönelik bazı uygulamalar vardır. ESP8266 wifi modülü AT komutlarını kullanma, özellikle de makalede ESP8266 wifi modülü ile Arduino'dan HTTP sorguları yapmak için kütüphane, okuyucu izlenimleri, kullanıcılara yardımcı olmak için bazı temel bilgilerin eklenmesinin faydalı olacağını göstermektedir. ESP8266 kendi uygulamalarını yürütmek.

    Çalışmak için temel işlemleri tartışın ESP8266 ve genel çözümler önermek çok farklı birçok bölümün hedefidir; Makalenin içeriğini takip etmenize yardımcı olması açısından aşağıdaki dizin yol gösterici olabilir:

    ESP8266 wifi modülünü bilgisayardan seri port üzerinden kontrol edin

    Bir tabaktan Arduino ve seninkini kullanarak IDE bir işlemin izlenmesi mümkündür ESP8266 wifi modülü, gönder ESP8266 AT komutları ve cevabı görün ancak bunu terminal tipi bir uygulamaya sahip bir bilgisayardan yapmak çok daha uygundur.

    ESP8266 wifi modülünü seri port üzerinden test etmek için CuteCom'u kullanma

    Hangi tahtaya bağlı Arduino kullanıldığında, yalnızca bir donanım seri bağlantı noktası mevcut olabilir, bu da gönderme ve alma işlemlerini biraz zorlaştırır. Bir bilgisayardan ve bazı anakartlardan seri iletişim uygulamasında iletişim hızını değiştirmek çok daha rahattır. Arduino (ve bazı durumlarda), seri iletişimin yüksek hızlarını, özellikle de en son sürümlerin varsayılan hızı olan 115200 baud'u pek desteklemez. firmware.

    Üzerinde İzlemek için hangi program kullanılmalı? ESP8266 seri bağlantı noktasını kullanmaİhtiyaçlara ve tercihlere göre seçilebilecek çok şey var; son zamanlarda klasik olanı daha çok kullanıyorum ŞirinCom (yukarıdaki ekran görüntüsündeki) çünkü bazı şeyleri tekrarlamak benim için çok rahat Siparişlerde ESP8266 wifi modülü proje testlerinde.

    Seri konsol olarak işlev gören programlara ilişkin bazı öneriler burada zaten verilmiştir; Örneğin, hakkında konuşurken UART seri cihazlarını bilgisayardan kontrol etmek için PuTTY. PuTTYMükemmel bir uygulama olmasının yanı sıra çoğu masaüstü işletim sisteminde mevcuttur. Ayrıca, PuTTY hem seri port hem de konsol olarak kullanılabilir İnternet protokol ailesi (TCP/IP)üzerinde faaliyet gösterenler de dahil TLS, onu yapılandırmak ve kullanımına alışmak için harcanan (az) zamanın fazlasıyla karşılığını veren yaygın bir araç haline gelir.

    ESP8266 wifi modülünü seri port üzerinden test etmek için PuTTY kullanma

    Seri iletişim yazılımının yanı sıra, bağlamak için ESP8266 wifi modülü limana USB Bir bilgisayar aynı zamanda bir dönüştürücü gerektirir USB seriye TTL. Yazılımda olduğu gibi, yalnızca bağlantı noktasını dönüştürmek için kullanılan çeşitli sürümler vardır. USB seri portta TTL (bir Euro'dan elde edilebilen) farklı protokolleri taklit edebilenlere (örneğin SPI o I2C).

    Tıpkı seri konsol görevi gören bir program gibi, bilgisayarla iletişim kuracak donanım da USB bir mantık devresi ile (sadece ESP8266) mikro kontrollü bir uygulama geliştiricisinin çalışmalarında ortak bir araç olacaktır, mümkün olan en kısa sürede araç kutusunda bulundurmaya ve onunla çalışmaya değer. ESP8266 wifi modülü Bir tane almak için mükemmel bir fırsat.

    ESP8266 wifi modülünü izlemek için USB UART seri iletişim donanımı

    Dönüştürücü USB a UART TTL Ayrıca, kullanan bir devrenin davranışını izlemek için de kullanılabilir. ESP8266Bunu yapmak için, izlemek istediğiniz çıkışlar, hızlı bir diyotla (RX) dönüştürücünün veri girişine (RX) seri olarak bağlanır. 1N4148örneğin) ve birbirine paralel bir direnç (örneğin 2K2). Böyle bir kurulum, donanım seri algılayıcısı gibi çalışır.

    USB UART TTL dönüştürücü kullanılarak Arduino'ya bağlanan ESP8266 için algılayıcı örneği

    Her ne kadar yukarıdaki görüntüdeki algılayıcı kesinlikle ilkel olsa da (diğer şeylerin yanı sıra, tampon) bir montajın çalışmasını izlemek için yeterlidir Arduino y el ESP8266.

    Algılayıcıyı önceki şemadan kaldırarak, nasıl bağlanacağını gösteren şema ESP8266 wifi modülü bir tabağa Arduino. 3V3 ile beslemenin yanı sıra entegrenin reset pini ve aktivasyon pininin de yüksek seviyeye (enable) bağlanması gerekmektedir. Elbette birinin RX pininin diğerinin TX pinine bağlanması gerekiyor.

    Önceki diyagramı basitleştirmek için bir plaka temsil edilmiştir. Arduino 3V3 ile çalıştırılır ve seri porttaki voltajın da 3V3 olduğu varsayılır. Eğer bir mikrodenetleyici zarar vermemek için seri portta farklı bir sinyal seviyesi (tipik olarak 5 V) gerekli olacaktır. ESP8266, kullanın seviye dönüştürücü aşağıdaki diyagramlarda olduğu gibi. Bu devre sıklıkla birçok ticari kullanıma hazır modül uygulamasında bulunur.

    ESP5 WiFi Modülü ve Arduino için 3V - 3V8266 Sinyal Seviyesi Dönüştürücü

    ESP8266 ürün yazılımını güncelleyin

    W ESP8266 AT komutları, sonlandırılması, modülün varsayılan hızı... sürümüne bağlıdır ESP8266 ürün yazılımı. Tüm modüllerde aynı sürüme sahip olduğunuzdan ve mümkünse en son sürüm olduğundan emin olmanız en iyisidir.

    Ne yazık ki, çoğu ESP8266 wifi modülü modelleri Yalnızca 4Mbit'e sahip oldukları için en son sürüm onlara yüklenemez. Yüklenebilecek donanım yazılımının en son (resmi) sürümü ESP8266 wifi modülleri 4 Mbit ile (çoğu), 0.9.4 sürümünü içeren 0.2'tür. ESP8266 AT komutları.

    Özetle, ihtiyacınız olan ürün yazılımını güncellemek için:

    1. İlgili ürün yazılımı sürümünü indirin. 4Mbit belleğe sahip bir modülün en son (resmi) sürümü, github'daki Espressif klasöründe bulunur. Içinde Espressif web sitesi Ürün yazılımının en son sürümünü indirebilirsiniz, ancak yüklü olduğu modülün yeterli belleğe sahip olduğunu doğrulamak çok önemlidir.

    2. Ürün yazılımı yükleme aracının en son sürümünü indirin. Benim favorim eskort hangisinde yazılı Pythonyani her platformda çalışır. İndirilmenin yanı sıra, aşağıdakilerle de kurulabilir: pip install esptool (o pip2 o python -m pip…). Elbette, etkileyici Ayrıca kendi aracını da sunuyor ancak şu anda yalnızca Windows için mevcut.

    3. İndirilen dosyaları hazırlayın; bunları erişilebilir bir klasörde açın ve gerekirse aracı çalıştırılabilir hale getirin eskortbenim durumumda, çünkü GNU / LinuxIle, chmod +x esptool

    4. Modülü bir dönüştürücü kullanarak bilgisayara bağlayın USB UART TTL 3V3'te çalışan veya 5 V'ta çalışıyorsa bir seviye dönüştürücü kullanın. Güce ek olarak, TX'i dönüştürücünün RX'ine bağlamanız gerekecektir. USB UART TTL, RX'den TX'e, GPIO0 düşük seviyede (GND) ve belki GPIO2 yüksek seviyede (testlerimde hem düşük seviyede bağlayıp hem de bağlantısını keserek çalıştı). Modülün GPIO15 bağlantısı serbestse (ESP-12'de olduğu gibi) düşük seviyeye bağlanması gerekir. Normalde çalışma sırasında yüksek seviyede olacak olan RESET, bağlantısız bırakılabilir veya bir direnç (örneğin 10K) aracılığıyla yüksek bir seviyeye bağlanabilir, çünkü kayda başlamadan önce cihazı bağlayarak sıfırlamak gerekebilir. düşük bir seviyeye.
      Modülün açılmasıyla güncelleme yapılabilecektir ancak, Bir bağlantı hatası görüntülenirse sıfırlamanız gerekecektir. RESET'i bir an için düşük seviyede bağlamak ve ardından güncelleme işlemi için yayında (bağlanmadan) bırakmak.
      Modül var yarım amper tüketimi zirveleri (bazı kullanıcılara göre 600 mA'ya kadar) bu nedenle, özellikle ürün yazılımını güncellemek için bu tüketimi destekleyebilecek bir güç kaynağının kullanılması önemlidir.

      Bağlantı wifi modülü ESP8266 ESP-01'i USB UART TTL dönüştürücü güncelleme ürün yazılımına

    5. Firmware'i güncellemek için aracı çalıştırın. Benim durumumda, 3. adımda araç ve ürün yazılımı belgelerini aynı klasöre kaydettim, bu yüzden konsoldan çalıştırıyorum:
      cd ~/Datos/firmwareESP8266 (aracı ve ürün yazılımını içeren klasöre geçin)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud hızını ayarlar ESP8266 (benim durumumda 115200 baud) ve --port bağlandığı seri bağlantı noktası (benim durumumda öykünülmüş, ilk USB). Firmware'i oluşturan farklı belgeler geride kalıyor write_flash Adresin önünde, güncelleme yükünü içeren user1.bin belgesi yer alır.

      wifi ESP8266 ürün yazılımı güncellemesi esptool konsol yakalama

    ESP8266 wifi modülüne komut gönder

    kontrol etmek için ESP8266 bir bilgisayardan başlamamız gerekecek uygulamayı yapılandır bunun için dönüştürücünün bağlı olduğu bağlantı noktasını seçmek yeterli olacaktır ① USB UART TTL, gibi bir şey /dev/USB0 GNU/Linux ve benzeri veya buna benzer bir şeyde COM6 Windows'ta, ② Windows'un çalışma hızını seçin. ESP8266, muhtemelen 115200 baud, ③ eşlik veya el sıkışma olmaksızın 8 veri biti artı bir durdurma biti ayarlayın ve ④ veri türüne bağlı olarak hat sonunu ayarlayın firmware, neredeyse her zaman CR+LF.

    CuteCom'u bir USB UART TTL dönüştürücü kullanarak ESP8266 wifi modülünü izleyecek şekilde yapılandırın

    PuTTY'yi USB UART TTL dönüştürücüyle ESP8266 wifi modülünü izleyecek şekilde yapılandırın

    Uygulama yapılandırıldığında (veya uygun olduğunda saklanıp seçildiğinde), bağlantıyı aç ("açık cihaz" ve "açık", yukarıdaki örneklerin ekran görüntülerinde sırasıyla ŞirinCom y PuTTY) ve şu adrese sipariş göndermeye başlayabilirsiniz: ESP8266.

    Şekilde görülebileceği gibi ESP8266 AT komut tablosu, etkinleştirme, devre dışı bırakma, değer ayarlama ve ona gönderme yapma biçimi oldukça öngörülebilir, ancak genel olarak hepsini hatırlamak kolay değildir ve ona başvurmak için muhtemelen elinizde olması gerekecektir.

    Yolu göndermek siparişlerde al ESP8266 wifi modülü itibaren Arduino çok basit: ① ile iletişimi yapılandırın Serial.begin(115200); (veya çeşitli donanım seri bağlantı noktalarına sahip kartlarda Seri1, Seri2…) ve ② komutları formatı kullanarak gönderin Serial.print(orden+"\r\n");

    Yukarıdaki örnek, mesajın nasıl gönderileceğini gösterir. Siparişlerde ESP8266 wifi modülü itibaren Arduino. Bu durumda resimlendirilmiştir AT+CWJAPBir erişim noktasına bağlanmak için kullanılır. Bu komut, erişim noktası tanımlayıcısını argüman olarak kullanır (SSID) ve anahtarın her ikisi de tırnak içinde olduğundan bir nesne haline gelirler Srtring ve kaçış kodunu kullanarak bunları tırnak içine alın (\"). Siparişi tamamlamak için şunu kullanın: \r\n hangisine karşılık gelir CR y LF.

    Seri bağlantı noktasının her zaman ile tanımlanmadığını hatırlamak için Serial (bazı plakalarda olabilir Serial1, Serial2…) kullanılan port nesnesi makroya atanarak tanımlanmıştır PUERTO_SERIE. Kullanılan kart tipinin tespit edilmesi, seri port seçimine biraz bilgi katabilir; Daha sonra türünü nasıl öğrenebileceğinizi ele alacağız. Arduino. Tanımların geri kalanı, tekrar etmekten (ve hata yapmaktan) kaçınmak ve bunları değiştirmeyi kolaylaştırmak için sabit değerleri "adlandırmanıza" olanak tanıyan olağan tanımlardır.

    Yukarıdaki örneğin bağlanması gerekiyor ESP8266 wifi modülü belirtilen erişim noktasına mı bağlandınız, ancak daha önce zaten bağlı mıydı? Bağlantı işe yaradı mı? Bunu bilmek için, söylenenleri "dinlememiz" gerekiyor. ESP8266

    ESP8266 wifi modülünden veri alın

    Yukarıda açıklanan veri algılayıcıyı bilgisayara bağlayarak ne olduğunu görebilirsiniz. Arduino gönderdi ESP8266 ve onun cevabı. Okumak için Arduino ve içindeki bilgiyi işleyerek tespit edilmesi gerekli olacaktır. Serial.available() herhangi bir veri geldiyse ve geldiyse onu yükleyin Serial.read(). Aşağıdaki örnek, gelen yanıtın nasıl okunacağını gösterir. AT+CWJAP?, herhangi bir erişim noktasına bağlantı olup olmadığını bildirecektir.

    Bir tabakta olduğu gibi Arduino Uno (ve diğerlerinde) seri monitörün açılması programı sıfırlar, seri konsolda görmek için kullanılabilir Arduino gönderdiğiniz bilgiler ESP8266 aşağıdaki görüntünün ekran görüntüsünde gösterildiği gibi.

    Arduino'dan ESP8266 wifi modülünden veri alın. Temel örnek

    ESP8266 wifi modülü tarafından gönderilen yanıtı analiz edin

    Ulaşan bilgiyi nasıl okuyacağımızı zaten görmüştük. Arduino gelen ESP8266. Başa çıkmanız gereken sorun, ne zaman gelmeye başlayacağını, gelmesinin ne kadar süreceğini, ne kadar süreceğini bilmiyor olmanız... ve servisten gelecek yanıtı beklemek çok verimli değil. ESP8266 izin verilmeden alınır mikrodenetleyici bu arada başka görevleri de yerine getirin.

    Bu durumu yönetmenin basit bir yolu somut cevaplar bulmak için elde edilen verileri yineleyin örneğin alınan metinde aramaya devam edilip edilmeyeceğini ve metinden gelen bilgilere göre hangi eylemlerin gerçekleştirilmesi gerektiğini belirleyecek göstergeleri (bayraklar veya Boole değişkenleri) etkinleştirin. ESP8266. Yanıt geldiğinde mikrodenetleyici diğer görevlere adayabilirörneğin sensörlerden veri almak ve onu işlemek.

    ESP8266'dan alınan bilgilerde metin arayın

    Gelen metni aramak için ESP8266 yapabilirsiniz Alınan her mektubu aradığınız mesaja karşılık gelen mektupla karşılaştırın. Karşılaştırılacak harfi işaret eden bir sayaç (veya işaretçi) kullanmak gerekli olacaktır; Eğer gelen karakter ESP8266 mesajda incelenen ile aynı ise sayaç ilerler, farklı ise başlatılır.

    Sona ulaşıldığını anlamak için aranan mesajın bir sonraki karakteri olan sıfıra başvurulur (\0) veya mesajın uzunluğunun saklandığı sayaçla karşılaştırılarak karşılaştırmanın bitip bitmediğini ve dolayısıyla ESP8266 wifi modülü İstenilen mesajı gönderdi.

    Aşağıdaki örnekte şu komut kullanılmaktadır: AT+CWLAP bu, erişim noktalarının bir listesini döndürür ve bunların içinde "wifi polaridad.es" adı verilen bir tane aranır. Her ne kadar son karakterin sıfır olduğunu doğrulamayı seçmiş olsak da tampon Yalnızca aranan metni saklar ve uzunluğu bilinir, aynı zamanda bu kadar sayıda doğru mektubun alınıp alınmadığı da kontrol edilebilir. Birlikte LED pin 2'ye bağlanıldığında beklenen metnin bulunduğu bildiriliyor.

    Önceki örneğin kodunda ayrıca bir yol da görebilirsiniz. kartın türüne bağlı olarak seri bağlantı noktasını seçin Arduino kullanılmış. Bu örnekte proje için üç tür panonuz olduğu varsayılmaktadır: bir Arduino Unobir arduino mega 2560 ve bir Arduino Leonardo. Eğer bir Arduino Uno kullanılacak Serial ve aksi halde Serial1.

    Bir plaka ile çalışıyorsanız Arduino Leonardo Programı durdurmak ve konsolun (ilgili seri portun) çalışmasını beklemek için aynı yöntemi kullanabilirsiniz. Serial) gecerli.

    ESP8266 yanıtında çeşitli metinleri arayın

    Önceki örnekteki kod, gönderici tarafından gönderilen bilgilerde metin aramak için kullanılır. ESP8266 ancak yanıt, operasyona bağlı olarak farklı bilgiler içerebilir. Bir sonraki örnekte basit bir durumla başlamak için, MCU ESP8266 es OK İşlem doğru yapıldığında ve ERROR Aksi takdirde siparişte olduğu gibi AT+CWJAP?olup olmadığını doğrulamaya yarayan ESP8266 wifi modülü zaten bir erişim noktasına bağlı.

    Birkaç olası mesajla eşleşme arayan aynı yöntemin bu yeni uygulaması, mesajdan alınan yanıta bağlı olarak farklı eylemler arasında seçim yapmanıza olanak tanır. ESP8266açmanız yeterli LED karşılık gelen.

    Yanıt almak için gereken süreyi sınırlayın

    Şu ana kadar ilgili bir konuya değinilmemiştir: Bir işlemin başarısız olduğunu düşünmeden önce maksimum bekleme süresi (zaman aşımı). Herhangi bir nedenle bağlantınız varsa ESP8266 wifi modülü, erişim noktasına sahip modül, İnternet'e sahip erişim noktası veya örneğin varsayımsal bir sunucu mevcut değilse, program süresiz olarak bekleyen bir noktada bloke edilebilir, dolayısıyla bu gibi durumlara bir yanıt verilmesi gerekecektir. Maksimum bekleme süresi uygulamanın tamamı için yapılandırılabilir; bu durumda genellikle daha "cömert" olur veya her işlem için ayrı bekleme süreleri programlanabilir.

    (En azından) belirli bir zaman aralığının geçtiğini kontrol etmek için Hesabın başlatıldığı andaki "zaman" genellikle mevcut "zaman"dan çıkarılarak aradaki farkın istenilen limitten büyük olduğu doğrulanır.. Bu "zaman"ın gerçek zamanlı olması gerekmez; genellikle olayın başlangıcından bu yana geçen aralığa karşılık gelir. MCU zamanı saymaya başlayın; Bu, programı etkilemez çünkü ilginç olan mutlak zaman değil, geçen zamandır.

    Genellikle belirli bir aralığın geçip geçmediğini kontrol etmek için şu türden bir ifade kullanılır:

    değişken milisegundos_al_empezar değerini içerir millis() Uygulamanın zamanlandığı belirli bir an olduğundan, adının "kronometre" kelimesine gönderme yapması alışılmadık bir durum değildir. Değişken intervalo_de_tiempo önceki ifadeyi doğru yapan maksimum milisaniye sayısını içerir; yani zaman aşımını temsil eder; Genellikle bir sabittir (veya bir makrodur) ve önceki durumda olduğu gibi, adında sıklıkla "TIMEOUT" sözcüğü görünür. Çok kısa aralıklarla çalışıyorsanız kullanabilirsiniz. micros() yerine millis() (milisaniye yerine mikrosaniye) olmasına rağmen çok daha az yaygındır ve çok daha az kesindir.

    Uzun bir tamsayı Arduino (unsigned long) 4 bayt (32 bit) kaplar, dolayısıyla temsil edebileceği en büyük değer 4294967295'tir (2 üssü 32 eksi bir, çünkü sıfırdan başlar). tabakta Arduino Sürekli çalışırken milisaniye sayacı yaklaşık her 50 günde bir sıfırlanır (sıfıra döner). İmzasız veri türleriyle çıkarma yaparken aynı davranış yeniden üretilir (sayacın ters çevrilmesi), böylece zaman aşımını süresiz olarak kontrol etmek mümkün olur.

    Yukarıdaki kod bir gösterir zaman aşımı sınırlamasının çok temel uygulaması kendisinden önceki örneğe göre işaretlenmiş satırları içerir. Zaman aşımı doğrulaması, gelen veri işlendikten sonra yapıldığından ESP8266 wifi modülüalımı zorunlu bekleme süresinden daha uzun sürse bile işlemin başarılı olduğu kabul edilebilir.

    Birden çok AT komutuyla tanımlanan karmaşık bir işlemi yürütün

    Yararlanan uygulamanın amacına ilişkin örnek bir referansa sahip olmak ESP8266 wifi modülü, varsayalım ki bilgileri bir web hizmeti aracılığıyla erişilen bir veritabanında depolamak sıcaklığı takip etmek için. Aşağıdaki kod, her belirli zaman aralığında analog girişe bağlı bir sensörü okur, ortalama değeri hesaplar ve daha uzun bir zaman aralığının ardından bunu web sunucusuna (tarz) gönderir. IOT) aracılığıyla dilekçe HTTP (GÖNDERİN, ALIN…).

    Bu sıcaklık kaydı örneğinde, her beş dakikada bir web sunucusuna erişilmektedir. Kullanılabilirlik özellikle yüksek olmasa da, teklifin işe yaraması beklenmelidir; ancak daha yüksek bir kayıt sıklığı gerekliyse, diğer kaynakların da uygulanması gerekecektir; örneğin; veri arabelleği gönderilmeyi bekliyor, sunucunun katılabileceği durumlarda birkaç tane göndermek ve bunları mevcut olmadığında saklamak için. Verilerin kaydedilmesi gereken sıklık daha da yüksek olsaydı, diğer protokol türlerinin alternatif olarak önerilmesi gerekecekti. HTTP hatta değiştirin TCP tarafından UDP Verilerin çoğunu, bazılarını kaybetme pahasına bile gereken hızda gönderebilmek.

    Sıcaklığın gönderilmesi için gerçekleştirilecek görevi oluşturan işlemler şunlardır:

    • Wifi modülünü sıfırlayın
    • Geçerli erişim noktasıyla bağlantıyı kesin (varsayılan bir bağlantının mevcut olması durumunda)
    • Ayarları yapın. Örneğin, bağlantı modunun (basit) ve Wi-Fi iletişimindeki (istasyon) rolün yapılandırılması gerektiği varsayılmaktadır.
    • Erişim noktasına bağlanın
    • Bağlantının doğru olduğunu doğrulayın (aslında burası giriş noktasıdır) Bağlantı yoksa işlemi baştan başlatın
    • Sunucuya bağlan
    • Talebi gönder HTTP saklanacak verilerle

    İşlem sırasının tam olarak bu şekilde olması gerekmez (her ne kadar işlem böyle olsa da) ve her adım birkaç tane gerektirebilir. ESP8266 AT komutlarıÖrneğin, yukarıda listelenen konfigürasyonun iki taneye ihtiyacı olacaktır: AT+CIPMUX=0 y AT+CWMODE=1.

    ESP8266'daki işlemleri temsil eden bir veri yapısı

    Önceki örneklerde, çok basit bir şekilde de olsa, soruna genel bir çözüm zaten önerilmiştir: olası yanıtları ve her durumda yapılması gereken eylemleri saklayan bir veri yapısı kullanın; Bir eylem gönderin, yanıt bekleyin ve yanıtın ne anlama geldiğine göre ilerleyin. Her karmaşık işlem birkaç tane gerektireceğinden ESP8266 AT komutlarıveri yapısı, her durumda kullanıcının yanıtına bağlı olarak gerçekleştirilmesi gereken bir işlemi sonraki veya önceki diğer işlemlerle ilişkilendirmelidir. ESP8266.

    Önceki örneklerde, kullanıcının yanıtı içerisinde bir mesaj aranıyordu. ESP8266 başarı ya da hata olarak yorumlandı. Alınan tüm metnin alımına (ve analizine) ek olarak, Genel bir minimum seviyeye sahip olmak için mesajın tamamlanmasına da dikkat edilmesi tavsiye edilir. veya başka bir deyişle, kullanılabilirliğin ESP8266 wifi modülü yeni siparişler almak için. Bu sayede örneğin "wifi mevcut" diyebileceğimiz bir duruma geçiş, erişim noktasının adının alınması ve metnin alınması şeklinde olabilir. ERROR veya metin OK şu anlama gelir ESP8266 yanıtı tamamladınız ve şimdi bir sonrakini gönderebilirsiniz ESP8266'ya AT komutu.

    Yukarıdaki kod bir vektör (operacion) görevin tamamını oluşturan ardışık işlemlerin metnini saklamak için. İki boyutlu bir dizi kullanılır (mensaje) analiz edilen üç yanıtla. Yukarıda açıklandığı gibi doğru ya da yanlış yanıtı temsil eden mesajın yanı sıra, yanıtın sonunu temsil eden mesajları da aramak gerekir. Tüm işlemlerin aynı sayıda olası cevabı olmayacaktır; Daha az yanıt olduğunda, analizinde mümkün olan en az sayıda döngüyü tüketen boş bir mesaj kullanılabilir (bu durumda bile bu en uygun yol değildir). Mantıksal olarak, aranan minimum yanıt sayısının (örnekte üç), hepsi mümkün olmasa bile tüm işletim olasılıklarını içermesi gerekli olacaktır.

    Olası cevaplardan bahsederken, bu örneğin bir bilgisayardan keyfi formatta veri almak için pek kullanışlı olmadığı zaten görülüyor. ESP8266 wifi modülü, ancak olay şu ki, kullanım bağlamında mikrodenetleyiciler bu alışılmadık bir durum; En yaygın olanı bağladıkları sensörler tarafından toplanan verileri göndermek ve/veya kontrol ettiği aktüatörlerle ne yapılacağına dair bilgi almaktır. Çok iyi tahmin edilebilecek çok değerli bilgiler.

    Önceki veri yapısında, analiz edilen olası yanıtları ifade etmek için yapıldığı gibi, her durumda yapılması gereken işlemi belirlemek için de iki boyutlu bir matris kullanılır (siguiente_operacion). Özellikle üç tür mesaja yanıt vermeyi seçtik: ① isteğe bağlı bir metin (LITERAL) Wi-Fi erişim noktası ve sunucuyla bağlantı olup olmadığını doğrulamak için, ② işlemdeki hataları tespit etmek için bir metin (FALLO) ve ③ işlemin başarıyla tamamlandığını belirten bir metin (ACIERTO).

    Son olarak, vazgeçmeden önce maksimum bekleme süresini ayarlamak için iki vektör daha var (timeout) ve belirtin (configuracion) işlem yanıt beklemeden sona ererse (ESPERAR_RESPUESTA) ve iletişimin sonunu belirten mesajlar. Belleğin nasıl kaydedilebileceğine dair bir örneği gösteren bu son vektör, farklı durumları belirtmek için konfigürasyon baytının bitleriyle çalışır.

    İlk ESP8266 AT komutları Veri yapısından her zaman bir yanıt beklenir; bu, başarı veya hata mesajı olabilir. Bir hata oluştuğunda modül yeniden başlatılır ve tekrar başlar ve mesaj işlemin doğru olduğunu gösteriyorsa bir sonraki işleme geçilir.

    Sunucuya bağlandığınızda düzen değişir. Bu durumda, ① iletilecek veri paketinin uzunluğunun gönderilmesi ve ② talebin oluşturulması gereklidir. HTTP sabit bir metin artı sunucuda saklanmak üzere gönderilen değer (sıcaklık). Bu verilerin hazırlanması her gönderide gerçekleştirilir ve ikiye (uzunluğu bildirin) veya üçe (talebi gönderin) bölmek gerekir. HTTP) Için: ESP8266 AT siparişi. Operasyonun bölündüğü parçaların yalnızca sonuncusu yanıt bekleyecektir.

    Bu durumda sorunsuz çalışacaktır (modülün meşgul olduğu uyarısı verilebilir), ancak veri uzunluğu daha büyük olduğunda veri bloklarını daha küçük parçalara bölmek ve hatta bir bekleme uygulamak bile gerekli olabilir. Modüle veriyi doldurmadan göndermesi için zaman vermek amacıyla sıcaklık okuması yapılır. tampon.

    Yukarıdaki örnek kod, daha önce açıklanmış olan diğer makrolarla birlikte, bir yanıtın beklenip beklenmeyeceğinin belirleneceği farklı durumların nasıl tanımlandığını ve uygunsa yanıtın bittiğini hangi mesajın gösterdiğini gösterir.

    Kodun farklı noktalarında olduğu gibi bir işlem gönderilecektir (ortalama sıcaklığın gönderilme zamanı geldiğinde, bir işlemin bekleme süresi aşıldığında, mevcut işlem başarıyla tamamlandığında...) ancak bunun nasıl yapılacağı bellidir. küresel olarak kurulmuş, bir makro olarak tanımlanmıştır ENVIAR_OPERACION Gönderimle ilgili adımları gruplandıran.

    Örnekteki ana programın kodu aşağıdadır. En harici görev, ortalamayı hesaplamak için sıcaklığın örneklenmesinden sorumlu olan görevdir ve bu, her belirli zaman diliminde, ESP8266 wifi modülü. Her işlem gönderildikten sonra, bir sonraki işlemin hangisi olduğunu veya bilgi gönderme görevinin tamamlanıp tamamlanmadığını belirlemek için yanıt analiz edilir.

    Mantıksal olarak, önceki kod üzerinde çeşitli optimizasyon eylemleri gerçekleştirilebilir ancak bu, optimizasyonun nasıl yapıldığını anlamak için bir örnek olduğundan ESP8266 Genel olarak, yalnızca bazı yönlere odaklanmaya değer; bunlardan ilki veri yapısıdır. Görünüşe göre mantıklı olan şu ki bir programlama dili veri yapısı kullanın (struct) işlenen bilgiyi temsil etmek için: ESP8266 AT komutları ve analiz edilen mesajlar.

    Bir yapı kullanın (structÖrnek diziler yerine (bunlara dayalı olarak) verileri depolamak önemsizdir ve daha zarif kodla sonuçlansa da sonuçta herhangi bir gelişme anlamına gelmez. Kullanımının ortaya çıkardığı gerçek alternatif struct aşağıda açıklandığı gibi uygulamaktır: “iç” verileri içeren yapılardaki değişken uzunluklar onlar tarafından anılanlar. Bu şekilde, örneğin bir operasyonun analiz edilecek sabit sayıda yanıta sahip olması gerekli olmayacaktır.

    Bu yaklaşım, çözümü uygulamanın en iyi yolu olduğunu öne sürer ancak dezavantajı bunun gerekli olmasıdır. dinamik bellek ayırmayı kullanın; bu riskli bir uygulamadır. mikrodenetleyici bu, çalışma zamanında ne kadar belleğin kullanılacağının dikkatli bir şekilde ölçülmesini gerektirir, derleyicinin bizi bu konuda uyarması pek mümkün olmayacağından ve programın yürütülmesi için ölümcül sonuçlara yol açacak şekilde belleği (veya yığını) tüketme olasılığı vardır.

    Kodu optimize etme doğrultusunda şunu hatırlamak ilginçtir ki, büyük miktarda metin kullanan bu tür bir programda, hafıza alanından tasarruf edebilir SRAM metin dizelerinin program belleğinde saklanması (flaş) makro ile F(). Aşağıdaki ekran görüntülerinde normal metin kullanımı ve makro kullanımıyla farklı program ve dinamik bellek dağıtımını görebilirsiniz. F().

    Program belleğinde (flash) saklanan metni kullanan Arduino kod örneği
    SRAM'da metin kullanan Arduino kod örneği

    Kurumdan gelen bilgilere göre gerçekleştirilen eylemlerle ilgili olarak ESP8266 wifi modülüMesajı koddan kontrol edip, alınana göre birini veya diğerini yapmaya alternatif olarak bu veri yapısında saklanabilir. durum göstergeleri yerine her görevi gerçekleştiren işlevlere yönelik işaretçiler (bayraklar), örneğin ana döngü içinde uygulamanın yönetmekten sorumlu olduğu belirli bir durum hakkında uyarıda bulunur.

    Aşağıda, isteklere ait verilerin depolanacağı yapıların bir örneği verilmiştir. ESP8266 (veri türü operacion_esp8266) ve yanıtları (veri türü) respuesta_esp8266).

    İşlemi temsil eden yapı olarak (sisteme gönderilen veriler) ESP8266 wifi modülü) yanıtların tanımlandığı yapıyı ve yanıtların yapısını operasyonların yapısına ifade eder, önce ikisini de beyan etmek gerekir, yeni veri türünü tanımlayarak ve ardından içeriğini tanımlayarak.

    Önceki örnekte, onu içeren programın bir kullanmayı seçtiği dikkate alınmaktadır. durum göstergesisöz konusu değer tarafından belirtilen bir veya diğer işlemleri gerçekleştirmekten sorumlu olan koddan erişilebilen bir değişkene karşılık gelmesi gerekir. Cevabında ise ESP8266 Belirli bir metin analiz edildiğinde durum, karşılık gelen yanıtın yapısını gösteren değeri alır.

    Daha önce de belirtildiği gibi, bir durum göstergesinin yerine geçecek veya onu tamamlayacak başka bir alternatif şu olabilir: bir fonksiyonu referans yapısında saklamak (bir işaretçi), yanıtta belirli bir metinle karşılaşıldığında çağrılacak ESP8266 wifi modülü.

    Önceki örnekte, gelen yanıtı işlemek için kullanılan veri yapısına eklenmiştir. ESP8266 wifi modülü türünde bir veri döndüren (varsayılan) bir işlevin işaretçisi float (bir analog okumanın ağırlıklı değeri olabilir) ve argüman olarak iki bayt sağlanır (iki unsigned char bu, analog girişin okunduğu pin ve varsayımsal bir entegrenin ENABLE'ını etkinleştiren pin olabilir).

    için geliştiriliyor MCUDaha büyük sistemler için geliştirme tarzında meydana gelenin aksine, bir montajı kontrol eden uygulamanın (global) davranışını tanımlarken global değişkenlerin kullanılması çok nadir değildir, dolayısıyla bu tür tanımların bulunması özellikle nadir olmayacaktır. parametresiz ve değer döndürmeyen işlevler olarak void (*accion)();

    Verileri bu şekilde temsil etme yöntemiyle çalışıyorsanız, struct değişken uzunluktaki verilerden, belleği dinamik olarak tahsis etmek gerekli olacaktır. malloc() (o new(), eğer nesneler kullanılıyorsa), parametre olarak ayrılan bellek miktarını kullanacak ve ayrılan bellek alanının başlangıcına bir işaretçi döndürecektir. İle sizeof() Depolanan türün kullanılan öğe sayısıyla çarpılmasıyla ihtiyaç duyulan bellek miktarını elde edebilirsiniz. Aşağıdaki ekran görüntülerinde kullanılarak ve kullanılmadan bir örnek görülebilir. malloc(); İlk durumda programın kullandığı belleğe dikkat edin, bu işlevi içeren kütüphaneyi yüklemeniz gerekir.

    Arduino'da malloc ile bellek ayırma örneği

    Arduino'da malloc olmadan metin atama örneği

    Üzerindeki işlemler ise ESP8266 wifi modülü Programın yürütülmesi boyunca değişiklik göstereceğinden, kullanılmayan hafızanın boşaltılması gerekli olacaktır. free() (o delete(), nesne olması durumunda). Her ne kadar derleyiciden bunu beklemek makul olsa da (GCC) programı bellek bölümlemesini önleyecek şekilde optimize edecekse de performans kesinlikle statik olarak ayrılmış bellekle çalışmak kadar optimum olmayacaktır.

    Bu örnekte (her iki uygulamada da) pek bir anlam ifade etmese de, işlemi diğer durumlara uygulayabilmek için genelleştirmek amacıyla şunu belirtmek gerekir: veri göndermek her zaman aynı protokolü tekrarlar: gönderilecek bayt sayısını bildirin, (>) göstergesini bekleyin ve verileri gönderin.

    Bu örnekte yalnızca bir kez kullanıldığından (isteğin tamamı tek bir pakette yapılır), pek kullanışlı görünmese de genel olarak aynı işlemde birden fazla gönderim gerçekleştirmek gerekli olabilir, bunlara zorunlu durumlar da dahildir. belleğin taşmasını önlemek için parçalanması gereken önemli miktarda veri iletilecektir. ESP8266.

    Bu davranışı uygulamak için bağlantının son iki öğesi kullanılabilir, böylece her veri gönderildiğinde veriler karşılık gelen değerlerle doldurulur: ilk durumda gönderilen bayt sayısı ve ikinci durumda ( talebin bir kısmı iletilecektir.

    Aktarılması gereken farklı öğelerin atamasını ve gönderilmesini tekrarlamak için bir vektörde saklanabilir. Bu yeni vektör, şimdiye kadarki gibi son operasyonu değil, karmaşık operasyonun sonunu belirleyecek vektör olacak.

    1 yorum

    yorum kullanıcısı
    bu

    Bu konu hakkında kesinlikle öğrenilecek çok şey var. Yaptığın tüm noktaları beğendim

    Yorum Ekle

    Kaçırmış Olabilirsiniz