Smart Piscina Com IoT Ionic Dweet E DragonBoard

产品信息:

Smart Piscina Com IoT 是一款物联网架构产品,
使用 Ionic 可以控制和监控游泳池,
Dweet 和 DragonBoard 技术。 它包括像这样的组件
链接器夹层、96Boards GPIO 和 Py-Spidev。 产品
允许用户监控治疗状态、泵状态、
水库状况和水池的 pH 值。 该产品还
包括一个 Dweet 提供程序,使用户能够将数据发送到
Dweet.io 平台进一步分析。

产品使用说明:

要使用 Smart Piscina Com IoT 产品,请遵循这些
指示:

  1. 通过运行以下命令更新和升级软件
    终端中的命令:
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get dist-upgrade
  2. 通过运行以下命令安装其他组件
    在终端:
    sudo apt-get install gedit
    sudo apt-get install python-pip
    sudo apt-get install build-essential autoconf automake
    libtool-bin pkg-config python-dev

    git clone
    https://github.com/jackmitch/libsoc.git

    cd libsoc
    sudo autoreconf -i
    sudo ./configure --enable-python=2 --enableboard=
    dragonboard410c --with-board-configs

    sudo make
    sudo make install
    sudo ldconfig /usr/local/lib
    git clone
    https://github.com/96boards/96BoardsGPIO.git

    cd 96BoardsGPIO/
    sudo ./autogen.sh
    sudo ./configure
    sudo make
    sudo make install
    sudo ldconfig
    git clone https://github.com/doceme/pyspidev.git
    cd py-spidev
    sudo python setup.py install
    sudo ldconfig
  3. 编辑 libsoc.conf file 通过运行以下命令
    终点站:
    sudo gedit /usr/local/etc/libsoc.conf
    更新 file 内容如下:
    { status_tratamento: 0, ligadesliga_bomba: 0, status_bomba:0,
    status_reservatorio:0, PH_setpoint:6, PH_valor: 4 }
  4. 通过在中运行以下命令来安装请求库
    终点站:
    sudo pip install requests
  5. 通过导入 spidev、time、Dweet、gpio 和
    通用输入输出接口。 运行必要的功能来控制和监视
    游泳池。 对于前ample,使用readPH函数读取pH值
    池的价值。 使用 liga_des_bomba 函数打开/关闭
    泵。 使用 atualiza_sp 函数更新 pH 设定值
    价值。 使用 dweetPost 函数发送数据到 Dweet.io
    进一步分析的平台。

教科书
Smart Piscina Com IoT – Ionic、Dweet E DragonBoard
来自 rxidieh
简介
Apresento aqui uma solução para monitoramento e tratamento de piscinas de maneira remota, que poderia ser usado tanto pelo proprietário de um imóvel, como por algum piscineiro que poderia veri car remotamente diversas piscinas as quais ele atende。 在 Qualcom 的 DragonBoard 和 96boards 的 Linker Mezanine 上使用硬件。 在 Linker Mezanine 上使用 Arrow 传感器。 Esta não é uma implementação nal! Mas sim um desenvolvimento para mostrar como realizar a programação do Hardware,comunicação com um serviço repositório na nuvem ea criação de um app para acesso e controle do sistema。 作为 funções criadas são: -Controle do PH da Piscina -Acionamento da Bomba e monitoramento -Monitoramento do nível do reservatório de produto para tratamento
建筑物联网
一个自动化的 eo controle do tratamento da piscina são realizados pela Dragonboard,com interface do usuário via app Web。 Para que isto seja possível, é utilizada arquitetura demostrada na imagem, e consute em:
1. Os dados são lidos e processados pela Dragonboard 2. DragonBoard escreve em um repositório na Web, neste caso o Dweet.io 3. O Dweet.io disponibiliza as informações lidas para que sejam disponíveis para outras aplicações 4. Um applicativo Web 关闭 Ionic 和访问 Dweet.io 并显示 uma 界面
HTML 常用
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 1 页

