回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页
best-icon

【应用教程】七夕-I'm with you 物联网装置 简单

头像 管理员 2018.11.27 1015 2

都说陪伴是最长情的告白。如何异地 每一刻的小悸动?也可以更直接的传达给另一半 除了文字、表情、语音以外

project-image

想到风车和蝶,身处异地的2人简单示意的传递情绪和思恋 

利用2片esp8266(类似Arduino+wifi模块)和云平台建立起连接 

What is IoT?

project-image

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

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

步骤1 第一步:搭建esp8266的开发环境(想到经常用到的arduinoide,可以节省其他软件开发学习的时间) 打开Arduino IDE,点击File->Preferences,如下图所示:

project-image

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

project-image

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

国内使用;

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  

project-image

点击OK 

       更新板卡 

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

project-image

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

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

project-image

步骤2 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 <ThingSpeak.h>
#include <ESP8266WiFi.h>      
//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
 
#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') 来读取服务器端返回的数据 

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

project-image

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

project-image

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

通道 

37998 

创建 IFTTT 小程序 

可以将 IFTTT webhooks 服务设置为使用 web 请求来触发操作。传入操作是对 web 服务器的 HTTP 请求, 传出操作是文本消息。 记录家庭温度值。在这个例子中, 当温度降到50度以下时, 你会收到一个文本通知, 这样春天的幼苗就不会被破坏。 

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

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

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

project-image

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

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

project-image

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

project-image

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

project-image

1. 检索您的 Webhooks 触发器信息。选择 "我的小程序 >服务", 然后搜索。选择Webhooks, 然后单击       "文档" 按钮。您将看到您的密钥和发送请求的格式。输入事件名称。此示例的事件名称为。WebhooksTooCold https://maker.ifttt.com/trigger/{event}/with/key/XXXXXXXXXXXXXXXXXXXXXX

https://maker.ifttt.com/trigger/ ... XXXXXXXXXXXXXXXXXXX 

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

创建 ThingHTTP 

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

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

(2)编辑 ThingHTTP 设置。 

         选择一个名称。 

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

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

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

 创建对数据的响应 

反应应用程序可以评估您的 ThingSpeak 通道数据并触发其他事件。创建在房子太冷时触发的反应应用程序的实例。

选择 "应用程序" > "响应", 然后单击 "新建响应"。 

     选择一个名称。 

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

     为条件选择温度通道。 

     选择适当的字段, 

     在这种情况下, 字段1。 

     将要求设置为小于。 

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

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

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

project-image

触发您的短信 

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

project-image
project-image

硬件篇: 

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

project-image

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

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

project-image
project-image

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

project-image

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

project-image
代码
#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() < AIO_CONNECTED) {
    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<10;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());
}

底座设计篇:

project-image

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

project-image

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

project-image

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

project-image

每个工作和异地的空间和时间,都可以不受限制的将我们的小心思传达给我们的所爱之人 

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

它就在你的工作台 

书桌上 

记录传递思恋

评论

user-avatar
  • _深蓝_

    _深蓝_2023.12.31

    esp8266也是个很好的板子呀

    0
    • 漫路修远

      漫路修远2019.11.29

      louz,齿轮是可以买到的吗

      0