آموزش IOT : کنترل رله ها توسط WIFI

کنترل وسایل توسط موبایل یک پروژه جذاب و خلاقانه برای یادگیری تازه کاران و علاقهمندان الکترونیک می باشد برای اولین بار در گیل الکترونیک اموزشی رایگان فراهم شده است تا در کنار یادگیری راه اندازی ماژول wifi و برنامه نویسی AVR بتوانید برنامه نویسی ساخت یک اپلیکیشن اندرویدی را نیز فرا بگیرید.برای جلوگیری از سخت شدن مطالب تا حد امکان همه چیز در ساده ترین حالت ممکن قرار گرفته است تا بتوانید زودتر به نتیجه دلخواه برسید.همچنین در ادامه به معرفی اولین برد IOT تیم گیل الکترونیک نیز می پردازیم که افراد علاقه مند بدون درگیر شدن با جزییات سخت افزار و پیچیدگی های ان راحت تر بتوانند برنامه نویسی را شروع کنند.

به معرفی اولین اموزش IOT می پردازیم , هدف ما ساخت یک برنامه اندرویدی توسط برنامه Basic 4 Android و اتصال به ماژول Esp8266 و کنترل رله ها توسط WIFI می باشد.

قبل از شروع اموزش به معرفی برد پایه ی IOT خود (ورژن : 1) و امکانات ان می پردازیم:

ویژگی ها :

دارای 4 رله ی 220 ولتی

دارای دو رگولاتور سوییچینگ 3.3 و 5 ولتی با تامین جریان 3 امپر با تحمل ولتاژ ورودی تا 30 ولت بهمراه led نمایانگر

قابلیت اتصال ترانس 9 , 12 , 16 و 18 ولتی از طریق ترمینال یا جک پاور بهمراه فیلتر نویزگیر و خازن صافی یا استفاده از دیگر منابع ولتاژ DC

دارای فیوز روی بردی (محافظت مدار در برابر اتصال کوتاه) و خازن های نویزگیر برای تامین مدارات خارجی .دو تغذیه 3.3 و 5 ولتی.

دارای ماژول Wifi مدل Esp8266  بهمراه مدارات و کلیدهای مورد نیاز برای ریختن برنامه اردوینو بصورت مستقیم روی ماژول

دارای میکروکنترلر ATmega128 روی برد بهمراه سوکت پروگرام و بوت لودر

بخاطر اینکه سریال پورت اصلی میکروکنترلر Atmega128 (رابط ارتباطی بین دو میکروکنترلر) در زمان پروگرام کردن با سریال Esp8266 تداخل می کند جامپر روی برد قرار داده شده است تا در صورت نیاز برداشته شود.

از انجایی که تعداد پایه های Esp8266 کم می باشد و بخاطر تحمل حداکثر ولتاژ 3.3 ولتی اسیب پذیرتر از میکروکنترلرهای AVR می باشد و بسیاری از سنسورها با ولتاژ 5 ولت کار می کنند برای حل این مشکل یک میکروکنترلر دیگر به مدل Atmega128 روی برد قرار داده شده است که اکثر پایه های ان در دسترس کاربر می باشد.

حال کاربر به سه روش می تواند کار کند:

  1. میکروکنترلر Esp8266 در حالتMaster باشد و برنامه اردوینو Esp8266 مستقیم روی esp ریخته شود و میکروکنترلر Atmega128 در نقش Slave , گسترش پایه و دیگر امکانات ایفای نقش کند.
  2. میکروکنترلر Atmega128 در حالت Master باشد و ماژول Esp8266 را بصورت At Command کنترل نماید (در این روش firmware مخصوص At Command باید روی ماژول نصب باشد که بصورت پیش فرض معمولا نصب می باشد). (نکته : با برنامه نویسی ماژول esp8266 توسط اردوینو firmware پیش فرض ان پاک می شود.)
  3. هر دو میکروکنترلر بصورت مستقل وظایفی را انجام دهند و از طریق پروتکل سریال با یکدیگر تبادل پیام نمایند.

 

 