第 1 步:配置硬件
同样,利用 DragonBoard 410c 实现自动化和控制本地 da piscina。 Junto com a Dragonboard foi instalada um shield da 96boards chamado Linker Mezanine, que facilita o acesso aos IOs da DragonBoard。 Este shield tb possui dois conversores A/D para leitura de dados analógicos。 Nas imagens existe con guração utilizada para conexão dos IOs deste example。
1. 考虑使用 PHmetro que forneça uma saída proportional de 0 a 5V para que seja compatível com a entrada do A/D。 Caso seja utilizado um com sinal maior, será necessário um divisor resistivo para compatibilizar o sinal com a entrada
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 2 页

2. No examplo, ao invés de um PHmetro foi utilizado um potênciometro para simulação do sinal 3. Para simular o acionamento da bomba foi utilizado um led, que em um projeto real poderia ser um
acoplador ótico acionando um TRIAC or relé 4. O 传感器旋转模拟 com 传感器 de 扭矩。 Em uma aplicação real poderia ser
um sensor no eixo da bomba ou um contado auxiliar do contator que aciona a bomba。 Neste caso, em caso de defeito da bomba ou queda do disjuntor, seria possível veri car que a bomba foi acionada e não está girando 5. O sensor para nível do reservatório é um do tipo “tilt” que deverá ser instalado em uma bóia 6 . Por m, a doseagem de produto é feita por uma eletroválvula acionada por um relé
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 3 页

Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 4 页

Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 5 页

第 2 步:准备 DragonBoard
广场展示和图书馆安装 p/ 96boards
DragonBoard 已安装在 Linux chamada Linaro 上,它已在应用程序中执行,并已在 96boards para interface 和 Linker Mezanine 上安装并实现了安装。 Uma vez que estamos trabalhando em Linux, podemos acessar o Terminal para realizar os comandos de atualização e instalação de bibliotecas: Os seguintes comandos realizam a atualização da placa:
sudo apt-get 更新 sudo apt-get 升级 sudo apt-get dist-upgrade
Para trabalhar com o Python, também 实现了安装文本编辑器和解释器
sudo apt-get 安装 gedit sudo apt-get 安装 python-pip
Na sequeência serão instaladas as Bibliotecas necessárias。 Os comandos devem ser apresentados na ordem a seguir e são críticos para a instalção correta:
sudo apt-get install build-essential autoconf automake libtool-bin pkg-config python-dev sudo restart
LIBSOC(访问链接器夹层)
git clone https://github.com/jackmitch/libsoc.git cd libsoc sudo autoreconf -i sudo ./configure –enable-python=2 –enableboard= dragonboard410c –with-board-configs sudo make sudo make install sudo ldconfig /usr /local/lib 须藤重启
96板:
git 克隆 https://github。 com/96boards/96BoardsGPIO.git
cd 96BoardsGPIO/
sudo ./autogen.sh sudo ./configure sudo make sudo make install sudo ldconfig
Quase no m… mas aproveitamos para instalar tb a biblioteca para acesso a parte analógica da Linker Mezanine:
git clone https://github.com/doceme/pyspidev.git cd py-spidev sudo python setup.py install sudo ldconfig sudo restart
重要的是将 LIBSOC 确定为链接器夹层的引用,并提供精确的引用和 IO 的引用
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 6 页

sudo gedit /usr/local/etc/libsoc.conf
第 3 步:Criação Do Objeto No Dweet.io
Como o proprio slogan diz, o dweet.io funciona como um Twitter para IoT, onde as coisas podem enviar e receber dados pela internet de maneira facilitada Uma característica importale é que o Dweet não necessita de uma autenticação complexa para acessar os dados, o que o torna interessante para início dos testes com IoT。 Para criar o objeto no Dweet basta seguir os seguintes passos:
1. Acessar o Dweet.io e clicar em “Play” 2. Na guia POST crie um para o obejto no campo “事物” 3. 否 campo “内容”adicione os dados que serão lidos e enviados。 Os dados devem estar 没有格式
“json” 4. Clique em “Try it out!” e observe o resultado em “Response Body” 5. Caso queira con rmar o uncionamento da “coisa”, vá até ocampo “Get Lastest Dweet”,insira o nome do
obje criado e clique em “Try it out” para veri car a resposta do Dweet。 Para esta aplicação foi criado o objeto “smart_piscina” que tem o seguinte conteúdo:
{ “status_tratamento”:0,“ligadesliga_bomba”:0,“status_bomba”:0,“status_reservatorio”:0,“PH_setpoint”:6,“PH_valor”:4 }
Nele estão todos os dados necessários para comunicação entre a DragonBoard ea aplicação Web。 重要的是,它是一个重要的对象名称,它可以改变任何消息,也没有任何应用程序的代码,因此可以同时使用各种设置,从而获得独立的结果
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 7 页

