اینترنت اشیا
برای توسعه برنامههای اینترنت اشیاء (IoT) بر روی گوشی همراه، برخی از پلتفرمهای IoT معروف و مناسب برای توسعه برنامههای IoT بر روی گوشی همراه عبارتند از:
Arduino IoT Cloud:
این پلتفرم از Arduino برای توسعه پروژههای IoT استفاده میکند و به شما امکان مدیریت دستگاههای IoT و دادههای آنها را از راه دور از طریق گوشی همراه میدهد.
PlatformIO:
PlatformIO یک محیط توسعه اوپن سورس برای IoT است که از میکروکنترلرهای مختلفی از جمله ESP8266 و ESP32 پشتیبانی میکند. شما میتوانید از PlatformIO برای توسعه و مدیریت پروژههای IoT بر روی گوشی همراه استفاده کنید.
Blynk:
Blynk یک پلتفرم IoT برای ایجاد برنامههای کنترل و نظارت بر دستگاههای IoT است. شما میتوانید از اپلیکیشن Blynk بر روی گوشی همراه خود برای کنترل دستگاههای IoT استفاده کنید.
ThingSpeak:
ThingSpeak از متنباز برای ثبت و نمایش دادههای IoT استفاده میکند. شما میتوانید از اپلیکیشن ThingSpeak بر روی گوشی همراه خود برای نظارت بر دادههای IoT استفاده کنید.
Adafruit IO:
Adafruit IO یک سرویس ابری برای اتصال و کنترل دستگاههای IoT است. شما میتوانید از اپلیکیشن Adafruit IO بر روی گوشی همراه برای کنترل دستگاههای IoT استفاده کنید.
همه این پلتفرمها امکان اتصال و کنترل دستگاههای IoT از راه دور را از طریق گوشی همراه شما فراهم میکنند. انتخاب پلتفرم مناسب به ویژگیها و نیازهای پروژه شما بستگی دارد.
بله بایستی برای ارسال دیتای دریافتی از برد ESP و یا سایر بردهایی که از این دو پشتیبانی میکند، استفاده کنید. بله با هر دو زبان برنامه نویسی با متدهای ارسال دیتا مانند http , mqtt قابل اجرا است.
Arduino IoT Cloud یک پلتفرم ابری است که توسط Arduino برای مدیریت و کنترل میکروکنترلرها و سنسورها با ترکیب IOT ارائه شده است.
Arduino IoT Cloud از میکروهای مبتنی بر میکروکنترلرهای Arduino و دیگر میکروها مانند Raspberry pi , ESP8266, ESP32 پشتیبانی میکند.
بله، Arduino IoT Cloud به شما امکان کنترل سنسورهای IoT از راه دور و برنامهنویسی آنها از راه دور را فراهم میکند. شما میتوانید دادهها را به میکروها ارسال کرده و آنها را کنترل کنید.
شما میتوانید از کتابخانههای آردوینو برای اتصال و ارسال دادههای سنسورهای دستگاهتان به Arduino IoT Cloud استفاده کنید. سپس میتوانید این دادهها را در دشبورد آنلاین نمایش دهید.
بله، میکروپایتون یک زبان برنامهنویسی محبوب برای NodeMCU است و میتوانید از آن برای توسعه برنامههای NodeMCU استفاده کنید.
برای ارسال دادهها به یک سرور اینترنتی، شما میتوانید از پروتکلهای HTTP یا MQTT استفاده کنید. باید کتابخانههای مربوطه را در میکروپایتون نصب کرده و سپس دادهها را ارسال کنید.
برای ایجاد یک وبسرور با میکروپایتون بر روی NodeMCU، شما میتوانید از میکرووب (MicroWebSrv) استفاده کنید. مثال:
import MicroWebSrv
def my_web_page(request, response):
response.WriteResponseHTML("<html><body><h1>Hello, World!</h1></body></html>")
routeHandlers = [("/mywebpage", "GET", my_web_page)]
srv = MicroWebSrv.WebRoute(routeHandlers)
srv.Start(threaded=True)
برای اتصال به شبکه Wi-Fi و به دست آوردن آدرس IP در میکروپایتون، میتوانید از کتابخانه network استفاده کنید. مثال:
import network
import time
ssid = "نام_شبکه"
password = "کلمه_عبور"
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(ssid, password)
while not wlan.isconnected():
time.sleep(1)
print("متصل به شبکه Wi-Fi")
print("آدرس IP:", wlan.ifconfig()[0])
برای نصب درایور SSD1306 فایل زیر را در thonny ide با نام SSD1306.py ذخیره کنید.
from time import sleep_ms
from machine import Pin, I2C
# Constants
DISPLAYOFF = 0xAE
SETCONTRAST = 0x81
DISPLAYALLON_RESUME = 0xA4
DISPLAYALLON = 0xA5
NORMALDISPLAY = 0xA6
INVERTDISPLAY = 0xA7
DISPLAYON = 0xAF
SETDISPLAYOFFSET = 0xD3
SETCOMPINS = 0xDA
SETVCOMDETECT = 0xDB
SETDISPLAYCLOCKDIV = 0xD5
SETPRECHARGE = 0xD9
SETMULTIPLEX = 0xA8
SETLOWCOLUMN = 0x00
SETHIGHCOLUMN = 0x10
SETSTARTLINE = 0x40
MEMORYMODE = 0x20
COLUMNADDR = 0x21
PAGEADDR = 0x22
COMSCANINC = 0xC0
COMSCANDEC = 0xC8
SEGREMAP = 0xA0
CHARGEPUMP = 0x8D
EXTERNALVCC = 0x10 #0x1
SWITCHCAPVCC = 0x20 #0x2
SETPAGEADDR = 0xB0
SETCOLADDR_LOW = 0x00
SETCOLADDR_HIGH = 0x10
ACTIVATE_SCROLL = 0x2F
DEACTIVATE_SCROLL = 0x2E
SET_VERTICAL_SCROLL_AREA = 0xA3
RIGHT_HORIZONTAL_SCROLL = 0x26
LEFT_HORIZONTAL_SCROLL = 0x27
VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL = 0x29
VERTICAL_AND_LEFT_HORIZONTAL_SCROLL = 0x2A
# I2C devices are accessed through a Device ID. This is a 7-bit
# value but is sometimes expressed left-shifted by 1 as an 8-bit value.
# A pin on SSD1306 allows it to respond to ID 0x3C or 0x3D. The board
# I bought from ebay used a 0-ohm resistor to select between "0x78"
# (0x3c << 1) or "0x7a" (0x3d << 1). The default was set to "0x78"
DEVID = 0x3c
# I2C communication here is either <DEVID> <CTL_CMD> <command byte>
# or <DEVID> <CTL_DAT> <display buffer bytes> <> <> <> <>...
# These two values encode the Co (Continuation) bit as b7 and the
# D/C# (Data/Command Selection) bit as b6.
CTL_CMD = 0x80
CTL_DAT = 0x40
class SSD1306(object):
def __init__(self, height=64, external_vcc=True, i2c_devid=DEVID):
self.external_vcc = external_vcc
self.height = 32 if height == 32 else 64
self.pages = int(self.height / 8)
self.columns = 128
self._row = 0
self._col = 0
self._x = 0
self._y = 0
self.devid = i2c_devid
self.offset = 1
self.cbuffer = bytearray(2)
self.cbuffer[0] = CTL_CMD
self.i2c = I2C(scl=Pin(2), sda=Pin(16), freq=400000)
self.buffer = bytearray(self.offset + self.pages * self.columns)
def clear(self):
self.buffer = bytearray(self.offset + self.pages * self.columns)
if self.offset == 1:
self.buffer[0] = CTL_DAT
def write_command(self, command_byte):
self.cbuffer[1] = command_byte
self.i2c.writeto(self.devid, self.cbuffer)
def invert_display(self, invert):
self.write_command(INVERTDISPLAY if invert else NORMALDISPLAY)
def display(self):
self.write_command(COLUMNADDR)
self.write_command(0)
self.write_command(self.columns - 1)
self.write_command(PAGEADDR)
self.write_command(0)
self.write_command(self.pages - 1)
self.i2c.writeto(self.devid, self.buffer)
def set_pixel(self, x, y, state):
index = x + (int(y / 8) * self.columns)
if state:
self.buffer[self.offset + index] |= (1 << (y & 7))
else:
self.buffer[self.offset + index] &= ~(1 << (y & 7))
def init_display(self):
chargepump = 0x10 if self.external_vcc else 0x14
precharge = 0x22 if self.external_vcc else 0xf1
multiplex = 0x1f if self.height == 32 else 0x3f
compins = 0x02 if self.height == 32 else 0x12
contrast = 0x9f # 0x8f if self.height == 32 else (0x9f if self.external_vcc else 0x9f)
data = [DISPLAYOFF,
SETDISPLAYCLOCKDIV, 0xF0,
SETMULTIPLEX, 0x3f,
SETDISPLAYOFFSET, 0x00,
SETSTARTLINE | 0x00,
CHARGEPUMP, 0x14,
MEMORYMODE, 0x00,
SEGREMAP | 0x00,
COMSCANINC,
SETCOMPINS, 0x12,
SETCONTRAST, 0xCF,
SETPRECHARGE, 0xF1,
DISPLAYALLON_RESUME,
NORMALDISPLAY,
0x2e, # stop scroll
DISPLAYON]
for item in data:
self.write_command(item)
# self.clear()
self.display()
def poweron(self):
if self.offset == 1:
sleep_ms(10)
else:
self.res.high()
sleep_ms(1)
self.res.low()
sleep_ms(10)
self.res.high()
sleep_ms(10)
def poweroff(self):
self.write_command(DISPLAYOFF)
def contrast(self, contrast):
self.write_command(SETCONTRAST)
self.write_command(contrast)
def set_start_end_cols(self, start_col=0, end_col=None):
if end_col is None:
end_col = self.columns - 1
if start_col < 0 or start_col > self.columns - 1:
raise ValueError('Start column must be between 0 and %d.' % (self.columns - 1,))
if end_col < start_col or end_col > self.columns -1:
raise ValueError('End column must be between the start column (%d) and %d.' % (start_col, self.columns - 1))
self.write_command(COLUMNADDR)
self.write_command(start_col) # Start column
self.write_command(end_col) # End column
def set_start_end_pages(self, start_page=0, end_page=None):
if end_page is None:
end_page = self.pages - 1
if start_page < 0 or start_page > self.pages - 1:
raise ValueError('Start page must be between 0 and %d.' % (self.pages - 1,))
if end_page < start_page or end_page > self.pages - 1:
raise ValueError('End page must be between the start page (%d) and %d.' % (start_page, self.pages - 1))
self.write_command(PAGEADDR)
self.write_command(start_page) # Page start address. (0 = reset)
self.write_command(end_page) # Page end address.
def p_char(self, ch):
fp = (ord(ch)-0x20) * 5
char_buf = bytearray([0,0,0,0,0])
f = open('font5x7.fnt','rb')
f.seek(fp)
char_buf = f.read(5)
bp = self.columns*self._row + 6*self._col + 1
for x in range (0,5):
self.buffer[bp+x] = char_buf[x]
self.buffer[bp+5] = 0 # put in inter char space
self._col += 1
if (self._col>int(self.columns/6 - 1)):
self._col = 0
self._row += 1
if (self._row>int(self.height/8 - 1)):
self._row = 0
def p_string(self, str):
for ch in (str):
self.p_char(ch)
def pixel(self,x,y,fill):
r = int(y/8)
i = r * self.columns + x + self.offset
b = y % 8
self.buffer[i] = self.buffer[i] | ( 1 << b )
در ابتدا بایستی Nodejs آخرین ورژن را نصب کنید.
سپس کامند زیر را در CMD ویندوز وارد کنید تا مراحل نصب شود.
برای اجرا در نهایت کامند زیر را وارد کنید تا آی پی برای ورود به Node-RED اعلام شود.
Node-red