ESP8266和ESP32智能彩灯开发系列文章目录

第一篇:最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯)
第二篇:最简单DIY基于ESP8266的智能彩灯②(在网页用按键和滑动条控制RGB灯)
第三篇:最简单DIY基于ESP8266的智能彩灯③(在网页用按钮+滑动条+手机APP控制RGB灯)


文章目录

  • ESP8266和ESP32智能彩灯开发系列文章目录
  • 前言
  • 一、最简单DIY基于ESP8266的智能彩灯③(在网页用按钮+滑动条+手机APP控制RGB灯)是什么?
  • 二、使用步骤
    • 1.准备硬件
    • 2.搭建Arduino开发环境
    • 3.搭建Eclipse 安卓开发环境
    • 4.准备一份webserver源码
    • 5.修改webserver源码
    • 6.准备安卓手机发送http get请求的源码
    • 7.修改安卓手机发送http get请求的源码
  • 三、运行与调试
  • 总结

前言

    daodanjishui物联网核心原创技术之最简单DIY基于ESP8266的智能彩灯③(在网页用按钮+滑动条+手机APP控制RGB灯)。
    市面上有各种开源智能彩灯控制程序出售,但是有复杂的有简单的,如果想快速入门用网页按键+滚动条+手机app无线点亮普通RGB灯,这个方案会给你一个快捷高效的方案。


一、最简单DIY基于ESP8266的智能彩灯③(在网页用按钮+滑动条+手机APP控制RGB灯)是什么?

    根据国内STM32芯片的价格已经飙到天价,把创作的重心放在国产芯片和国产软件上,所以打算把压箱底的物联网控制的安卓APP源码奉献给大家,总所周知安卓界面的开发是基于XML的,可能我以后也用不到了,准备转战开发国产鸿蒙操作系统生态开发,放弃安卓应用开发,因为我深信鸿蒙操作系统的UI界面是可以用JavaScript和Java开发的,今年4月17日上午十点左右,HarmonyOS开发者日在上海举行,虽然我没有参加,但是我知道这个物联网时代真的到来了。
    利用手机浏览器显示屏替代了单片机的OLED显示屏,相比第二篇:最简单DIY基于ESP8266的智能彩灯②(在网页用按键和滑动条控制RGB灯)的功能,第三篇的功能在第二篇的基础上,多增加了安卓手机app控制RGB彩灯。该方案的另一大特色是在ESP8266单片机通过高速wifi直接跟daodanjishui出品的安卓手机APP源码交互,不再使用任何浏览器,达到手机与单片机数据上传和下载(截图会有toast显示单片机返回的数据,一点都不假),这个功能跟我以前发布的javaweb服务器返回的消息是不一样的,因为这次是嵌入式网关ESP8266返回的数据。

优酷视频演示效果:https://v.youku.com/v_show/id_XNTE0MDA1MzY1Mg==.html

直接看视频