دارای حافظه EEPROM 512 کیلوبیتی روی برد قابل دسترس توسط میکروکنترلر Atmega128

دارای ماژول ساعت و تاریخ دقیق DS3231 بهمراه باتری بکاپ روی برد قابل دسترس توسط میکروکنترلر Atmega128

دارای 5 ورودی مخصوص کلید push button قابل دسترس توسط میکروکنترلر Atmega128

در دسترس بودن پایه های مخصوص اتصال نمایشگر گرافیکی GLCD یا استفاده برای اهداف دیگر

در دسترس بودن 8 پایه ADC میکروکنترلر Atmega128 بصورت ترمینال

دارای سنسور DHT11 روی برد

دارای سه ترمینال بهمراه مقاومت پول اپ 10 کیلو اهم برای اتصال سنسورهایی با رابط one-wire

در دسترس بودن پروتکل I2C و SPI بصورت ترمینال و همچنین 5 پایه Chip select مخصوص spi برای کار با 5 رابط spi مختلف

دارای دو ترمینال مخصوص برای اتصال سنسورهایی با رابط i2c نرم افزاری بهمراه مقاومت پول اپ (یا دیگر موارد استفاده) و یک ترمینال یک پایه بهمراه مقاومت پول اپ و همچنین این پایه ها به خروجی تایمر صفر , یک و دو نیز  متصل هستند تا در صورت نیاز از ان استفاده شود.

دارای ترمینال زمین برای اتصال مدارات خارجی به GND

قابلیت برنامه نویسی با اردوینو و تنوع در اتصال سنسورهای مختلف , در دسترس بودن پایه ها و همچنین وجود ماژول Esp ان را مناسب تازه کاران برای شروع پروژه های IOT می کند.

 

 

<<<<<<<<<< در صورت نیاز می توانید برد را سفارش دهید >>>>>>>>>>

 

به ادامه ی اموزش خود می پردازیم :

در اولین مثال با برد معرفی شده در بالا می خواهیم esp8266 را در نقش سرور در پروتکل TCP/IP تعریف نماییم.برنامه نویسی بصورت مستقیم روی ماژول صورت می گیرد و همچنین میکروکنترلر Atmega128 در نقش Slave وظیفه ی کنترل رله ها را بر عهده دارد.

برنامه Esp8266 و توضیحات ان: (در صورت نصب نبودن پکیج Esp8266 در اردوینو اموزش های قبلی ما را دنبال نمایید.)

مدل انتخابی ماژول در اردوینو : NodeMcu (ESP-12E)

#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>

تعیین نام و پسورد دلخواه ماژول Esp8266

AsyncClient* mclient;
static std::vector<AsyncClient*> clients;

تعریف ارایه ای از جنس کلاینت سوکت برای نگه داشتن کلاینتهای متصل

static void handleData(void* arg, AsyncClient* client, void *data, size_t len) {

event دریافت دیتا: در زمان دریافت دیتا اجرا شده و ما می توانیم دیتای دریافتی خود را بخوانیم.

mclient = client;

  String _get = (char*)(data);

تبدیل دیتا به نوع String

  if ((_get.indexOf("[") != -1) && (_get.indexOf("]") != -1)) {//[R1:N] , [R1:F]

برای تمایز راحت تر دیتای خود ان را در بین  براکت[] قرار می دهیم.

      int _start = _get.indexOf("[");
      int _end =   _get.indexOf("]");

پیدا کردن موقعیت کارکتر براکت اول و اخر در رشته دیتای خود.

Serial.println(_get.substring(_start + 1 , _end));

جدا سازی دیتای داخل ان و ارسال ان به میکروکنترلر Atmega128

      if (mclient->space() > 32 && mclient->canSend()) {

          char rep[5] = {'O', 'K', '\r', '\n'};

ارسال OK به کلاینت (برنامه موبایل و یا هر کلاینت متصل دیگر …)

mclient->add(rep , 4);
          mclient->send();
      }
  }
  else {
    client->close();
  }

}