第 4 步:编程 Em Python

功能逻辑

Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 8 页

O 软件 de Controle da Piscina foi desenvolvido em Python, que é uma linguagem simples e interpretada, ou seja não necessita de compiladores para obter a execução da plicação。 作为 funções realizadas pelo software piscina_nal.py, que roda na DragonBoard são seguintes:
1. 控制 PH、监测 o valor medido na piscina e comparando com o “Setpoint” de nido pelo usuário no Web 应用程序。 A correção será feita dosando produto através do acionamento da eletroválvula。
2. O acionamento da eletroválvula é temporizado, ou seja, uma certa quantidade de produto é dosada ea lógica aguarda um determinado período para realizar uma nova dosagem
3. O controle só é realizado se a bomba da piscina estiver em funcionamento e se o nível do tanque de produto para dosagem estiver ok!
4. Quando o PH atinge um valor superior ao desejado, a dosome para automaticamente 5. Controla a bomba, ligando e desligando a mesma através do Web app, conforme solicitação do usuário 6. Monitora e informa ao usuário o nível do reservatório do produto de Dosagem 7. Informa anomalia na bomba, caso seja ligada e não rode。
前言,Dragonboard 的发展实现了与 Dweet.io 社区的共同发展
附加组件
安装 BIblioteca REQUESTS para realizar funções de POST e GET em HTTP
sudo pip 安装请求
Copiar o arquivo dweet.py para mesma pasta onde está a plicação smart_piscina.py

Python 的 Código 字体
接下来,我们将提供有关各方的信息,作为必要的图书馆,以帮助 IO 和实现 PH 的模拟分析。

导入 spidev 从 dweet 导入时间 从 libsoc 导入 Dweet 从 gpio_96boards 导入 gpio 导入 GPIO

科曼多_BBA = 36

#科曼多邦巴

尼维尔生产= 13

#Chave de nivel

DOSAGEM_VVL = 115

#瓣膜剂量

BBA_LIGADA = 24 #Retorno de Bomba ligada

GPIO_CS = 18

#传感器 PH(模拟)

引脚 = (

(GPIO_CS, 'out'),(COMANDO_BBA, 'out'),(DOSAGEM_VVL, 'out'),(NIVEL_PROD, 'in'),(BBA_LIGADA, 'in')

)

dweet = dweet()

spi = spidev.SpiDev()

spi.open(0,0)

spi.max_speed_hz=10000

spi.模式 = 0b00

spi.bits_per_word = 8def readPH(gpio):

gpio.digital_write(GPIO_CS,GPIO.HIGH)

time.sleep(0.0002)

gpio.digital_write(GPIO_CS, GPIO.LOW)

r = spi.xfer2([0x01, 0x80, 0x00])

gpio.digital_write(GPIO_CS,GPIO.HIGH)

adcout = (r[1] << 8) & 0b1100000000

adcout = adcout | (r[2] & 0xff)

adcout = (adcout * 0.014)

#converte para PH 0 a 14

返回广告

Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 9 页

Na segunda parte, é realizada a leitura do Dweet e os dados armazenados em variáveis globais para logicas do software:

def le_dweet():

#Le qual setpoint para tratamento

全局 ld_bomba、st_bomba、st_trat、st_res、PH_valor、PH_SP

resposta = dweet.latest_dweet(name=”smart_piscina”)

ld_bomba = resposta['with'][0]['content']['ligadesliga_bomba']

st_bomba = resposta['with'][0]['content']['status_bomba']

st_trat = resposta['with'][0]['content']['status_tratamento']

st_res = resposta['with'][0]['content']['status_reservatorio']

