NodeMCU(ESP8266)使用UDP控制8x8点阵显示

前言

之前写一篇关于 Arduino Max7219 案例,展示如何使用arduino+Max7219控制8x8点阵显示内容。最近恰好在搞esp8266,所以想用(esp8266+8x8点阵)做一个时钟出来, 但是无奈当时就只有一个8x8的点阵,做时钟需要一个32x8的点阵;所以就先拿这个8x8点阵试试效果。众所周知搞点阵显示是需要取模的, 但是取模毕竟是程序上的效果,并非真实的显示效果,所以我就在想为啥不能用手机来控制点阵取模, 直接就能看到效果,不满意还能直接改不用每次都写入到程序中去,说干就干。

视频展示

废话不多说,先发一个效果视频。

使用udp通信控制8x8点阵显示内容

原理

其实原理比较简单;

  1. ESP8266连接上WiFi,然后开启UDP服务,端口为1234
  2. 在同一路由器的网络下,用户通过微信小程序向esp8266广播数据
  3. esp8266接收到数据以后就向Max7219点阵中写入数据

硬件部分

关于MAX72198x8点阵的介绍我就不搬运了,大家有兴趣可以参考这篇文章,写的比较详细:

Arduino 学习笔记 | 单片机控制驱动MAX7219 8*8 LED点阵显示模块

WIFI UPD库函数啥的可以参考这篇(里面包括UDP协议的介绍):
太极创客 ESP8266 – WiFiUDP库

硬件接线

接线可参考如下接线图(不擅长画图,随便画一画):

代码

秉承不重复造轮子的思想(其实是不想自己去摸索),驱动max7219我们使用了LedControl库;这个库默认是没有的, 需要自己到库文件管理中搜索(工具->管理库->搜索LedControl->选第一个);