static void handleError(void* arg, AsyncClient* client, int8_t error) {}
static void handleDisconnect(void* arg, AsyncClient* client) {}
static void handleTimeOut(void* arg, AsyncClient* client, uint32_t time) {}

static void handleNewClient(void* arg, AsyncClient* client) {
  //Serial.printf("client connected:, ip: %s", client->remoteIP().toString().c_str());
  clients.push_back(client);
  client->onData(&handleData, NULL);
  client->onError(&handleError, NULL);
  client->onDisconnect(&handleDisconnect, NULL);
  client->onTimeout(&handleTimeOut, NULL);

تابع تعریف event های مختلف .در سوکت Tcp/IP حالتهای مختلفی مثل اتصال کلاینت , disconnect , دریافت دیتا و … پیش می اید و شما طبق نیاز می توانید انها را در برنامه خود استفاده نمایید.

}



void setup() {

  Serial.begin(115200);

تنظیم بادریت ارتباطی با میکروکنترلر Atmega128

  WiFi.mode(WIFI_AP);

قرارگیریEsp  در حالت اکسس پوینت

WiFi.softAP(ssid , pass);

تنظیم نام و پسورد اکسس پوینت

AsyncServer* server;

تعریف شئی سرور از نوع اسنکرون

  server = new AsyncServer(3636);

تنظیم پورت ارتباطی سوکت به دلخواه خود

  server->onClient(&handleNewClient, server);

تعریف اولین event که کلاینت جدید را هندل می کند.

  server->begin();

شروع بکار سرور.

}


void loop() {
}

در ادامه نیاز به تکمیل برنامه Atmega128 داریم :

پکیج رسمی اردوینو همه ی پایه های میکروکنترلر Atmega128 را ساپورت نمی کند و ما در اینجا پکیج Mega Core را نصب کرده ایم و بوت لودر ان را روی میکروکنترلر قرار داده ایم.

نوع مدل انتخابی میکروکنترلر در اردوینو : Atmega128

#include <EEPROM.h>

برای حفظ وضعیت پایه های رله در زمان روشن و خاموشی نیاز به حافظه غیر فرار Eeprom داریم.

#define R1 20
#define R2 21
#define R3 22
#define R4 23

تعریف پایه های رله متصل به میکروکنترلر.

Serial.begin(115200);

تنظیم بادریت سریال ارتباطی.

pinMode(R1 , OUTPUT);
  pinMode(R2 , OUTPUT);
  pinMode(R3 , OUTPUT);
  pinMode(R4 , OUTPUT);

تعریف نقش پایه ها در حالت خروجی.

  digitalWrite(R1 , LOW);
  digitalWrite(R2 , LOW);
  digitalWrite(R3 , LOW);
  digitalWrite(R4 , LOW);

قرار دادن پایه ها در حالت خاموش بصورت پیش فرض.

  if (EEPROM.read(R1) == 0xFF) {
    EEPROM.write(R1 , 0);
  }
  if (EEPROM.read(R2) == 0xFF) {
    EEPROM.write(R2 , 0);
  }
  if (EEPROM.read(R3) == 0xFF) {
    EEPROM.write(R3 , 0);
  }
  if (EEPROM.read(R4) == 0xFF) {
    EEPROM.write(R4 , 0);
  }

در زمان اولین استفاده خانه های eeprom با عدد 255 یا 0xFF هگز پر هستند و ما انها را با مقدار پیش فرض صفر پر می کنیم.

هر رله از یک ادرس در eeprom برای حفظ وضعیت خود استفاده می کند و ما در اینجا بصورت دلخواه ادرس حافظه هر رله را همان شماره پایه رله متصل به میکروکنترلر بخاطر راحتی کار در نظر گرفته ایم.

  checkMemory();

وظیفه ی تابع فوق خاموش و روشن کردن رله ها طبق وضعیت قبلی شان در حافظه می باشد.

}