PH_valor = resposta['with'][0]['content']['PH_valor']

PH_SP = resposta['with'][0]['content']['PH_setpoint']

返回 ld_bomba、st_bomba、st_trat、st_res、PH_valor、PH_SP

一个 terceira parte é a função que realiza o tratamento da piscina,com a lógica para acionamento baseada no PH,nível do reservatório e bomba ligada。 注意 que as variáveis de monitoramento são as mesmas lidas pelo Dweet,desta forma conseguimos atualizar os valores na lógica para que despois sejam novamente ao serviço。
def tratamento(): global st_trat, st_res, st_bomba st_res = gpio.digital_read(NIVEL_PROD) st_bomba = gpio.digital_read(BBA_LIGADA) if (PH_valor < PH_SP) and ( st_res == 1) and ( st_bomba == 1): gpio。 digital_write(DOSAGEM_VVL, GPIO.HIGH) time.sleep(2) #tempo da dosagem do produto gpio.digital_write(DOSAGEM_VVL, GPIO.LOW) time.sleep(1) #espera entre dosensens st_trat = 1 print(“TRATAMENTO lIGADO”) 数字写(DOSAGEM_VVL, GPIO.HIGH)否则:gpio.digital_write(DOSAGEM_VVL, GPIO.LOW) st_trat = 0 print(“TRATAMENTO DESlIGADO”) return st_trat, st_res

四分之一 e última parte é o looping de execução da lógica。 A ordem onde as subrotinas são chamadas é importante para que os dados lidos pelo Dweet sejam atualizados e depois enviados para a correta visualização no Web 应用程序。

if __name__=='__main__': with GPIO(pins) as gpio: while True:
le_dweet() tratamento() PH_valor = round(readPH(gpio), 2) 如果 ld_bomba == 1: gpio.digital_write(COMANDO_BBA, GPIO.HIGH) print(“Bomba Ligada”) else: gpio.digital_write(COMANDO_BBA, GPIO. LOW) print(“Bomba Desligada”) print(“Valor do PH = %d” % PH_valor) print(“Valor do SP PH = %d” % PH_SP) print(“”) dweet.dweet_by_name(name=”smart_piscina” , data={“ligadesliga_bomba”:ld_bomba, “status_bomba”:st_bomba, “status_tratamento”:st_trat, “status_reservatorio”:st_res, “PH_valor”:PH_valor, “PH_setpoint”:PH_SP}) time.sleep(10)

https://www.instructables.com/ORIG/FPV/I7ZO/JAMTVW5R/FPVI7ZOJAMTVW5R.py https://www.instructables.com/ORIG/FMD/BHS3/JAMTVW5V/FMDBHS3JAMTVW5V.py

下载 下载

第 5 步:Desenvolvimento Do APP – Ambiente Hídrido
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 10 页

Plataforma híbrida 离子
O applicativo para controle da piscina será desenvolvido utilizando uma plataforma híbrida, ou seja, fazemos a abstração do hardware que o app será utilizado e desenvolvemos um projeto utilizando HTML, CSS e Javascript que posteriormente pode ser convertido em um app para uma plataforma especí ca como安卓或 IOS。 在 Cordova 平台上使用 IONIC 的基础功能,允许可视化和测试渲染应用程序 Web 浏览器。 Para o Desenvolvimento do app,使用语言 HTML 和 Typescript。 o IONIC também 允许使用框架 Angular para trabalhar ocs componentes como Models e Controllers。
发展环境安装
O desenvolvimento do app será realizado em um computador pessoal, e não na placa DragonBoard。 开始安装 node.js,需要使用 Ionic Acessar 或网站 https://nodejs.org/en/ 和 fazer o 下载 node.js 的最终版本,然后安装 NPM 开发人员之后再安装 node.js。 允许安装 Ionic。 Windows 没有提示 de comando 意识到安装 com os seguintes comandos:
npm 安装 g cordova ionic npm 安装 g cordova
测试离子,然后执行命令并在安装后恢复:
离子v
Criação da plicação no Ionic
Não, não tem uma interface grá ca bonita。 Tem que criar o app utilizando a linha de comandos。 Mas depois a facilidade de uso compensa。 Para criar uma nova aplicação, neste caso a smart_piscina, digitamos o seguinte comando:
离子启动 smart_piscina 空白
Será criada uma nova aplicação em branco que estará salva no diretório:
C:UsuáriosNome 做 usuáriosmart_piscina
Para testar o codigo:
cd smart_piscina 离子服务
Será aberta uma tela no navegador padrão mostrando a applicação em branco
第 6 步:Desenvolvimento Do APP – Edição Da Aplicação
一个 edição da applicação em branco gerada pelo Ionic será realizada 没有 Visual Studio Code,applicativo gratuito de programação desenvolvido pela Microsoft e que pode ser baixado 没有网站:https://code.visualstudio.com/download Os códigos alterados são apresentados a seguir, mas também estão disponíveis para download.
界面
一个界面来自 usuário será editada no arquivo home.html。 注意问题 tags 使用 Ionic 和 contém Smart Piscina Com IoT – Ionic、Dweet E DragonBoard:第 11 页