代码:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <LedControl.h>#define ssid      "WiFi名称"
#define password  "WiFi密码"
#define upd_port  1234
int DIN = D7;
int CS =  D6;
int CLK = D5;// 示例化对象
LedControl lc = LedControl(DIN, CLK, CS, 1);
//实例化WiFiUDP对象
WiFiUDP Udp;
// 等待连接WiFi图案
byte wifiicon[8] = {0x3C, 0x42, 0x99, 0x24, 0x42, 0x18, 0x0, 0x18};
// 接收UDP数据包数组
byte packetBuffer[9];void setup() {// 打开串口Serial.begin(115200);// 启动时,MAX72XX处于省电模式lc.shutdown(0, false);// 将亮度设置为最大值lc.setIntensity(0, 8);// 清除显示lc.clearDisplay(0);// 显示连接wifiiconshow(wifiicon);// 连接到wifiWiFi.begin(ssid, password);// 等待连接while (WiFi.status() != WL_CONNECTED) {delay(5000);}Serial.println("连接成功");// 启动Udp监听服务if (Udp.begin(upd_port)) {Serial.println("监听成功");// 打印本地的ip地址,在UDP工具中会使用到//WiFi.localIP().toString().c_str()用于将获取的本地IP地址转化为字符串Serial.printf("现在收听IP:%s, UDP端口:%d\n", WiFi.localIP().toString().c_str(), upd_port);} else {Serial.println("监听失败");}// 初始化完成显示一个动画animation();lc.clearDisplay(0);
}void loop() {//解析Udp数据包int packetSize = Udp.parsePacket();//解析包不为空if (packetSize) {//收到Udp数据包//Udp.remoteIP().toString().c_str()用于将获取的远端IP地址转化为字符串Serial.printf("收到来自远程IP:%s(远程端口:%d)的数据包字节数:%d\n", Udp.remoteIP().toString().c_str(), Udp.remotePort(), packetSize);Udp.read(packetBuffer, 9);// 这里我们将第9位数据固定为某个值,用于判断我们的数据包格式是否正常,(避免随便发个数据包都可以生效)if (packetBuffer[8] == 0xef) {show(packetBuffer);//向udp工具发送消息Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());char replyPacket[1] = {0x01};//把数据写入发送缓冲区Udp.write(replyPacket);//发送数据Udp.endPacket();}}
}/**显示内容
*/
void show(byte *data) {for (int i = 0; i < 8; i++) {lc.setRow(0, i, data[i]);}
}/**开机动画
*/
void animation() {byte temp[64][8];int a = 0x1, b = 0x00, fx = 0x00;for (int i = 0; i < 64; i++) {// 重置数据if (b == 0xff || b == 0x00) {fx = fx == 0x00 ? 0x01 : 0x00;a = fx == 0x00 ? 0x1 : 0x80;b = 0x00;} else {a = fx == 0x00 ? (a << 0x1) :  (a >> 0x1) ;}b += a | 0x00;for (int j = 0; j <= 8; j++) {if (j == i / 8) {temp[i][i / 8] = (byte)b;} else if (j < i / 8) {temp[i][j] = (byte)0xff;} else {temp[i][j] = (byte)0x00;}}}for (int i = 0; i < 64; i++) {for (int j = 0; j < 8; j++) {lc.setRow(0, j, temp[i][j]);delay(10);}}
}

微信小程序

为了方便操作,这里我们直接使用微信小程序来控制。

  • 如果想自己增加更多功能,这里有微信小程序的开源代码(其实也没多少代码):

    esp8266-udp-lattice

  • 如果你只是想体验一下这个功能,可以使用我个人的微信小程序(微信扫码进入即可):

结尾

这里我提供一个8x8点阵的在线取模工具,做的比较粗糙,如果有需要改进的地方欢迎在评论区留言。

8x8点阵的在线取模工具

参考文章

Arduino Max7219 案例

太极创客 ESP8266 – WiFiUDP库

Arduino 学习笔记 | 单片机控制驱动MAX7219 8*8 LED点阵显示模块

NodeMCU(ESP8266)使用UDP控制8x8点阵显示相关推荐

  1. 52 8x8点阵c语言程序,51单片机8x8点阵显示程序

    <51单片机8x8点阵显示程序>由会员分享,可在线阅读,更多相关<51单片机8x8点阵显示程序(3页珍藏版)>请在人人文库网上搜索. 1.include #include#de ...

  2. Arduino UNO+ MAX7219驱动8X8点阵显示+Proteus仿真

    Arduino UNO+ MAX7219驱动8X8点阵显示 Proteus仿真 所需库:LedControl 取模软件:pctolcd2002 图像取模:8X8点阵 取模注意,需要右移一个像素,请照着 ...

  3. Nodemcu+ESP8266实现WEB控制家用电器

    一,教程目的 通过Nodemcu+ESP8266通过网页去控制继电器以及灯泡. 二,实验环境 操作系统: windows10 硬件: ESP8266开发板 x1(CP2102)需要下载CP2102驱动 ...

  4. 单片机控制LED点阵显示心形图形并滚动

    题目要求: 显示心形图形,并不断滚动 仿真电路图: 仿真效果: C语言程序代码: #include<reg51.h> #include<intrins.h> unsigned ...

  5. 51单片机——8X8点阵显示

    74hc595.h: #ifndef __74hc595_H__ #define __74hc595_H__ /************************************位定义***** ...

  6. 汉字点阵c语言程序,用c51单片机控制1616点阵显示汉字源代码

    #include #define uchar unsigned char #define uint unsigned int #define out0 P0 #define out2 P2 #defi ...

  7. ESP8266(ESP-12F)案例实操 -- 8x32点阵显示(MAX7219)

    上一篇文章介绍过LedControl库函数,下面就用LedControl库来驱动点阵屏 案例模块 8x8点阵级联模块再某宝就能买到,以下是4块8x8的点阵模块级联,需要注意的是LedControl库最 ...

  8. 物联网开发笔记(24)- 使用Micropython开发ESP32开发板之控制8x8点阵屏

    上一节我们讲解了如何控制4位数码管,这一节我们来一起学一下如何控制8x8点阵屏显示流水灯和爱心. 一.目的 使用MicroPython开发ESP32控制8x8点阵屏 二.环境 ESP32 + 8x8点 ...

  9. 51单片机STC 89C52RC进阶 – 自制8x8点阵、点亮单颗LED、显示点阵汉字

    电路及驱动原理 上图是CS1088B的8x8 LED点阵的部分技术文档截图,最下面就是这个点阵模块的基本电路图. 其实很简单,每一横行控制LED的一极,每一竖列又控制LED的另一极.又因为是一个矩阵, ...

  10. 51单片机基于Proteus的8X8点阵滚动显示心形

    代码及仿真原理图下载地址: https://download.csdn.net/download/qq_41639829/10641349 一.效果展示及连线方式 注:制作动图时效果显示不好 二.所用 ...

最新文章

  1. Oracle語句大全
  2. java http 下载网页代码_Java下http下载文件客户端和上传文件客户端实例代码
  3. python 制作自定义包并安装
  4. Silverlight C# 游戏开发:L2 自定义模型导入
  5. 【数据结构与算法】之判断一个整数是否是 4 的幂次方的高逼格算法
  6. NB-IOT和LoRa技术优劣对比
  7. java dll 乱码_java调用c++ dll出现中文乱码 | 学步园
  8. cocos2d-x之读取plist文件
  9. redhat升级linux内核,用rpm方式升级RHEL6.1内核
  10. 计算机组成原理—数据的表示、运算与校验(思维导图)
  11. AOP(execution表达式)
  12. JavaWeb项目为什么我们要放弃jsp?为什么要前后端解耦?为什么要前后端分离?2.0版,为分布式架构打基础。
  13. 2d unity 多物体 射线_Unity3D 之射线检测
  14. 分享雷柏无线鼠标接收器损坏后的更换方法
  15. AI 大数据在数据隐私保护下如何普惠共享?CCF TF「联邦学习」研讨会给出了答案
  16. 《恋恋笔记本》观后感
  17. 北邮数电期末复习——第三章
  18. 约数国王(A king)
  19. java基础入门第二版二手,细节爆炸
  20. Spring框架(Spring5新功能)

热门文章

  1. [新功能]文章预览功能
  2. 07.Thymeleaf使用与语法最全详解(精)
  3. 05_过滤器解决请求中文乱码(继承HttpServletRequestWrapper)
  4. 循环删除list中多个元素
  5. [2018.03.14 T3] 圈圈(cyclic)
  6. js基础-(一)-基本数据类型
  7. Vuex的官方文档笔记
  8. rsync结合inotify工具实现实时同步传输文件
  9. python sleep 毫秒_如何在python中休眠Webdriver毫秒
  10. python整体设计目标怎么写_设计模式及Python实现