void loop() {

  if (Serial.available()) {

در صورتی که دریافتی از پورت سریال داریم:

    String _data = "";

    while (Serial.available()) {

تا وقتی دیتای دریافتی داریم منتظر می مانیم:

      char str = (char)Serial.read();

تبدیل بایت دریافتی به نوع Char و ریختن در متغییر String

      _data += str;


      if (_data.indexOf("\r") != -1 || _data.indexOf("\n") != -1) {

اگر به انتهای دیتا رسیدیم.کارکتر new line یا اینتر توسط Esp ارسال می شود.

فرمت قراردادی دیتای تحویل شده به ما :

R1:1

یعنی رله یک را روشن کن.

       R4:0

یعنی رله 4 را خاموش کن.

بعد از کارکتر R شماره رله ای که با ان کار داریم و در اخرین کارکتر وضعیت ان یعنی خاموشی یا روشن بودن را مشخص می کنیم.

شما می توانید به دلخواه خود ان را تغییر دهید.

        int pos = _data.indexOf("R");

دنبال موقعیت مکانی کارکتر R در رشته دریافتی می گردیم.

        int relayNumber = (_data.charAt(pos + 1)) - 48;

تبدیل کارکتر شماره رله (از یک تا چهار .چون 4 عدد رله داریم) به نوع int با کم کردن از عدد 48

        int state =       (_data.charAt(pos + 3)) - 48;

و همچنین تبدیل کارکتر وضعیت رله به نوع int

        switch (relayNumber) {
          case 1:
            digitalWrite(R1 , state);
            EEPROM.write(R1 , state);
            break;
          case 2:
            digitalWrite(R2 , state);
            EEPROM.write(R2 , state);
            break;
          case 3:
            digitalWrite(R3 , state);
            EEPROM.write(R3 , state);
            break;
          case 4:
            digitalWrite(R4 , state);
            EEPROM.write(R4 , state);
            break;
          default: break;
        }

تغییر وضعیت رله و حفظ وضعیت ان در حافظه و خروج از حلقه در ادامه برنامه.

        break;
      }

    }

  }


  delay(1);

}

void checkMemory() {

  if (EEPROM.read(R1) == 0) {
    digitalWrite(R1 , LOW);
  }
  else {
    digitalWrite(R1 , HIGH);
  }

  if (EEPROM.read(R2) == 0) {
    digitalWrite(R2, LOW);
  }
  else {
    digitalWrite(R2 , HIGH);
  }

  if (EEPROM.read(R3) == 0) {
    digitalWrite(R3 , LOW);
  }
  else {
    digitalWrite(R3 , HIGH);
  }

  if (EEPROM.read(R4) == 0) {
    digitalWrite(R4 , LOW);
  }
  else {
    digitalWrite(R4 , HIGH);
  }
}

به معرفی برنامه Basic4Android می پردازیم: یک برنامه رایگان از نوع Rapid Development می باشد و از زبان برنامه نویسی بیسیک پشتیبانی می کند تا افراد تازه کار بتوانند سریع برنامه اندرویدی خود را بسازند و درگیر پیچیدگی های توسعه برنامه نشوند.

بعد از باز کردن برنامه برای ساخت پروژه از گزینه New زیر منوی Default را انتخاب می کنیم.

و پروژه را با یک نام در یک مسیر دلخواه ذخیره می کنیم.

ابتدا به شروع ساخت رابط گرافیکی برنامه می پردازیم, از مسیر

Designer -> open Designer

را انتخاب :

 

بصورت پیش فرض یک باتن روی صفحه ADD شده است و ما برای کنترل رله ها نیاز به سه عدد باتن دیگر داریم:

از گزینه Add View باتن را انتخاب می کنیم:

