查看: 5768|回复: 6

[项目分享] 七夕-I‘m with you 物联网装置

[复制链接]



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

想到风车和蝶,身处异地的2人简单示意的传递情绪和思恋
利用2片esp8266(类似Arduino+wifi模块)和云平台建立起连接
What is IoT?
NodeMCU%20HTTP%20Client.png

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

大量的解决方案是建立在许多垂直应用, 如环境监测和控制, 健康监测, 车队监测, 工业监测和控制, 和家庭自动化。
第一步:搭建esp8266的开发环境(想到经常用到的arduinoide,可以节省其他软件开发学习的时间)
打开Arduino IDE,点击File->Preferences,如下图所示:
ESP32-1[1].png
在新打开的界面中,点击如下图红色圆圈中的按钮,
700px-ESP32-3[1].png
将如下链接地址复制到新弹出的对话框中:
国内使用: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
700px-DFR0498_IDE配置3[1].jpg
点击OK
  • 更新板卡
打开Tools->Board:->Boards Manager...,如下图所示:
800px-ESP32-5[1].png

Boards Manager会自动更新板卡,如下图所示:
更新完成后,会在列表中看到FireBeetle-ESP8266主板,点击安装:
DFR0498_IDE配置6[1].jpg
第二步: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(返回数据)
[C] 纯文本查看 复制代码
#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') 来读取服务器端返回的数据
第一次把一端的信号传给了服务器
1532333667(1).jpg
通过响应风车转动为“1”,响应thinghttp连接到IFTTT 发送装置响应短信提示
1531891251(1).jpg
外部 web 服务 IFTTT 是一种 web 服务, 它允许您创建用于响应触发器操作的 applet。此示例演示如何使用响应应用程序在ThingHTTP中触发 HTTP 请求 IFTTT。触发的 IFTTT 小程序然后发送一个文本消息。
通道
37998
创建 IFTTT 小程序
可以将 IFTTT webhooks 服务设置为使用 web 请求来触发操作。传入操作是对 web 服务器的 HTTP 请求, 传出操作是文本消息。
记录家庭温度值。在这个例子中, 当温度降到50度以下时, 你会收到一个文本通知, 这样春天的幼苗就不会被破坏。

ifttt_select_this[1].png
  • 选择 Webhooks 服务。在搜索字段中输入。选择Webhooks卡。Webhooks
  • 完成触发器字段。选择 Webhooks 作为触发器后, 单击 "接收 web 请求卡" 继续。输入事件名称。本示例使用事件名称。单击 "创建触发器"。TooCold

ifttt_toocold_event[1].png
选择结果操作。单击该单词。触发器词现在是 Webhooks 图标。在搜索栏中输入 sms, 然后选择 "sms" 框。this
ifttt_choose_sms[1].png
选择 "向我发送 SMS", 然后输入文本消息信息。您可以传递有关使用配料触发消息的事件的数据。例如, 包括将事件名称添加到文本消息中。单击 "创建操作" 以完成新的小程序。{{Event                            Name}}
ifttt_enter_sms_info[1].png
  • 检索您的 Webhooks 触发器信息。选择 "的小程序 >服务", 然后搜索。选择Webhooks, 然后单击 "文档" 按钮。您将看到您的密钥和发送请求的格式。输入事件名称。此示例的事件名称为。WebhooksTooCold
    https://maker.ifttt.com/trigger/{event}/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 的名称。
  • "选项" 中, 选择 "每次满足条件时运行操作"。
  • 1531891190.jpg


触发您的短信
一旦通道中的风车转动达到你的反应的设定点, 你就会在你的设备上收到一条短信。
IMG_2015.PNG IMG_2014.PNG
硬件篇:
蝴蝶的拍打的动作,是左右上下往复运动。下面是电机带动2哥左右齿轮

3A23F424A2F7ECD0488A6B2BBB1BA885.JPG
蝶的叶片,先绘制了翅膀的大体轮廓  然后3D打印出来安装
接着接通一下电机的正负极 看看蝶的运动情况
680252453203669684.jpg
620804704965510144.jpg
安装蝶的悬空的支持,旋转0.8mm的304不锈钢丝。它本身既有刚性 同时纤细富有弹性
19508201845530564.jpg
接好支撑的钢丝后,用力弯曲一点弧度
132106782143527698.jpg
电路连接部分也很简单,一路电机驱动的和esp8266的2个IO空。分别是PMW速度接D1,电机DIR方向接D2
烧录代码
[C] 纯文本查看 复制代码
#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());
}
底座设计篇:
1533634667(1).jpg
为了凸显蝶的空灵和想象,底座选用一个圆柱和楔形切割的结构。同时也可以为蝶的支持给一定的倾角
1533696552(1).jpg
最后将设计好的模型打印或者水泥制作出来  一个不错的七夕礼物就好了
5.jpg
最后这个装置 需要你有一个  你的另一半也有一个
6.jpg
每个工作和异地的空间和时间,都可以不受限制的将我们的小心思传达给我们的所爱之人
同时也不会在纷乱的信息和工作,有所打扰
它就在你的工作台
书桌上
记录传递思恋

王筱丰  初级技师

发表于 2018-8-12 20:39:17

应该是OBLOQ哦!而不是OBLOG!
回复 支持 反对

使用道具 举报

SJHll  见习技师

发表于 2019-5-4 19:56:58

好厉害!好漂亮!
回复 支持 反对

使用道具 举报

小马1  见习技师

发表于 2019-9-5 17:31:07

有趣有趣
回复 支持 反对

使用道具 举报

小马1  见习技师

发表于 2019-9-5 17:34:09

大写的666,加油
回复 支持 反对

使用道具 举报

DFrJnCdAk8B  见习技师

发表于 2019-9-6 21:54:56

最后的效果不错
回复 支持 反对

使用道具 举报

gada888  版主

发表于 2019-9-17 08:09:53

这个牛
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
wifi气象站

硬件清单

btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2019 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail