使用OneNET控制Arduino

说明

最近做一个远程开锁的小玩意儿,感觉很方便,忘带钥匙就不用去麻烦楼下温柔的阿姨了。无奈舵机和定滑轮一直不到,先就做个远程控制小灯,小灯是arduino自带的那个。另外怕室友不够“尊重”,我又加了个蜂鸣器(嘿嘿嘿)。

材料

一个OneNET账号,一个Uno,一个ESP8266-01(我还是喜欢用01S),一个蜂鸣器(不怕打的就来一个),杜邦线若干。

展示

在这里插入图片描述

在这里插入图片描述

代码

  • UnlockingTest.ino

    /*****************************************************
    * 功    能:通过OneNET的http协议下发指令控制arduino
    * 说	明:http协议并不适合数据下发,这里只是用get
    *			方法提供一个投机取巧的思路
    * 作    者:新鲜的大白菜
    * 创建日期:2020/10/21
    *****************************************************/
    
    #include "Unlocking.h"
    #define BUZ 10
    
    void setup() {
      Serial.begin(115200); //初始化WIFI串口
      pinMode(LED_BUILTIN, OUTPUT);
      pinMode(BUZ, OUTPUT);
      digitalWrite(LED_BUILTIN, 0);
      digitalWrite(BUZ, 0);
    }
    
    void loop() {
      //发送get指令
      send_get(); 
      //接收onenet发送的消息
      receive_info();
      
      //处理控制信息并实现效果
      if (strstr(temp, "\"current_value\":1"))
      {
        digitalWrite(LED_BUILTIN, 1);
        digitalWrite(BUZ, 1);
      }
      else
      {
        digitalWrite(LED_BUILTIN, 0);
        digitalWrite(BUZ, 0);
      }
      
    }
    
  • Unlocking.h

    #ifndef __UNLOCKING_H
    #define __UNLOCKING_H
    
    #include <arduino.h>
    
    //HTTP协议需要(Signal_http只是测试)
    #define Signal_http "POST /devices/600328063/datapoints?type=3 HTTP/1.1\napi-key:w3ncIqXbYR9RuCxjZEoLEqOYCb0=\nHost:api.heclouds.com\nContent-Length:15\n\n {\"Signal\":27}\r\n"
    #define SWITCH "GET /devices/600328063/datastreams/switch HTTP/1.1\napi-key:w3ncIqXbYR9RuCxjZEoLEqOYCb0=\nHost: api.heclouds.com\n\n"
    
    void send_get(); 	 	//发送get指令
    void receive_info(); 	//接收onenet发送的消息
    
    extern String receive; 	//String类型接收缓冲区
    extern char temp[380];  //char* 类型临时接收缓冲区
    
    #endif //__UNLOCKING_H
    
  • Unlocking.cpp

    #include "Unlocking.h"
    
    String receive = ""; 	//String类型接收缓冲区
    char temp[380] = {0};   //char* 类型临时接收缓冲区
    
    void send_get()
    {
    	Serial.print(SWITCH); //向云端发送get指令以获取信息
    	delay(1000); 	//没有延时影响灯的稳定性,但是不影响蜂鸣器
    }
    
    void receive_info()
    {
    	while (Serial.available() > 0)
    	{
    		receive += char(Serial.read());
    		delay(2); //保证数据完整
    	}
    	
    	strcpy(temp, receive.c_str()); //String转换成char*
    	
    	receive = ""; //清理接收缓冲区
    }
    

细节(很重要)

  • OneNET

    需要了解OneNET的POST与GET的格式基本使用,数据流创建与基本使用,之所以说我这个方法投机取巧就是因为http协议不适合数据下发,推荐EDP协议,网上有详细资料
    
  • WIFI模块

    我只用过ESP01和ESP01S(推荐),需要说明的是因为Arduino在固定的位置,有固定的WiFi,并不会经常改动,所以我把配置wifi的AT指令全部使用usb-ttl工具事先配置好了,只要一通电就会自动连接wifi、与OneNET建立tcp连接、开启透传模式,所以在代码中并没有配置wifi模块的信息,网上有wifi模块的教程,注意接线和电压,使用串口调试助手配置时注意回车换行问题,01S比01更容易上手,所以推荐ESP01S
    
  • Arduino

    Arduino的接收缓冲区默认只有64字节,但通过GET指令查询数据流时,服务器返回的信息大于64,所以需要修改缓冲区大小,网上有详细教程
    

结语

很不推荐这种投机取巧的方法,但是玩玩还是可以的,这里面有些坑,但是都是可以找到解决方案的,不管怎么说,忘带钥匙麻烦楼下阿姨上来开门就是不对的!

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用Arduino连接OneNet,需要进行以下步骤: 1. 创建OneNet账户并创建设备:在OneNet平台上创建一个账户并创建一个设备来接收来自Arduino的数据。 2. 下载并安装OneNet库:在Arduino IDE中安装OneNet库,这个库可以帮助我们将数据发送到OneNet平台。 3. 编写Arduino代码:在Arduino IDE中编写代码,包括WiFi连接代码和OneNet数据上传代码。 4. 测试连接:将Arduino连接到电脑,上传代码并测试连接,确保数据能够成功发送到OneNet平台。 以下是一个简单的示例代码,可以用于连接Arduino Uno和OneNet平台: ``` #include <OneNet.h> #include <SPI.h> #include <WiFi.h> char ssid[] = "your_SSID"; // your network SSID (name) char password[] = "your_PASSWORD"; // your network password (use for WPA, or use as key for WEP) int status = WL_IDLE_STATUS; // the Wifi radio's status char* device_id = "your_DEVICE_ID"; // 设备ID char* api_key = "your_API_KEY"; // API Key OneNet onenet(device_id, api_key); void setup() { // initialize serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } // check for the presence of the shield: if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // don't continue: while (true); } // attempt to connect to Wifi network: while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); // Connect to WPA/WPA2 network. Change this line if using open or WEP network: status = WiFi.begin(ssid, password); // wait 5 seconds for connection: delay(5000); } // you're connected now, so print out the data: Serial.print("You're connected to the network"); } void loop() { // read sensor data and store in variables int sensorValue = analogRead(A0); float voltage = sensorValue * (5.0 / 1023.0); // create JSON object with sensor data JsonObject data = JsonObject(); data.addFloat("voltage", voltage); // send data to OneNet bool success = onenet.add_data(data); if (success) { Serial.println("Data sent successfully"); } else { Serial.println("Data failed to send"); } // wait for 5 seconds before sending the next data point delay(5000); } ``` 请注意,这里的 `your_SSID` 和 `your_PASSWORD` 需要根据你的WiFi网络进行替换,`your_DEVICE_ID` 和 `your_API_KEY` 需要根据你在OneNet上创建的设备进行替换。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值