بخاطر تنوع سایزهای موبایل و تبلت باید سعی کنیم ارتفاع و پهنای عناصر و همچنین موقعیت مکانی انها را طوری تنظیم نماییم تا در سایزهای مختلف نمایشگر با مشکل روبرو نشویم.ممکن است هر کسی به سلیقه خود روش یا فرمولی متفاوت را پیش ببرد:

در همین صفحه designer در قسمت script می توانیم اشیای خود را تنظیم نماییم.

'All variants script
AutoScaleAll

Button1.Width = 120dip

تنظیم پهنای باتن به اندازه ی ثابت dpi 120

Button1.Height = (100%y - (5 * 10dip)) / 4

برای رسپانسیو کردن و اینکه باتن ما طبق اندازه ی نمایشگر و فضای موجود کوچک و بزرگ شود از فرمول فوق استفاده کرده ایم:

100%y:

یعنی 100 درصد فضای نمایشگر در حالت عمودی.

بخاطر اینکه 4 باتن را می خواهیم عمودی زیر یکدیگر قرار دهیم به اندازه 10 dip (یا هر مقدار دلخواه)هر باتن نسبت به عنصر بعدی و قبلی خود یا لبه صفحه فاصله قرار می دهیم تا چسبیدگی پیش نیاید (5 گپ بین چهار باتن داریم که باید در فرمول بالا لحاظ شود).پس فضای کلی را منحی مجموع فضای فاصله بین عناصر(گپ) می کنیم.

مقدار بدست امده را به 4 تقسیم می کنیم زیرا 4 باتن داریم و از فضای بدست امده هر کدام درصدی مساوی به ارتفاع خود تخصیص می دهند.

Button1.Left = 50%x - (Button1.Width / 2)
50%x:

یعنی نصف فضای نمایشگر در حالت افقی.

برای اینکه شئی ما در حالت افقی همیشه در وسط صفحه قرار بگیرد از فرمول فوق استفاده کرده ایم.

شما می توانید طبق فرمول شخصی خود هر درصدی را از صفر تا 100 انتخاب نمایید.

Button1.Top = 10dip

خصیصه ی top فاصله ی شئی از لبه ی بالایی صفحه را مشخص می کند. چون اولین عنصر ما باتن اول می باشد ان را به میزان 10 dip تنظیم کرده ایم.

Button2.Width = 120dip
Button2.Height = (100%y - (5 * 10dip)) / 4
Button2.Left = 50%x - (Button1.Width / 2)
Button2.Top = Button1.Height + Button1.Top + 10dip
چون باتن دوم ما زیر باتن اول قرار دارد خصیصه ی top ان از مقدار ارتفاع ,  Top و 10 dip فضای گپ باتن اول حساب می شود.

Button3.Width = 120dip
Button3.Height = (100%y - (5 * 10dip)) / 4
Button3.Left = 50%x - (Button1.Width / 2)
Button3.Top = Button2.Height + Button2.Top + 10dip

Button4.Width = 120dip
Button4.Height = (100%y - (5 * 10dip)) / 4
Button4.Left = 50%x - (Button1.Width / 2)
Button4.Top = Button3.Height + Button3.Top + 10dip

برای تمام دیگر عناصر add شده به صفحه باید خصوصیات انها تنظیم شود.

 

برای دیدن نتیجه اسکریپت نویسی خود دکمه play را می زنیم در صورتی که خطایی نباشد چیدمان عناصر در صفحه انجام می شود.

در قسمت Text در properties می توان متن نمایشی باتن را بدلخواه تغییر دهید البته در برنامه اصلی هم می توان تمام خصیصه های شئی را تغییر داد.

برای اینکه عناصر را در صفحه گرافیکی انتخاب نمایید تا بتوانید به پنجره properties ان دسترسی داشته باشید از منوی windows گزینه properties را انتخاب و سپس  بر روی شئی مورد نظر کلیک نمایید.

برای تولید event کلیک روی باتن راست کلیک کرده و گزینه click از generate را انتخاب نمایید.

در اخر بر روی گزینه بستن پنجره کلیک و در پنجره ی باز شده گزینه yes را می زنیم.

 