alguns 参数 inseridos utilizando os recursos 做框架 Angular。 Os recursos do Angular são utilizados no botão de acionamento da bomba e na entrada do valor de Setpoint do PH. Não é possível apresentar o código aqui por uma limitação do Instructables, que apaga as tags. 下载后没有压缩包。
进程
由于 fuções referentes a leitura e escrita de dados no Dweet e lógicas em geral para o correto funcionamento da interface estão arquivo home.ts desenvolvido em Typescript, liguagem muito semelhante ao Javascript
从'@angular/core'导入{组件}; 从 'ionic-angular' 导入 { NavController };
//É preciso importar o provider. 从'../../providers/dweet/dweet'导入{DweetProvider};
@Component({ 选择器: 'page-home', 模板Url: 'home.html'
})
出口类主页{
构造函数(公共 navCtrl:NavController,私有 DweetProvider:DweetProvider){}
//Declarações de Variáveis public respostaDweet: string=””; public status_tratamento: string=”danger”; 公共 st_trat = 0; public status_bomba: string=”danger”; 公共 st_bba = 0; public status_reservatorio: string=”danger”; 公共 st_res = 0; 公共场所=数组(); 公共 PH_val = 0; 公共 SP_PH = 0;
//模型做 botão de ligar bomba public bomba_model = {
检查:错误,名称:“Ligar Bomba”}
离子ViewDidLoad () { //buscando os dados no Dweet e salvando nas variáies locais this.DweetProvider.getLastestDweet(“smart_piscina”).subscribe( data=>{
常量响应=(任何数据); const objeto_retorno = JSON.parse(response._body); this.locais = objeto_retorno.with[0].content; this.bomba_model.checked = objeto_retorno.with[0].content.ligadesliga_bomba; this.st_bba = objeto_retorno.with[0].content.status_bomba; this.st_trat = objeto_retorno.with[0].content.status_tratamento; this.st_res = objeto_retorno.with[0].content.status_reservatorio; this.PH_val = objeto_retorno.with[0].content.PH_valor; this.SP_PH = objeStmo_arret tPoirsncoin.wa iCtho[m0].IcooTn-teIonnti.cP,HD_wseeettpEoinDtr;agonBoard: 第 12 页

this.SP_PH = objeto_retorno.with[0].content.PH_setpoint; 控制台日志(this.locais); }, 错误 => { console.log(error); } ) //状态图标 this.status_bomba = ((this.st_bba == 1) ? “secondary” : “danger”); this.status_tratamento = ((this.st_trat == 1) ? “secondary” : “danger”); this.status_reservatorio = ((this.st_res == 1) ? “secondary” : “danger”); }
//Botão Atualizar update() {
这个离子View没有加载(); }
//Liga Desliga Bombaliga_des_bomba(){ this.dweetPost() }
atualiza_sp(){ this.dweetPost()
}
dweetPost(){ //将布尔值转换为内部 const ld_bba = ((this.bomba_model.checked == true) ? 1 : 0);
//Envia dados para o Dweet.io const json_dweet = {“ligadesliga_bomba”: ld_bba, “status_bomba”: this.st_bba, “status_tratamento”: this.st_trat, “status_reservatorio”: this.st_res, “PH_valor”: this.PH_val , “PH_setpo int”: this.SP_PH}; this.DweetProvider.setDweet(“smart_piscina”,json_dweet).subscribe(
数据=>{ console.log(数据); }, 错误=> { console.log(错误); } ) } }
微博提供者
É necessário criar um provider para realizar comunicação HTTP com o Dweet。 Isto é feito através do Ionic com o seguinte comando no prompt de comando:
离子生成提供者 dweet
立即发送消息或发送消息。发送消息的命令已发送给 GET 和 POST 消息。 O código necessário é exibido a seguir:
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 13 页

