首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

拯救异地恋感情,全靠它!I’m with you 物联网装置

你的无限手套还缺一点,就能打响指

都说陪伴是最长情的告白

如何在异地的情况下

除了文字、表情、语音以外

让每一刻的小悸动

也可以时刻传达给另一半

I‘m with you

风车

就是爱的使者

身处异地的2人

不论你们距离有多远

只要你把思念交给风车

风车随着你吹出的风

缠绵着你的相思一起

让蝴蝶把情绪和思恋

迫不及待的挥动几下翅膀

甜甜的

传递到你另一半的身边

I‘m with you 物联网装置视频

I‘m with you 物联网装置

制作攻略

利用2片esp8266(类似arduino+wifi模块)

和云平台建立起连接

What is IoT?

"物联网" 描述了一种新兴的趋势, 即大量嵌入式设备 (事物) 连接到互联网上。这些连接的设备与人和其他事物通信, 并且经常向云存储和云计算资源提供传感器数据, 在这些数据被处理和分析以获得重要的洞察力。廉价的云计算能力和更高的设备连接性使这种趋势得以实现。

大量的解决方案是建立在许多垂直应用, 如环境监测和控制, 健康监测, 车队监测, 工业监测和控制, 和家庭自动化。

第一步:搭建esp8266的开发环境(想到经常用到的arduinoide,可以节省其他软件开发学习的时间)

打开Arduino IDE,点击File->Preferences,如下图所示:

在新打开的界面中,点击如下图红色圆圈中的按钮,

将如下链接地址复制到新弹出的对话框中:

国内使用:http://git.oschina.net/dfrobot/firebeetle-esp8266/raw/master/package_firebeetle8266_index.json

海外使用:https://raw.githubusercontent.com/DFRobot/FireBeetle-ESP8266/master/package_firebeetle8266_index.json

点击OK

更新板卡

打开Tools->Board:->Boards Manager...,如下图所示:

Boards Manager会自动更新板卡,如下图所示:

更新完成后,会在列表中看到FireBeetle-ESP8266主板,点击安装:

第二步:esp8266发送http请求(如何将esp8266补做到的信号数据上传到服务器)

1. HTTP相关知识

HTTP是一套计算机网络通讯规则。下来主要介绍一下HTTP消息格式

HTTP请求数据格式:

当浏览器发送请求是,向服务器发送了一个数据块,也就是请求信息,其中信息由三部分组成。

1. 请求方法 URI协议/版本

2. 请求头(Request Header)

3. 请求正文

GET/sample.jspHTTP/1.1