最简单DIY基于ESP8266的智能彩灯③(手机APP控制RGB灯)

    ESP8266真正流行起来的时间要追溯到2018年,当时各大开源STM32开发板教程(包括正点原子,野火)都采用了外接ESP8266模块无线上网的方式,不过技术还不够好,云服务器还没有搭建成功,教程也没有写好,反而板载用的是ENC28J60以太网模块接网线上网,或者是用好点的DM9000芯片接网线上网,这两个有线的网卡都需要跑一个UIP或者是LWIP的协议才能上网,当时这两个有线网卡的教程相当丰富!!!诱惑我当时我也入坑了这两个有线网卡的程序,速度慢就不说了,还涉及一堆寄存器,指针,结构体,要用单片机另外的资源去控制这两个网卡,现在都忘记怎么用了,总之走了弯路。而且当时开发板用无线上网的方案国内基本上是用高级单片机STM32的串口发送AT指令控制ESP8266的,其实这样也浪费了ESP8266的资源,背诵了一大堆AT指令,到现在也忘记了。当时我还把正点原子关于ESP8266的帖子都看完去,也是收获不大,顶多自主设计了一款空中鼠标申请了一个软件著作权之后就停滞不前了。
    真正让我捣鼓ESP8266是这两年时间内,当时用安信可公司提供的eclipse 的SDK去开发ESP8266太过于繁琐,后面我才发现用arduino开发ESP8266就变得事半功倍了,不再需要AT指令了,取而代之的是Arduino随叫随到的开源库供我使用,到目前为止我都一直在用Arduino开发环境去开发ESP8266和ESP32,现在市面上一些智能家居都是用的ESP8266来做的,成本低很多。我现在针对电路城网站做出的物联网作品有:基于ESP32视频监控机械臂系统(上位机和下位机)、ESP8266彩灯矩阵系统(上位机和下位机)、ESP32国产物联网照相机系统(上位机和下位机)、ESP8266+Zigbee开源农业大棚监控系统(上位机和下位机)等等,打算都开源了,只不过写教程比较花时间,代码都已经写好的,例如现在智能灯系列的如下图所示:

    其实大家都知道,网上很多免费的开源项目代码是不全的,比如什么智云,什么壳物联网,什么法云,什么开发者平台等等,还有某宝那些什么收费开源的开发板或者套件,它们对应的硬件套件也不贵,几十块就可以买到一套,某宝还有很多卖家互相抄袭资料互相攻击,都说自己是原创的,谁又侵犯谁的权力,谁是原创的都不知道了,资料下载得越多越发现学习更困难,因为你不会辨别真伪。它们都有一个共同的特点:代码不全。
    我曾经也为了图个新鲜下载了某个云的SDK开发包开始学习物联网控制技术,后面才发现入坑了,服务器的代码根本没有,就算你学会用了开源的手机APP控制设备,但是你的APP必须依赖人家的服务器,就像美国的GPS卫星,如果我们中国没有北斗卫星,关键时候被掐脖子就玩完了。所以一般私人小型公司开发物联网套件不会去用三大云机构的服务器的,都是自己自主开发的服务器的,产品价格也实惠。但是也有一个缺点,小公司生命脆弱,一旦倒闭了,云服务器就挂了,买的设备就成砖头了。
    购买过我服务器代码的买家都知道,我云服务器代码虽然不大,但是全部是开源能运行的,我现在也在不断完善自己的服务器代码,有好几种版本:包括JavaWeb服务器,Java后台服务器,WebSocket服务器,Http服务器,ESP32嵌入式服务器,OpenWRT路由器服务器,Linux应用服务器等等,曾经害怕服务器开发到现在喜欢上服务器开发,源于自己对自己兴趣爱好的坚持,很多人怕自己辛苦写出来的代码低价卖给别人,别人就复制了你的成果,关键的是自己有没有核心竞争力,别人不断模仿,自己却不断地超越上一次的成就,就像我的电路方案不会一下子把所有的功能写完一样,就像国产华为手机不会出一款顶级配置的终结者手机一样。不管怎么样,我都希望购买我电路方案的买家学到真正核心物联网技术。

二、使用步骤

1.准备硬件

(1)购买ESP8266开发板:mini D1 wifi ESP-12F N ESP8266。

芯片包装如下:

(2)购买普通RGB灯,这个到处都有卖的。

(3)购买一个普通的普通白光LED灯

2.搭建Arduino开发环境

(1)第一步下载Arduino IDE安装,双击下一步,下一步,直到完成,建议不要中文路径。

(2)下载ESP8266安装包插件,这是最方便的,如果在Arduino里面搜索安装,你会发现很慢,特别是在这个紧张的芯片之争的关键时期下,按照这个网址去下载:https://www.arduino.cn/thread-76029-1-1.html

(3)双击(2)下载的三个包中的一个,我双击安装的是第二个包,重启Arduino就可以安装好了。

安装好之后你会发现开发板选项多了ESP8266这类的开发板。实在不行就找其他教程再试试了,没有必要一步一步教这个开发环境搭建。

(4)打开我的工程:双击打开,

一看就知道ESP8266创建一个AP热点供笔记本或者手机链接上去,没有密码的。
(5)配置开发板和串口信息

注意选择的是什么型号的开发板型号还有你自己开发板连上电脑之后是占用的是哪个串口号

(6)按照源码的IO口连接RGB灯和白色LED灯,再点击下载
#define LAMP_PIN 16 //照明灯–D0–GPIO16,高电平触发灯亮,所以灯的长端接GPIO16,短端接地

#define LAMP_PIN1 14 //R–D5
#define LAMP_PIN2 12 //G–D6
#define LAMP_PIN3 13 //B–D7


注意了灯的GND与单片机的GND相连。代码中生成三路PWM波控制三个RGB管脚对应的灯丝发光。

下载完成即可运行程序了。

3.搭建Eclipse 安卓开发环境