در فایل main برنامه تنظیمات را بصورت زیر انجام دهید و کدهای اضافی را حذف نمایید :

#Region  Project Attributes 
	#ApplicationLabel: TAB

تعیین نام اپلیکیشن بدلخواه خود بهتر است اسم کوتاه انتخاب شود.

#VersionCode: 1
	#VersionName: 1.0

مشخص کردن ورژن و ساب ورژن برنامه بدلخواه خود.

'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: portrait

تنظیم جهت نمایش برنامه بصورت عمودی یا افقی. Portrait یا landscape

#CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
	#FullScreen: False
	#IncludeTitle: False

مشخص کردن تمام صفحه بودن برنامه و فعال کردن title برای برنامه در صورت نیاز.

#End Region

Sub Process_Globals
	
End Sub

Sub Globals

Private Button1 As Button
Private Button2 As Button
Private Button3 As Button
Private Button4 As Button

تعریف اعلان عناصر گرافیکی خود . طبق اسمی که در صفحه گرافیکی برای عنصر گرافیکی خود انتخاب کرده اید.

End Sub

Sub Activity_Create(FirstTime As Boolean)
	
	Activity.LoadLayout("Layout")

صفحه گرافیکی برنامه بصورت پیش فرض به اسم layout در زمان ساخت برنامه موجود بود و ما بر روی همان صفحه عناصر گرافیکی را اضافه کردیم.در اینجا صفحه فوق را فراخوانی می کنیم.

Button1.Text = "Relay 1"

متن دلخواه

Button1.Typeface = Typeface.DEFAULT_BOLD

تنظیم فونت .انتخاب فونت پیش فرض سیستم

Button1.TextSize = 14

انتخاب سایز متن نمایشی روی باتن

	Button1.TextColor = Colors.RGB(200,200,200)

تنظیم رنگ باتن طبق RGB کد

	Button1.Color = Colors.RGB(20,20,200)

تنظیم رنگ بک گراند باتن طبق RGB کد

	Button1.Gravity = Gravity.CENTER

تنظیم نمایش متن در مرکز باتن

Button2.Text = "Relay 2"
	Button2.Typeface = Typeface.DEFAULT_BOLD
	Button2.TextSize = 14
	Button2.TextColor = Colors.RGB(200,200,200)
	Button2.Color = Colors.RGB(20,20,200)
	Button2.Gravity = Gravity.CENTER
	
	Button3.Text = "Relay 3"
	Button3.Typeface = Typeface.DEFAULT_BOLD
	Button3.TextSize = 14
	Button3.TextColor =  Colors.RGB(200,200,200)
	Button3.Color = Colors.RGB(20,20,200)
	Button3.Gravity = Gravity.CENTER
	
	Button4.Text = "Relay 4"
	Button4.Typeface = Typeface.DEFAULT_BOLD
	Button4.TextSize = 14
	Button4.TextColor = Colors.RGB(200,200,200)
	Button4.Color = Colors.RGB(20,20,200)
	Button4.Gravity = Gravity.CENTER
	

End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Private Sub Button1_Click

در صورت کلیک روی باتن اول این تابع انتخاب می شود.

End Sub

Private Sub Button2_Click

در صورت کلیک روی باتن دوم این تابع انتخاب می شود.

End Sub

Private Sub Button3_Click

در صورت کلیک روی باتن سوم این تابع انتخاب می شود.

End Sub

Private Sub Button4_Click

در صورت کلیک روی باتن چهارم این تابع انتخاب می شود.

End Sub

در قسمت library manager  تیک کتابخانه های مورد نیاز را بزنید :

برای خاموش کردن رله ها می توانیم 4 باتن دیگر اضافه کنیم ولی برای جلوگیری از شلوغ شدن برنامه تابع longClick هر باتن را نیز اضافه می کنیم تا بتوانیم رله ها را خاموش کنیم. اگر به مدت طولانی باتن ها را نگه دارید تابع longClick اجرا می شود.برنامه در صورت روشن بودن وای فای برد خودکار به برد متصل می شود.در صورت نیاز می توانید باتن های جداگانه ای برای اتصال و disconnect به برنامه اضافه نمایید.

 