Accept:image/gif.image/jpeg,*/*

Accept-Language:zh-cn

Connection:Keep-Alive

Host:localhost

User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0)

Accept-Encoding:gzip,deflate

username=jinqiao&password=1234

HTTP 请求应答格式:

当服务器收到浏览器的请求时,会向客户端返回数据,数据主要由三部分组成

1. 协议状态 版绷带吗描述

2. 响应头(ResponseHeader)

3. 响应正文

HTTP/1.1 200 OK

Server:Apache Tomcat/5.0.12

Date:Mon,6Oct2003 13:23:42 GMT

Content-Length:112

data(返回数据)

向上滑动阅览

#include

#include

//needed for library

#include

#include

#include

#define grayscalePin D8

// Network Parameters

const char* ssid = "DFRobot-guest";

const char* password = "dfrobot@2017";

// ThingSpeak information

char thingSpeakAddress[] = "api.thingspeak.com";

const char* server = "api.thingspeak.com";

unsigned long channelID = 541489;

char* readAPIKey = "TY5KLRMTB5E311RX";

char* writeAPIKey = "J1XHZ98DG0PGHKGW";

String apiKey = "TY5KLRMTB5E311RX";

const unsigned long postingInterval = 120L * 1000L;

unsigned int FieldLabelone= 1; // Field to write temperature data

unsigned long lastConnectionTime = 0;

long lastUpdateTime = 0;

WiFiClient client;

float readTSData( long TSChannel,unsigned int TSField ){

float data = ThingSpeak.readFloatField( TSChannel, TSField, readAPIKey );

Serial.println( " Data read from ThingSpeak: " + String( data, 9 ) );

return data;

}

// Use this function if you want to write a single field

int writeTSData( long TSChannel, unsigned int TSField, float data ){

int writeSuccess = ThingSpeak.writeField( TSChannel, TSField, data, writeAPIKey ); // Write the data to the channel

if ( writeSuccess ){

Serial.println( String(data) + " written to Thingspeak." );

}

return writeSuccess;

}

//use this function if you want multiple fields simultaneously

int write2TSData( long TSChannel, unsigned int TSField1, float field1Data, unsigned int TSField2, long field2Data, unsigned int TSField3, long field3Data ){

ThingSpeak.setField( TSField1, field1Data );

ThingSpeak.setField( TSField2, field2Data );

ThingSpeak.setField( TSField3, field3Data );

int writeSuccess = ThingSpeak.writeFields( TSChannel, writeAPIKey );

return writeSuccess;

}

void setup()

{

Serial.begin(115200);

WiFi.begin(ssid, password);

Serial.println();

Serial.println();

Serial.print("Connecting to ");

Serial.println(ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED) {

delay(500);

Serial.print(".");

}

Serial.println("");

Serial.println("WiFi connected");

}

void loop()

{

int val = analogRead(A0);

delay(100);

if (client.connect(server,80)) { // "184.106.153.149" or api.thingspeak.com

String postStr = apiKey;

postStr +="&field1=";

postStr += String(val);

postStr += "\r\n\r\n";

client.print("POST /update HTTP/1.1\n");

client.print("Host: api.thingspeak.com\n");

client.print("Connection: close\n");

client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");

client.print("Content-Type: application/x-www-form-urlencoded\n");

client.print("Content-Length: ");

client.print(postStr.length());

client.print("\n\n");

client.print(postStr);

Serial.println(postStr);

Serial.println(val);

}

client.stop();

Serial.println("Waiting…");

// thingspeak needs minimum 15 sec delay between updates

delay(2000);

}

int connectWiFi(){

while (WiFi.status() != WL_CONNECTED) {

WiFi.begin( ssid, password );

delay(2500);

Serial.println("Connecting to WiFi");

}

Serial.println( "Connected" );

ThingSpeak.begin( client );

}

总结: 通过 WiFiClient 的 connect 方法来进行WIFI链接 通过print方法来发送HTTP请求, 以及readStringUntil('\n') 来读取服务器端返回的数据

第一次把一端的信号传给了服务器

通过响应风车转动为“1”,响应thinghttp连接到IFTTT 发送装置响应短信提示

外部 web 服务 IFTTT 是一种 web 服务, 它允许您创建用于响应触发器操作的 applet。此示例演示如何使用响应应用程序在ThingHTTP中触发 HTTP 请求 IFTTT。触发的 IFTTT 小程序然后发送一个文本消息。

通道

37998

创建 IFTTT 小程序

可以将 IFTTT webhooks 服务设置为使用 web 请求来触发操作。传入操作是对 web 服务器的 HTTP 请求, 传出操作是文本消息。

记录家庭温度值。在这个例子中, 当温度降到50度以下时, 你会收到一个文本通知, 这样春天的幼苗就不会被破坏。

创建IFTTT帐户, 或登录到现有帐户。

创建小程序。选择 "我的小程序", 然后单击 "新建 applet " 按钮。

选择输入操作。点击这个词。

选择 Webhooks 服务。在搜索字段中输入。选择Webhooks卡。Webhooks

完成触发器字段。选择 Webhooks 作为触发器后, 单击 "接收 web 请求卡" 继续。输入事件名称。本示例使用事件名称。单击 "创建触发器"。TooCold

选择结果操作。单击该单词。触发器词现在是 Webhooks 图标。在搜索栏中输入 sms, 然后选择 "sms" 框。this

选择 "向我发送 SMS", 然后输入文本消息信息。您可以传递有关使用配料触发消息的事件的数据。例如, 包括将事件名称添加到文本消息中。单击 "创建操作" 以完成新的小程序。}

检索您的 Webhooks 触发器信息。选择 "我的小程序 >服务", 然后搜索。选择Webhooks, 然后单击 "文档" 按钮。您将看到您的密钥和发送请求的格式。输入事件名称。此示例的事件名称为。WebhooksTooCold

https://maker.ifttt.com/trigger//with/key/XXXXXXXXXXXXXXXXXXXXXXhttps://maker.ifttt.com/trigger/ ... XXXXXXXXXXXXXXXXXXX

您可以使用测试按钮或将 URL 粘贴到浏览器中来测试服务。IFTTT 事件触发器并非总是瞬时的。现在创建一个 ThingHTTP 来完成触发器请求。

创建 ThingHTTP

ThingHTTP 应用程序允许您使用 API 密钥和来自 web 或设备的获取请求来触发预定义的 HTTP 请求。此示例演示如何使用 ThingHTTP 在 IFTTT 上触发 Webhooks。

选择 "应用程序" > " ThingHTTP", 然后选择 "新 ThingHTTP"。

编辑 ThingHTTP 设置。

选择一个名称。

从 Webhooks 文档中输入URL 。此示例的 URL 具有窗体 https://maker.ifttt.com/triigger ... xxxxxxxxxxxxxxxxxxx。

对于方法, 请输入 "获取"。

保存 ThingHTTP。现在, 根据您的通道数据创建一个响应以触发此 ThingHTTP。

创建对数据的响应

反应应用程序可以评估您的 ThingSpeak 通道数据并触发其他事件。创建在房子太冷时触发的反应应用程序的实例。选择 "应用程序" > "响应", 然后单击 "新建响应"。

选择一个名称

选择用于测试频率数据插入

条件选择温度通道。

选择适当的字段, 在这种情况下, 字段1。

将要求设置为小于

设置温度水平, 在本例中为50

选择ThingHTTP作为操作, 然后选择以前定义的 ThingHTTP 的名称。

"选项" 中, 选择 "每次满足条件时运行操作"。

触发您的短信

一旦通道中的风车转动达到你的反应的设定点, 你就会在你的设备上收到一条短信。

硬件篇:

蝴蝶的拍打的动作,是左右上下往复运动。下面是电机带动2哥左右齿轮

蝶的叶片,先绘制了翅膀的大体轮廓 然后3d打印出来安装

接着接通一下电机的正负极 看看蝶的运动情况

安装蝶的悬空的支持,旋转0.8mm的304不锈钢丝。它本身既有刚性 同时纤细富有弹性

接好支撑的钢丝后,用力弯曲一点弧度

电路连接部分也很简单,一路电机驱动的和esp8266的2个IO空。分别是PMW速度接D1,电机DIR方向接D2

烧录代码

向上滑动阅览

[mw_shl_code=c,true]#include "config.h"

/************************ Example Starts Here *******************************/