搭建Eclipse安卓APP开发环境,这个在网上教程特别多,我就不细说了,但是需要注意了我的安卓工程源码是基于安卓系统4.3做的开发,所以版本问题买家自己解决,网上也有方案解决的。Android studio版本的代码我没有写,如果要我写,那么必须加价了,因为我懒得写了!其实两个IDE用哪个都无所谓,工具而已,核心的东西是编码(使用工具的策略),下面是打开工程的截图:

为什么说是最简单的?因为的代码量是同行最少的。

把编译生成的目录bin下面的apk文件传给手机打开如下:

4.准备一份webserver源码

因为要开发网页点灯,必须使用到嵌入式网页服务器,得益于Arduino的库,在安装好ESP8266开发环境之后,在Arduino IDE就有现成的源码供读者使用,初学者可以通过下载IDE自带的源码进行学习,这也是我一路走来的捷径分享给大家了。
源码路径如下图所示:(选了第一个源码)

/*Copyright (c) 2015, Majenko TechnologiesAll rights reserved.Redistribution and use in source and binary forms, with or without modification,are permitted provided that the following conditions are met:* * Redistributions of source code must retain the above copyright notice, thislist of conditions and the following disclaimer.* * Redistributions in binary form must reproduce the above copyright notice, thislist of conditions and the following disclaimer in the documentation and/orother materials provided with the distribution.* * Neither the name of Majenko Technologies nor the names of itscontributors may be used to endorse or promote products derived fromthis software without specific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ANDANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIEDWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE AREDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FORANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ONANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THISSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>#ifndef STASSID
#define STASSID "your-ssid"
#define STAPSK  "your-password"
#endifconst char *ssid = STASSID;
const char *password = STAPSK;ESP8266WebServer server(80);const int led = 13;void handleRoot() {digitalWrite(led, 1);char temp[400];int sec = millis() / 1000;int min = sec / 60;int hr = min / 60;snprintf(temp, 400,"<html>\<head>\<meta http-equiv='refresh' content='5'/>\<title>ESP8266 Demo</title>\<style>\body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\</style>\</head>\<body>\<h1>Hello from ESP8266!</h1>\<p>Uptime: %02d:%02d:%02d</p>\<img src=\"/test.svg\" />\</body>\
</html>",hr, min % 60, sec % 60);server.send(200, "text/html", temp);digitalWrite(led, 0);
}void handleNotFound() {digitalWrite(led, 1);String message = "File Not Found\n\n";message += "URI: ";message += server.uri();message += "\nMethod: ";message += (server.method() == HTTP_GET) ? "GET" : "POST";message += "\nArguments: ";message += server.args();message += "\n";for (uint8_t i = 0; i < server.args(); i++) {message += " " + server.argName(i) + ": " + server.arg(i) + "\n";}server.send(404, "text/plain", message);digitalWrite(led, 0);
}void drawGraph() {String out;out.reserve(2600);char temp[70];out += "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"400\" height=\"150\">\n";out += "<rect width=\"400\" height=\"150\" fill=\"rgb(250, 230, 210)\" stroke-width=\"1\" stroke=\"rgb(0, 0, 0)\" />\n";out += "<g stroke=\"black\">\n";int y = rand() % 130;for (int x = 10; x < 390; x += 10) {int y2 = rand() % 130;sprintf(temp, "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" stroke-width=\"1\" />\n", x, 140 - y, x + 10, 140 - y2);out += temp;y = y2;}out += "</g>\n</svg>\n";server.send(200, "image/svg+xml", out);
}void setup(void) {pinMode(led, OUTPUT);digitalWrite(led, 0);Serial.begin(115200);WiFi.mode(WIFI_STA);WiFi.begin(ssid, password);Serial.println("");// Wait for connectionwhile (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("");Serial.print("Connected to ");Serial.println(ssid);Serial.print("IP address: ");Serial.println(WiFi.localIP());if (MDNS.begin("esp8266")) {Serial.println("MDNS responder started");}server.on("/", handleRoot);server.on("/test.svg", drawGraph);server.on("/inline", []() {server.send(200, "text/plain", "this works as well");});server.onNotFound(handleNotFound);server.begin();Serial.println("HTTP server started");
}void loop(void) {server.handleClient();MDNS.update();
}

5.修改webserver源码

总的来说修改的地方还是很多的,改到面目全非了加入了不少的内容,才能让其功能完善。工程截图:

关键接收网络请求的代码,因为在网页提交表单,单片机需要响应网页的请求,这里我使用的字符串转化为整数的技巧将滚动条提交的表单转化为整型数字,这也是我自己摸索出来的:

/****************************************************** 函数名称:HandleVal()* 函数说明:对客户端请求返回值处理* 参数说明:无
******************************************************/
void HandleVal()
{String wifis = webServer.arg("ssid"); //从JavaScript发送的数据中找ssid的值String wifip = webServer.arg("password"); //从JavaScript发送的数据中找password的值Serial.println(wifis);Serial.println(wifip);  //在这里处理接收到的数据if(wifis.equals("pwm")){     int i=wifip.toInt();//在此把wifip转化成INT型数值,以备后续使用Serial.println(i);    analogWrite(LAMP_PIN, i); }if(wifis.equals("r")){     int i=wifip.toInt();//在此把wifip转化成INT型数值,以备后续使用Serial.println(wifis+" "+i);    analogWrite(LAMP_PIN1, i); }else  if(wifis.equals("g")){     int i=wifip.toInt();//在此把wifip转化成INT型数值,以备后续使用Serial.println(wifis+" "+i);    analogWrite(LAMP_PIN2, i);     }else if(wifis.equals("b")){     int i=wifip.toInt();//在此把wifip转化成INT型数值,以备后续使用Serial.println(wifis+" "+i);    analogWrite(LAMP_PIN3, i); }if(wifip.equals("on")){Serial.println("开灯");controlLamp(true);}else if(wifip.equals("off")){Serial.println("关灯");controlLamp(false);}else if(wifip.equals("data")){Serial.println("getdata");//在这里直接返回数据给客户端}String  cmd="ssid="+wifis+" password="+wifip+" is OK";  webServer.send(200, "text/plain", cmd);//在这里返回数据给客户端
}