در فایل Starter  که مربوط به سرویس برنامه می باشد (بخشی از برنامه که در پس زمینه اجرا می شود) می توانیم برنامه مربوط به wifi را اضافه کنیم:

#Region  Service Attributes 
	#StartAtBoot: False
	#ExcludeFromLibrary: True
#End Region

Sub Process_Globals


	Dim Client As Socket
	
	Dim SocketIO As AsyncStreams

تعریف شئی کلاینت و سوکت

Dim WifiSendData As String = ""

متغییر برای نگه داری دیتای ارسال شده از صفحه main برنامه

End Sub

Sub Service_Create

End Sub

Sub Service_Start (StartingIntent As Intent)
	Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases.
End Sub

Sub Service_TaskRemoved

End Sub

'Return true to allow the OS default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
	Return True
End Sub

Sub Service_Destroy


End Sub


Sub Wifi_Send

تابع ارسال دیتا توسط wifi

Try
		Dim temp As String = WifiSendData
								
		Dim sb As StringBuilder
		sb.Initialize
		sb.Append(temp).Append(CRLF)

الحاق کارکتر اینتر به انتهای رشته دیتای خود توسط روش StringBuilder

Dim temp As String = sb.ToString()
					
		SocketIO.Write(temp.GetBytes("UTF8"))
			

ارسال دیتا بصورت مجموعه ای از بایت ها

Catch
		Log(LastException)
		ToastMessageShow("خطا در ارسال اطلاعات !",False)
	End Try
	
		
End Sub



Private Sub SocketIOEvent_NewData(Buffer() As Byte)
	
	Dim WifiRecieveData As String = BytesToString(Buffer,0,Buffer.Length,"UTF-8")

	If WifiRecieveData.Contains("OK") = True Then
		
		ToastMessageShow("دستور ارسال شد.",False)

وقتی esp8266 داده را دریافت کند OK را بر می گرداند و ما با بررسی دیتای دریافتی در رویداد فوق نتیجه را به کاربر اطلاع می دهیم.

End If
			
End Sub


Sub client_connect

تابع اتصال به سرور

socket_close
		
	Client.Initialize("ClientEvent")
	
	Client.Connect("192.168.4.1" , 3636 , 5000)

تنظیم ip و شماره پورت (مطابق با مقادیر تنظیم شده در سمت esp8266) و در ارگومان سوم زمان timeout را به میلی ثانیه تنظیم می کنیم.

End Sub




Private Sub ClientEvent_Connected(state As Boolean)
	
	Try
			
		If state = True Then
				
			SocketIO.Initialize(Client.InputStream,Client.OutputStream,"SocketIOEvent")

راه اندازی stream ورودی و خروجی برای ارسال و دریافت دیتا

ToastMessageShow("متصل شد.",False)

در صورت اتصال یا پایان timeout رویداد اجرا شده و نتیجه را به کاربر اطلاع می دهیم.

Else

			ToastMessageShow("خطا در اتصال .",False)
			
			client_connect
				
		End If
	
	Catch
		Log(LastException)
	End Try
			
End Sub


Private Sub socket_close
	
	Try

بستن سوکت

Client.Close

		SocketIO.Close	

	Catch
		Log(LastException)
	End Try

End Sub

برنامه ی کامل : بخاطر سادگی برنامه از توضیح اضافی بخش های جدید صرف نظر می کنیم.

#Region  Project Attributes 
	#ApplicationLabel: TAB
	#VersionCode: 1
	#VersionName: 1.0
	'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: portrait
	#CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
	#FullScreen: False
	#IncludeTitle: False
#End Region

Sub Process_Globals
	
End Sub

Sub Globals
	
	Private Button1 As Button
	Private Button2 As Button
	Private Button3 As Button
	Private Button4 As Button

	