// digital pin 5

#define LED_PIN D5

int DIR = D1;

int PWM = D2;

// set up the 'digital' feed

AdafruitIO_Feed *digital = io.feed("digital");

void setup() {

pinMode(LED_PIN, OUTPUT);

pinMode(DIR, OUTPUT);

// start the serial connection

Serial.begin(115200);

// wait for serial monitor to open

while(! Serial);

// connect to io.adafruit.com

Serial.print("Connecting to Adafruit IO");

io.connect();

// set up a message handler for the 'digital' feed.

// the handleMessage function (defined below)

// will be called whenever a message is

// received from adafruit io.

digital->onMessage(handleMessage);

// wait for a connection

while(io.status()

Serial.print(".");

delay(500);

}

// we are connected

Serial.println();

Serial.println(io.statusText());

digital->get();

}

void loop() {

// io.run(); is required for all sketches.

// it should always be present at the top of your loop

// function. it keeps the client connected to

// io.adafruit.com, and processes any incoming data.

io.run();

}

// this function is called whenever an 'digital' feed message

// is received from Adafruit IO. it was attached to

// the 'digital' feed in the setup() function above.

void handleMessage(AdafruitIO_Data *data) {

Serial.print("received

if(data->toPinLevel() == HIGH)

{

Serial.println("HIGH");

for( char i=0;i

{

digitalWrite(DIR, HIGH);

analogWrite(PWM, 150);

delay(500);

}

digitalWrite(DIR, HIGH);

analogWrite(PWM, 0);

}

else

{

Serial.println("LOW");

digitalWrite(DIR, HIGH);

analogWrite(PWM, 0);

}

digitalWrite(LED_PIN, data->toPinLevel());

}[/mw_shl_code]

底座设计篇:

为了凸显蝶的空灵和想象,底座选用一个圆柱和楔形切割的结构。同时也可以为蝶的支持给一定的倾角

最后将设计好的模型打印或者水泥制作出来 一个不错的七夕礼物就好了

最后这个装置 需要你有一个,你的另一半也有一个

每个工作和异地的空间和时间

都可以不受限制的将我们的小心思传达给我们的所爱之人

同时也不会在纷乱的信息和工作、有所打扰

它就在你的工作台

书桌上

记录传递思恋

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180817A1IW4D00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券