详细的源码请到最后面下载我工程源码,尊重原创,尊重劳动成果。

6.准备安卓手机发送http get请求的源码

因为必须要用手机发送get请求激发嵌入式服务器webserver完成提交表单的动作,所以需要一个源码,呵呵。

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import com.itheima.httpclientlogin.R;public class MainActivity extends Activity {private EditText et_username;private EditText et_password;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// [1]找到我们关心的控件et_username = (EditText) findViewById(R.id.et_username);et_password = (EditText) findViewById(R.id.et_password);}// 点击按钮 进行get方式提交数据public void click1(View v) {new Thread(){public void run() {try {String name = et_username.getText().toString().trim();String pwd = et_password.getText().toString().trim();//[2.1]定义get方式要提交的路径    小细节 如果提交中文要对name 和 pwd 进行一个urlencode 编码String path = "http://192.168.11.73:8080/login/LoginServlet?username="+URLEncoder.encode(name, "utf-8")+"&password="+URLEncoder.encode(pwd, "utf-8")+"";//[3]获取httpclient实例DefaultHttpClient client = new DefaultHttpClient();//[3.1]准备get请求 定义 一个httpget实现HttpGet get = new HttpGet(path);//[3.2]执行一个get请求HttpResponse response = client.execute(get);//[4]获取服务器返回的状态码int code = response.getStatusLine().getStatusCode();if (code == 200) {//[5]获取服务器返回的数据   以流的形式返回InputStream inputStream = response.getEntity().getContent();//[6]把流转换成字符串String content = StreamTools.readStream(inputStream);   //[7]展示结果showToast(content);}} catch (Exception e) {e.printStackTrace();}};}.start();}// [1]点击按钮 进行post方式提交数据public void click2(View v) {new Thread(){public void run() {try {//[2]获取用户名和密码String name = et_username.getText().toString().trim();String pwd = et_password.getText().toString().trim();String path = "http://192.168.11.73:8080/login/LoginServlet";//[3]以httpClient 方式进行post 提交DefaultHttpClient client = new DefaultHttpClient();//[3.1]准备post 请求HttpPost post = new HttpPost(path);//[3.1.0]准备parametersList<NameValuePair> lists = new ArrayList<NameValuePair>();//[3.1.1]准备 NameValuePair 实际上就是我们要提交的用户名 和密码  key是服务器key :usernameBasicNameValuePair nameValuePair = new BasicNameValuePair("username",name);BasicNameValuePair pwdValuePair = new BasicNameValuePair("password",pwd);//[3.1.3] 把nameValuePair  和 pwdValuePair  加入到集合中lists.add(nameValuePair);lists.add(pwdValuePair);//[3.1.3]准备entityUrlEncodedFormEntity entity = new UrlEncodedFormEntity(lists);//[3.2]准备post方式提交的正文   以实体形式准备 (键值对形式 )post.setEntity(entity);HttpResponse response = client.execute(post);//[4]获取服务器返回的状态码int code = response.getStatusLine().getStatusCode();if (code == 200) {//[5]获取服务器返回的数据   以流的形式返回InputStream inputStream = response.getEntity().getContent();//[6]把流转换成字符串String content = StreamTools.readStream(inputStream); //[7]展示结果showToast(content);}} catch (Exception e) {e.printStackTrace();}};}.start();}//封装toast方法  该toast方法执行在主线程public void showToast(final String content){runOnUiThread(new Runnable() {@Overridepublic void run() {//该方法一定是执行主线程Toast.makeText(getApplicationContext(), content, 1).show();}});}}

7.修改安卓手机发送http get请求的源码

下面是我根据我ESP8266webserver嵌入式服务器私人定制的代码,必须是原创才能成功。

//[2.1]定义get方式要提交的路径    小细节 如果提交中文要对name 和 pwd 进行一个urlencode 编码String path = "http://"+URLEncoder.encode(ip, "utf-8")+":"+URLEncoder.encode(port, "utf-8")+"/HandleVal?"+"&ssid=daodanjishui"+"&password=off"+"&nocache="+new Date().getTime();//这个地址用户点击触发查询

需要全部完整的源码的话,请到最后链接去获取工程源码,对如果需要Android studio IDE开发工具下的源码也可以联系我。尊重原创,尊重劳动成果从你我做起。

三、运行与调试

(1)用手机测试软件和硬件,ESP8266下载程序完成之后自动重启,开启了一个名字叫:DNSServer example的热点没有密码,用手机wifi连上之后,在浏览器输入192.168.4.1就会进入下面的主页:

(2)开始测试,点击发送按钮:send 就会看到红色的字体,这是ESP8266给的反馈信息,根据这个知道机器是否响应了你的请求,这个反馈不知道有多少人都调不出来,同时看到灯变化了,红灯r亮度值是168,注意了,提交表单的时候页面不会跳转,市面上的软件方案有百分之八十的都会跳转,而我的没有,不信你可以试试页面上那个“提交表单指令测试”,体验一下跳转页面。所以我这个奇特的功能很容易改造为wifi遥控器,不过调试的遇到的麻烦还不如直接下载我的方案了,如下所示:

(3)然后继续红绿蓝三个灯丝合成组合的颜色效果,需要用手调节滑动条(这个滚动条在ESP8266里面实现不知道有多少人做不到,并且滚动的时候能实时响应和反馈回来,如果我设置下载门槛啊,人人都能有了):

最大的亮度是1024,最小亮度是0,相当于熄灭,最漂亮的颜色比例的如下图所示(223行代码,不知道能值多少钱呢?):


(4)打开app,输入ESP8266的IP
操作app上的控件,发现单片机返回数据给手机显示出来了。如下图所示:

黑色的toast显示的“···is OK”是由单片机返回的数据,不需要打开浏览器也可以返回,代码段如下:

最后放一张手机控制照明灯和RGB灯的效果图:(开灯和关灯控制照明灯,滑动条控制RGB灯,照明灯开灯的时候有一个渐变亮度变大的过程,这样适合人的眼睛过渡,不会一下子不适应,下载源码的读者可以亲自体验一下。)


总结

    通过上面运行与调试状态良好,程序和硬件达到博文提出的要求,到此为止:浏览器网页滚动条+手机app无线点亮普通RGB灯就结束了。

    如果是安装开发环境出了问题,那么请大家仔细上网搜寻解决问题的方案;如果是怀疑我代码写错了,那么是不可能的,代码我自己写,自己硬件测试。如果有更多的需求请私下找我交流,我缺的不是技术,而是一个奇特的想法或者创意······

最后附上本博文代码下载地址:https://www.cirmall.com/circuit/23949/
直接跳转

最简单DIY基于ESP8266的智能彩灯③(在网页用按钮+滑动条+手机APP控制RGB灯)相关推荐

  1. 最简单DIY基于ESP8266的智能彩灯⑦(APP通过彩虹调色板和WIFI控制WS2812彩灯)

    ESP8266和ESP32智能彩灯开发系列文章目录 第一篇:最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯) 第二篇:最简单DIY基于ESP8266的智能彩灯②(在网页用按键 ...

  2. 最简单DIY基于ESP8266的智能彩灯⑥(Android开发通过WIFI控制彩灯实现表白神器)

    ESP8266和ESP32智能彩灯开发系列文章目录 第一篇:最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯) 第二篇:最简单DIY基于ESP8266的智能彩灯②(在网页用按键 ...

  3. 最简单DIY基于ESP8266的智能彩灯②(在网页用按键和滑动条控制RGB灯)

    ESP8266和ESP32智能彩灯开发系列文章目录 第一篇:最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯) 第二篇:最简单DIY基于ESP8266的智能彩灯②(在网页用按键 ...

  4. 最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯)

    ESP8266和ESP32智能彩灯开发系列文章目录 第一篇:最简单DIY基于ESP8266的智能彩灯①(在网页用按钮点亮普通RGB灯) 文章目录 ESP8266和ESP32智能彩灯开发系列文章目录 前 ...

  5. 最简单DIY基于ESP8266的物联网智能小车①(webserver服务器网页简单遥控版)

    ESP8266和ESP32物联网智能小车开发系列文章目录 第一篇:最简单DIY基于ESP8266的物联网智能小车①(webserver服务器网页简单遥控版) 文章目录 ESP8266和ESP32物联网 ...

  6. 69、基于STM32单片机智能两轮双轮自平衡小车 蓝牙app控制系统设计

    毕设帮助.开题指导.技术解答(有偿)见文末. 目录 摘要 一.硬件方案 二.设计功能 三.实物图 四.原理图 五.程序源码 六.资料包括 摘要 目前,国内市场上的平衡车琳琅满目,但多数功能单一, 价格 ...

  7. 通过LY-WIFI-1智能WiFi模块实现手机APP控制LED灯————uno端

    uno端 android端完成后,开始实现uno端,主要工作就是接板子和上传代码到单片机.在编写代码前,我们先来了解一下wifi传感器的常用命令 1.wifi传感器常用AT指令 2.针脚接线 1.wi ...

  8. 最简单DIY基于STM32单片机的WIFI智能小车设计方案

    STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇:最简单DIY基于STM32F ...

  9. 最简单DIY基于STM32单片机的蓝牙智能小车设计方案

    STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 文章目录 STM32库函数开发系列文 ...

