sobota, 27 lutego 2016

ESPBLYNK #03 Stany wejść ESP w aplikacji

W tej części kursu nauczymy się przekazywać informację w drugą stronę - od ESP do naszej aplikacji. Zapraszam :)

Na początku jednak zajmiemy się inną kwestią. W programie który wgrywaliśmy na ESP w pętli loop widnieje tylko jedna instrukcja. Jest to funkcja Blynk.run(), która odpowiada za działanie całej komunikacji z Blynkiem. Poz żadnym pozorem nie możemy jest blokować/opóźniać, więc używanie funkcji delay() w naszych programach powinno być karalne. Testując połączenie z ESP wgrywaliśmy prostego Blinka co sekundę i niestety występował tam ten paskudny delay. Jednak w przykładach jest jeszcze program BlinkWithoutDelay i polecam się z nim zaznajomić. Użytkownikom arduino jest to zapewne znane - czas odmierzamy za pomocą funkcji milis() i porównujemy z ustawionymi przez nas interwałami. Gdyby była w tym zakresie potrzebna pomoc to opiszę to w osobnym artykule. Dlaczego o tym wspominam? Zakładam, że np. w przypadku, gdyby ktoś chciał przesyłać stan pinu co 10 sekund to zapewne pierwszym pomysłem byłoby użycie delaya przez co opóźniamy działanie całej aplikacji zupełnie niepotrzebnie. Blynk ma też pewne ograniczenie - maksymalnie 10 odświeżeń zmiennej na sekundę.


Wracając do tematu...

Używając przycisków operowaliśmy do tej pory bezpośrednio na pinach ESP. Wspomniałem wtedy o czymś takim jak virtual pin - teraz czas na wyjaśnienie co to jest. Najprościej rzecz ujmując są to zmienne przekazywane między Blynkiem, a naszym ESP do których mamy dostęp z poziomu kodu. Możemy tam przypisać praktycznie wszystko - zmienne liczbowe lub napisy. Oczywiście przyciski nie będą nam w kodzie zwracać napisów, ale ustawią odpowiednią zmienną i możemy wtedy określony tekst wyświetlić na LCD lub rozpocząć jakiś pomiar, jak zawsze użycie zależy tylko od naszych potrzeb.

Co będzie robił nasz pierwszy przykładowy program? Korzystając z BlinkWithoutDelay będziemy zapalać/gasić diodę sygnalizacyjną przypisując do niej zmienną V1. Uruchamiamy więc arduinoIDE i piszemy kod tego typu:


#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "e7f4e49f7df64e96bd856a55f738d50e";
bool ledState = 0;
unsigned long previousMillis = 0;
const long interval = 1000;

void setup()
{
  Serial.begin(9600);
  Blynk.begin(auth, "costam", "czteryslowawszystkoduzymiliterami");
}

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= interval) 
  {
    previousMillis = currentMillis;   
    if (ledState == LOW)
   {
     ledState = HIGH;
     Blynk.virtualWrite( 1, 1023 );
   }
   else
   {
      ledState = LOW;
      Blynk.virtualWrite( 1, 0 );
   }
  }
  Blynk.run();
}
Widzimy, dioda będzie zapalona, gdy do zmiennej V1 wpiszemy 1023, a zgaszona dla 0. Obsłużmy teraz to w aplikacji. Dalej pracujemy na starej wersji, aby pokazać, że pozostałe funkcje dalej pracują.
Z menu widgetów z kategorii Displays wybieramy LED. Umieszczamy ją gdzieś i wchodzimy we właściwości.
Widzimy, że nie mamy tu zbyt wiele do roboty. Możemy zmienić nazwę (niestety z ograniczeniem do 4 znaków), kolor oraz PIN - tu wybierzmy V1. I gotowe.
Musimy wgrać poprawiony kod na ESP i połączyć się z nim telefonem. Efekt działania przedstawia filmik jak widać cała poprzednia funkcjonalność została zachowana.


Dodajmy teraz sekundowy odczyt stanu z pinu ESP i zapalajmy nim kolejną wirtualną diodę.
Kod wygląda następująco:

#define BLYNK_PRINT Serial    // Comment this out to disable prints and save space
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "e7f4e49f7df64e96bd856a55f738d50e";
bool ledState = 0;
unsigned long previousMillis = 0;
const long interval = 1000;

void setup()
{
  pinMode(12, INPUT); 
  Serial.begin(9600);
  Blynk.begin(auth, "costam", "czteryslowawszystkoduzymiliterami");
}

void loop()
{
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis >= interval) 
  {
     previousMillis = currentMillis;   
     if (ledState == LOW)
     {
       ledState = HIGH;
       Blynk.virtualWrite( 1, 1023 );
     }
     else
     {
        ledState = LOW;
        Blynk.virtualWrite( 1, 0 );
     }
     if( digitalRead( 12 ) == LOW )
     {
        Blynk.virtualWrite( 2, 1023 );
     }
     else
     {
        Blynk.virtualWrite( 2, 0 );
     }
   }
  Blynk.run();
}

Umieszczam tutaj znaleziony w sieci PinOut naszego modułu z rozpisanymi pinami arduino:

Więc do pinu GPIO12 podłączyłem przycisk zwierający do masy, a dodatkowo GPIO12 podciągnąłem do plusa zasilania. Efekt można zobaczyć na kolejnym filmiku:



Z tej części to już wszystko. Umiemy migać "diodą" na wyświetlaczu naszego telefonu. Może ona sygnalizować stan pinu, lub stan jakiegoś procesu typu otwieranie się bramy, czas trwania jakiegoś długiego pomiaru lub co tylko będziemy potrzebować. W następnej części będziemy przesyłać i wyświetlać konkretne liczby.






0 komentarze:

Prześlij komentarz