End Sub

Sub Activity_Create(FirstTime As Boolean)
	
	Activity.LoadLayout("Layout")
	
	Button1.Text = "Relay 1"
	Button1.Typeface = Typeface.DEFAULT_BOLD
	Button1.TextSize = 14
	Button1.TextColor = Colors.RGB(200,200,200)
	Button1.Color = Colors.RGB(20,20,200)
	Button1.Gravity = Gravity.CENTER
	
	Button2.Text = "Relay 2"
	Button2.Typeface = Typeface.DEFAULT_BOLD
	Button2.TextSize = 14
	Button2.TextColor = Colors.RGB(200,200,200)
	Button2.Color = Colors.RGB(20,20,200)
	Button2.Gravity = Gravity.CENTER
	
	Button3.Text = "Relay 3"
	Button3.Typeface = Typeface.DEFAULT_BOLD
	Button3.TextSize = 14
	Button3.TextColor =  Colors.RGB(200,200,200)
	Button3.Color = Colors.RGB(20,20,200)
	Button3.Gravity = Gravity.CENTER
	
	Button4.Text = "Relay 4"
	Button4.Typeface = Typeface.DEFAULT_BOLD
	Button4.TextSize = 14
	Button4.TextColor = Colors.RGB(200,200,200)
	Button4.Color = Colors.RGB(20,20,200)
	Button4.Gravity = Gravity.CENTER
	
	
	Starter.client_connect
	
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub


Private Sub Button1_Click
	
	
	Starter.WifiSendData = "[R1:1]"
	
	Starter.Wifi_Send
	
	ToastMessageShow("دستور روشن کردن",False)
	
End Sub

Private Sub Button2_Click
	
	
	Starter.WifiSendData = "[R2:1]"
	
	Starter.Wifi_Send
	
	ToastMessageShow("دستور روشن کردن",False)
	
End Sub

Private Sub Button3_Click
	
	
	Starter.WifiSendData = "[R3:1]"
	
	Starter.Wifi_Send
	
	ToastMessageShow("دستور روشن کردن",False)
	
End Sub

Private Sub Button4_Click
	
	
	Starter.WifiSendData = "[R4:1]"
	
	Starter.Wifi_Send
	
	ToastMessageShow("دستور روشن کردن",False)
End Sub


Private Sub Button1_LongClick
	
	
	Starter.WifiSendData = "[R1:0]"
	
	Starter.Wifi_Send
	
	ToastMessageShow("دستور خاموش کردن",False)
	
End Sub

Private Sub Button2_LongClick
	
	Starter.WifiSendData = "[R2:0]"
	
	Starter.Wifi_Send
	
	ToastMessageShow("دستور خاموش کردن",False)
	
End Sub

Private Sub Button3_LongClick
	
	
	Starter.WifiSendData = "[R3:0]"
	
	Starter.Wifi_Send
	
	ToastMessageShow("دستور خاموش کردن",False)
	
End Sub

Private Sub Button4_LongClick
	
	Starter.WifiSendData = "[R4:0]"
	
	Starter.Wifi_Send
	
	ToastMessageShow("دستور خاموش کردن",False)
	
End Sub

با انتخاب گزینه   Release و زدن ایکن  playدر مسیر iotBoardTest\IOTTestApp\Objects پوشه پروژه خود می توانید فایل apk  را دریافت کنید.

 

اگر به این مسیر رسیدید به شما تبریک می گوییم شما موفق شدید اولین برنامه اندرویدی و شاید اولین برنامه IOT خود را نوشته باشید.

در صورت نیاز به تغییرات و ساخت برد دلخواه خود می توانید با ما در تماس باشید.

 

در ادامه می توانید فایل برنامه ها و apk تست برنامه را دریافت نمایید.

دانلود فایل

دیدگاهتان را بنویسید!

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

گیل الکترونیک
سبد خرید
empty basket

هیچ محصولی در سبد خرید نیست.