从'@angular/http'导入{Http}; 从'@angular/core'导入{Injectable}; 导入 'rxjs/add/operator/map'; /*
为 DweetProvider 提供程序生成的类。 有关提供程序和 Angular DI 的更多信息,请参阅 https://angular.io/guide/dependency-injection。 */ @Injectable() 导出类 DweetProvider { 私有基础Url =“https://dweet.io:443/”构造函数(public http:Http){
console.log('Hello DweetProvider Provider'); } //Método responsável por buscar as informações no Dweet. getLastestDweet(东西:字符串){
常量 url_get = this.baseUrl + “get/latest/dweet/for/” + 事物; 控制台日志(url_得到); 返回这个.http.get(url_得到); } //Método resposnsável por modificar os dados no Dweet。 setDweet(thing, body) { 返回 this.http.post(this.baseUrl + “dweet/for/”+ 东西,身体); } }
对于 Dweet 提供程序的 HTTP 功能,需要使用 app.module.ts 来实现 HTTP 功能:
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 14 页

从'@angular/platform-b​​rowser'导入{BrowserModule}; 从 '@angular/core' 导入 { ErrorHandler, NgModule }; import { IonicApp, IonicErrorHandler, IonicModule } from 'ionic-angular'; 从'@ionic-native/splash-screen'导入{SplashScreen}; 从'@ionic-native/status-bar'导入{StatusBar}; 从'@angular/http'导入{HttpModule}; 从'./app.component'导入{MyApp}; 从'../pages/home/home'导入{主页}; 从'../providers/dweet/dweet'导入{DweetProvider}; @NgModule({
声明:[ MyApp, HomePage
],进口:[
BrowserModule, IonicModule.forRoot(MyApp), //Importar o modulo HTTP usado pelo Dweet。 HttpModule ], bootstrap: [IonicApp], entryComponents: [ MyApp, HomePage ], providers: [ StatusBar, SplashScreen, {provide: ErrorHandler, useClass: IonicErrorHandler}, DweetProvider ] }) 导出类 AppModule {}
乌法!
Salve tudo e teste a applicação através do comando:
离子发球
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 15 页

Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 16 页

Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 17 页

Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 18 页

https://www.instructables.com/ORIG/FUH/W6SK/JAMTWKY9/FUHW6SKJAMTWKY9.zip

下载

第 7 步:Colocando Tudo Para Funcionar!!
1.Iniciando o Dweet:没有站点 Dweet.io,喊叫对象符合描述,无需第 3 步
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 19 页

2.在 DragonBoard 上启动一个应用程序:在没有 Linaro 的终端上,获取应用程序上的意大利面 smart_home.py 和命令:
须藤蟒蛇smarthome.py
3.Iniciando a applicação no Ionic: Abra o prompt de comando, acesse a pasta onde está o applicativo criado no Ionic e digite o comando 广告
离子发球
https://youtu.be/O27f93xE0bk https://youtu.be/HaSeRf3wkSI https://youtu.be/vx16cLQKOeU
步骤 8:
Smart Piscina Com IoT – Ionic,Dweet E DragonBoard:第 20 页

文件/资源

instructables Smart Piscina Com IoT Ionic Dweet E DragonBoard [pdf] 指示
Smart Piscina Com IoT Ionic Dweet E DragonBoard、Smart Piscina、Com IoT Ionic Dweet E DragonBoard、Dweet E DragonBoard

参考

发表评论

您的电子邮件地址不会被公开。 必填字段已标记 *