最新文章

  1. wxWidgets一些代码片段(不断更新中)
  2. 容器的访问元素的成员函数(front,back,下标和at)返回的都是引用
  3. 【BZOJ4916】神犇和蒟蒻(杜教筛)
  4. 美化type=file控件
  5. TensorFlow tf.keras.layers.GlobalAveragePooling1D
  6. 可变cell,自适应cell,理解iOS 8中的Self Sizing Cells和Dynamic Type
  7. 中国丝裂原活化蛋白激酶9市场趋势报告、技术动态创新及市场预测
  8. oracle 数据操作指令,ORACLE数据操作命令
  9. 10 mysql选错索引
  10. jquery实现div自适应浏览器高度
  11. 手动注册native方法
  12. Matlab导出高DPI图像——生成高分辨率.eps .tiff .jpg图像的方法
  13. PCB Layout的这些要点,建议重点掌握
  14. Minimax 算法中的 Alpha Beta 剪枝
  15. bulter机器人_机器人库早报|特拉华大学通过人工智能扩大发展劳动力 1.5 倍
  16. echarts使用e_macarons方法
  17. 阿里云购买域名到icp备案
  18. 三次B样条插值和误差分析
  19. 知名企业面试、笔试题
  20. 为什么生产MES系统对工厂管理如此重要?

热门文章

  1. 什么是服务器?服务器有哪几种类型?
  2. 漫画:猜数字说公牛母牛的高频面试题
  3. 一步教你超简单设置Android Studio背景图片
  4. 【TA-霜狼_may-《百人计划》】美术2.1 DCC工具链与引擎工具链
  5. 转自stormzhang的一些博文
  6. Attribute value is quoted with “ which must be escaped when used within the value 问题解决
  7. markdown无法显示图片的问题
  8. 任意文件下载(读取)
  9. [book]《心流:最优体验心理学》
  10. java 序列化 枚举_java基础-枚举序列化