ESP8266--Arduino开发(驱动WS2812B)

news2024/11/17 21:54:03

文章目录

  • 一、WS2812彩灯介绍
  • 二、安装Adafruit_NeoPixel驱动库
  • 三、Adafruit_NeoPixel库常用接口
  • 四、使用示例
  • 五、网页端控制WS2812B灯带实例

一、WS2812彩灯介绍

WS2812是一个集控制电路与发光电路于一体的智能外控LED光源,外型与5050LED灯珠相同,每个灯珠都是一个像素点。像素点内包含数字接口、数据锁存、信号整形放大驱动电路,还包含高精度的内部振荡器和12V高压可编程定电流控制部分。

在这里插入图片描述

数据协议采用单线归零码的通讯方式,像素点在上电复位以后,DIN端接受从控制器传输过来的数据,首先送过来的24bit数据被第一个像素点提取后,送到像素点内部的数据锁存器,剩余的数据经过内部整形处理电路整形放大后通过DO端口开始转发输出给下一个级联的像素点,每经过一个像素点的传输,信号减少24bit。像素点采用自动整形转发技术,使得该像素点的级联个数不受信号传送的限制,仅仅受限信号传输速度要求。

在这里插入图片描述
按照数据传输协议即可对WS2812进行驱动,当然对于WS2812有许多开源的驱动库,例如:Adafruit_NeoPixel驱动库


二、安装Adafruit_NeoPixel驱动库

在Arduino IDE中点击【项目】—【加载库】—【管理库】,查找Adafruit_NeoPixel库,选择最新版本,点击安装。

在这里插入图片描述
在这里插入图片描述


三、Adafruit_NeoPixel库常用接口

接口说明
Adafruit_NeoPixel led(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800)创建对象:像素点数量、信号引脚、像素类型标准(一般默认即可)
led.begin()对象初始化
led.clear()将颜色值清除到0
led.setPixelColor(i, led.Color(255, 0, 0))设置颜色值:像素点序号、像素颜色
led.show()显示刷新:每次设置完毕必须调用此函数
led.setBrightness()设置亮度:范围0~255
led.Color()将RGB单独颜色值打包成32位颜色值

四、使用示例

#include <Adafruit_NeoPixel.h>                  // 操作WS2812B需要使用的库

#define PIN         0     //GPIO0接口
#define NUMPIXELS   35    //彩灯个数

Adafruit_NeoPixel led(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
	led.begin();
	led.setBrightness(255); //设置亮度 (0~255)
	for(int i=0; i<NUMPIXELS; ++i) {	//所有灯全部设为红色
        led.setPixelColor(i,led.Color(255, 0, 0)); //红色
    }
    led.show();   //刷新显示
    delay(1000);
}
void loop() {
	
}

五、网页端控制WS2812B灯带实例

我们可以将ESP8266设置为AP模式,然后ESP8266开启HTTP服务器,手机或者电脑先连接ESP8266的WiFi(ESP8266,12345678),然后访问ESP8266的IP:192.168.4.1,就可以看到ESP8266的内置网页,本例中的网页很简陋,就是一些按钮,用来切换灯带的状态,包括:

  • 关灯
  • 红色常亮(小灯全部红色,保存常亮)
  • 橙色常亮
  • 黄色常亮
  • 绿色常亮
  • 蓝色常亮
  • 靛青色常亮
  • 紫色常亮
  • 红色跑马(有10个红色小灯在灯带上循环跑动)
  • 橙色跑马
  • 黄色跑马
  • 绿色跑马
  • 蓝色跑马
  • 靛青色跑马
  • 紫色跑马
  • 七彩跑马(彩虹七色,每种颜色5个小灯,循环流动)
  • 七彩变换(彩虹七色,循环切换)

注意:需要根据自身灯带情况,修改:#define NUMPIXELS 35 //彩灯个数

/*
  ESP8266-NodeMCU作为HttpServer服务器控制WS2812B灯带
*/
 
#include <ESP8266WiFi.h>                        // 本程序使用ESP8266WiFi库
#include <ESP8266WebServer.h>                   // web服务器通信库需要使用
#include <Adafruit_NeoPixel.h>                  // 操作WS2812B需要使用的库
#include <Ticker.h>                             //使用Ticker库定时器

#define PIN         0     //GPIO0接口
#define NUMPIXELS   35    //彩灯个数
Adafruit_NeoPixel led(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

Ticker timer1;
int color_change = 0;

Ticker timer2;
int run_count = 0;

Ticker timer3;
int run_color = 1;

/* 1. 设置Wifi接入信息 */
const char* ssid     = "ESP8266";              // 需要连接到的WiFi名
const char* password = "12345678";             // 连接的WiFi密码

/* 2. 创建一个web服务器对象,使用80端口,HTTP网络服务器标准端口号即为80 */
ESP8266WebServer esp8266_server(80);

/* 3. 处理访问网站根目录“/”的访问请求 */
void handleRoot() { 
  String htmlCode = "<!DOCTYPE html>\n"; 
  htmlCode +=       " <html>\n";
  htmlCode +=       "   <head>\n";
  htmlCode +=       "     <meta charset=\"UTF-8\"/>\n";
  htmlCode +=       "     <title>ESP8266 Butoon Ctrl</title>\n";
  htmlCode +=       "   </head>\n"; 
  htmlCode +=       "   <body>\n";
  htmlCode +=       "     <h2 align=\"center\">esp8266控制开关</h2>";
  htmlCode +=       "     <div>\n";
  htmlCode +=       "       <form action=\"/LED_OFF\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"关灯\"></form>\n";
  htmlCode +=       "     </div>\n";
  htmlCode +=       "     <div>\n";
  htmlCode +=       "       <form action=\"/LED_RED_HOLD\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"红色常亮\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_ORANGE_HOLD\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"橙色常亮\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_YELLOW_HOLD\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"黄色常亮\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_GREEN_HOLD\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"绿色常亮\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_BLUE_HOLD\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"蓝色常亮\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_CYAN_HOLD\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"靛青色常亮\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_PURPLE_HOLD\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"紫色常亮\"></form>\n";
  htmlCode +=       "     </div>\n";
  htmlCode +=       "     <div>\n";
  htmlCode +=       "       <form action=\"/LED_RED_RUN\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"红色跑马\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_ORANGE_RUN\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"橙色跑马\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_YELLOW_RUN\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"黄色跑马\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_GREEN_RUN\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"绿色跑马\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_BLUE_RUN\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"蓝色跑马\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_CYAN_RUN\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"靛青色跑马\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_PURPLE_RUN\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"紫色跑马\"></form>\n";
  htmlCode +=       "     </div>\n";
  htmlCode +=       "     <div>\n";
  htmlCode +=       "       <form action=\"/LED_COLORS_RUN\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"七彩跑马\"></form>\n";
  htmlCode +=       "       <form action=\"/LED_COLORS_CHANGE\" method=\"POST\" align=\"center\"><input type=\"submit\" value=\"七彩变换\"></form>\n";
  htmlCode +=       "     </div>\n";
  htmlCode +=       "   </body>\n";
  htmlCode +=       " </html>\n";
  esp8266_server.send(200, "text/html", htmlCode);     // NodeMCU将调用此函数。
}

/* 4. 设置处理404情况的函数'handleNotFound' */
void handleNotFound(){                                              // 当浏览器请求的网络资源无法在服务器找到时,
  esp8266_server.send(404, "text/plain", "404: Not found");         // NodeMCU将调用此函数。
}

//=========================================================
void handle_LED_OFF() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  Serial.println("handle_LED_OFF");
  led.clear();      //将颜色值清除到0
  led.begin();      //显示刷新
  delay(1000);  
}
//-------------------------------------------
void handle_LED_RED_HOLD() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  for(int i=0; i<NUMPIXELS; ++i) {
    led.setPixelColor(i,led.Color(255, 0, 0)); //红色
  }
  led.show();   //刷新显示
  delay(1000);
}
void handle_LED_ORANGE_HOLD() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  for(int i=0; i<NUMPIXELS; ++i) {
    led.setPixelColor(i,led.Color(255, 165, 0)); //橙色
  }
  led.show();   //刷新显示
  delay(1000);
}
void handle_LED_YELLOW_HOLD() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  for(int i=0; i<NUMPIXELS; ++i) {
    led.setPixelColor(i,led.Color(255, 255, 0)); //黄色
  }
  led.show();   //刷新显示
  delay(1000);
}
void handle_LED_GREEN_HOLD() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  for(int i=0; i<NUMPIXELS; ++i) {
    led.setPixelColor(i,led.Color(0, 255, 0)); //绿色
  }
  led.show();   //刷新显示
  delay(1000);
}
void handle_LED_BLUE_HOLD() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  for(int i=0; i<NUMPIXELS; ++i) {
    led.setPixelColor(i,led.Color(0, 0, 255)); //蓝色
  }
  led.show();   //刷新显示
  delay(1000);
}
void handle_LED_CYAN_HOLD() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  for(int i=0; i<NUMPIXELS; ++i) {
    led.setPixelColor(i,led.Color(0, 255, 255)); //靛青色
  }
  led.show();   //刷新显示
  delay(1000);
}
void handle_LED_PURPLE_HOLD() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  for(int i=0; i<NUMPIXELS; ++i) {
    led.setPixelColor(i,led.Color(139, 0, 255)); //紫色
  }
  led.show();   //刷新显示
  delay(1000);
}
//-------------------------------------------
void handle_LED_RED_RUN() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  run_count = 0;
  run_color = 1;
  timer3.attach(0.1,timer3_cb,0);
}
void handle_LED_ORANGE_RUN() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  run_count = 0;
  run_color = 2;
  timer3.attach(0.1,timer3_cb,0);
}
void handle_LED_YELLOW_RUN() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  run_count = 0;
  run_color = 3;
  timer3.attach(0.1,timer3_cb,0);
}
void handle_LED_GREEN_RUN() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  run_count = 0;
  run_color = 4;
  timer3.attach(0.1,timer3_cb,0);
}
void handle_LED_BLUE_RUN() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  run_count = 0;
  run_color = 5;
  timer3.attach(0.1,timer3_cb,0);
}
void handle_LED_CYAN_RUN() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  run_count = 0;
  run_color = 6;
  timer3.attach(0.1,timer3_cb,0);
}
void handle_LED_PURPLE_RUN() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  run_count = 0;
  run_color = 7;
  timer3.attach(0.1,timer3_cb,0);
}
//-------------------------------------------
void handle_LED_COLORS_RUN() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  run_count = 0;
  timer2.attach(0.1,timer2_cb,0);
}
void handle_LED_COLORS_CHANGE() {
  timer1.detach();
  timer2.detach();
  timer3.detach();
  color_change = 0;
  timer1.attach(1,timer1_cb,0);
}
//-------------------------------------------
void timer1_cb(int led_pin) {
  switch(color_change) {
    case 0:
      for(int i=0; i<NUMPIXELS; ++i) {
        led.setPixelColor(i,led.Color(255, 0, 0)); //红色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 1:
      for(int i=0; i<NUMPIXELS; ++i) {
        led.setPixelColor(i,led.Color(255, 165, 0)); //橙色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 2:
      for(int i=0; i<NUMPIXELS; ++i) {
        led.setPixelColor(i,led.Color(255, 255, 0)); //黄色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 3:
      for(int i=0; i<NUMPIXELS; ++i) {
        led.setPixelColor(i,led.Color(0, 255, 0)); //绿色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 4:
      for(int i=0; i<NUMPIXELS; ++i) {
        led.setPixelColor(i,led.Color(0, 0, 255)); //蓝色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 5:
      for(int i=0; i<NUMPIXELS; ++i) {
        led.setPixelColor(i,led.Color(0, 255, 255)); //靛青色
      }
      led.show();   //刷新显示
      delay(1000);
      break; 
    case 6:
      for(int i=0; i<NUMPIXELS; ++i) {
        led.setPixelColor(i,led.Color(139, 0, 255)); //紫色
      }
      led.show();   //刷新显示
      delay(1000);
      break;  
  }
  color_change++;
  color_change = color_change%7;
}
void timer2_cb(int led_pin) {
  led.clear();
  led.show();
  delay(1000);
  
  for(int i=run_count; i<run_count+5; ++i) {
    led.setPixelColor(i%NUMPIXELS,led.Color(255, 0, 0)); //红色
  }
  for(int i=run_count+5; i<run_count+10; ++i) {
    led.setPixelColor(i%NUMPIXELS,led.Color(255, 165, 0)); //橙色
  }
  for(int i=run_count+10; i<run_count+15; ++i) {
    led.setPixelColor(i%NUMPIXELS,led.Color(255, 255, 0)); //黄色
  }
  for(int i=run_count+15; i<run_count+20; ++i) {
    led.setPixelColor(i%NUMPIXELS,led.Color(0, 255, 0)); //绿色
  }
  for(int i=run_count+20; i<run_count+25; ++i) {
    led.setPixelColor(i%NUMPIXELS,led.Color(0, 0, 255)); //蓝色
  }
  for(int i=run_count+25; i<run_count+30; ++i) {
    led.setPixelColor(i%NUMPIXELS,led.Color(0, 255, 255)); //靛青色
  }
  for(int i=run_count+30; i<run_count+35; ++i) {
    led.setPixelColor(i%NUMPIXELS,led.Color(139, 0, 255)); //紫色
  }
  led.show();
  delay(1000);
  
  run_count++;
  run_count = run_count%35;
}
void timer3_cb(int led_pin) {
  led.clear();
  led.show();
  delay(1000);

  switch(run_color) {
    case 1:
      for(int i=run_count; i<run_count+10; ++i) {
        led.setPixelColor(i%NUMPIXELS,led.Color(255, 0, 0)); //红色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 2:
      for(int i=run_count; i<run_count+10; ++i) {
        led.setPixelColor(i%NUMPIXELS,led.Color(255, 165, 0)); //橙色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 3:
      for(int i=run_count; i<run_count+10; ++i) {
        led.setPixelColor(i%NUMPIXELS,led.Color(255, 255, 0)); //黄色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 4:
      for(int i=run_count; i<run_count+10; ++i) {
        led.setPixelColor(i%NUMPIXELS,led.Color(0, 255, 0)); //绿色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 5:
      for(int i=run_count; i<run_count+10; ++i) {
        led.setPixelColor(i%NUMPIXELS,led.Color(0, 0, 255)); //蓝色
      }
      led.show();   //刷新显示
      delay(1000);
      break;
    case 6:
      for(int i=run_count; i<run_count+10; ++i) {
        led.setPixelColor(i%NUMPIXELS,led.Color(0, 255, 255)); //靛青色
      }
      led.show();   //刷新显示
      delay(1000);
      break; 
    case 7:
      for(int i=run_count; i<run_count+10; ++i) {
        led.setPixelColor(i%NUMPIXELS,led.Color(139, 0, 255)); //紫色
      }
      led.show();   //刷新显示
      delay(1000);
      break;  
  }

  run_count++;
  run_count = run_count%35;
}
//=========================================================
void setup() {
  /* 1. 初始化串口通讯波特率为115200*/
  Serial.begin(115200);

  /* 2. 开启wifi连接,连接成功后打印IP地址 */
  WiFi.softAP(ssid, password);                  // 此语句是重点。WiFi.softAP用于启动NodeMCU的AP模式。
                                                // 括号中有两个参数,ssid是WiFi名。password是WiFi密码。
                                                // 这两个参数具体内容在setup函数之前的位置进行定义。
                                                
  Serial.print("\r\nAccess Point: ");           // 串口监视器输出热点ssid
  Serial.println(ssid); 
  Serial.print("IP address: ");                 // 串口监视器输出热点IP
  Serial.println(WiFi.softAPIP());

  /* 3. 开启http网络服务器功能 */
  esp8266_server.begin();                       // 启动http网络服务器
  esp8266_server.on("/", handleRoot);           // 设置请求根目录时的处理函数函数
  esp8266_server.onNotFound(handleNotFound);    // 设置无法响应时的处理函数    

  esp8266_server.on("/LED_OFF", handle_LED_OFF);                    // 设置关灯的处理函数函数
  
  esp8266_server.on("/LED_RED_HOLD", handle_LED_RED_HOLD);          // 设置红色常亮的处理函数函数
  esp8266_server.on("/LED_ORANGE_HOLD", handle_LED_ORANGE_HOLD);    // 设置橙色常亮的处理函数函数
  esp8266_server.on("/LED_YELLOW_HOLD", handle_LED_YELLOW_HOLD);    // 设置黄色常亮的处理函数函数
  esp8266_server.on("/LED_GREEN_HOLD", handle_LED_GREEN_HOLD);      // 设置绿色常亮的处理函数函数
  esp8266_server.on("/LED_BLUE_HOLD", handle_LED_BLUE_HOLD);        // 设置蓝色常亮的处理函数函数
  esp8266_server.on("/LED_CYAN_HOLD", handle_LED_CYAN_HOLD);        // 设置靛青色常亮的处理函数函数
  esp8266_server.on("/LED_PURPLE_HOLD", handle_LED_PURPLE_HOLD);    // 设置紫色常亮的处理函数函数

  esp8266_server.on("/LED_RED_RUN", handle_LED_RED_RUN);            // 设置红色跑马的处理函数函数
  esp8266_server.on("/LED_ORANGE_RUN", handle_LED_ORANGE_RUN);      // 设置橙色跑马的处理函数函数
  esp8266_server.on("/LED_YELLOW_RUN", handle_LED_YELLOW_RUN);      // 设置黄色跑马的处理函数函数
  esp8266_server.on("/LED_GREEN_RUN", handle_LED_GREEN_RUN);        // 设置绿色跑马的处理函数函数
  esp8266_server.on("/LED_BLUE_RUN", handle_LED_BLUE_RUN);          // 设置蓝色跑马的处理函数函数
  esp8266_server.on("/LED_CYAN_RUN", handle_LED_CYAN_RUN);          // 设置靛青色跑马的处理函数函数
  esp8266_server.on("/LED_PURPLE_RUN", handle_LED_PURPLE_RUN);      // 设置紫色跑马的处理函数函数

  esp8266_server.on("/LED_COLORS_RUN", handle_LED_COLORS_RUN);      // 设置七彩跑马的处理函数函数
  esp8266_server.on("/LED_COLORS_CHANGE", handle_LED_COLORS_CHANGE);// 设置七彩变换的处理函数函数
  
  Serial.println("HTTP esp8266_server started");// 告知用户ESP8266网络服务功能已经启动

  /* 4. 初始化WS2812B */
  led.begin();
  led.setBrightness(255); //设置亮度 (0~255)
}

void loop() {
  esp8266_server.handleClient();                // 处理http访问,需要一直运行
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/11685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux修改默认登录端口22

目录 一、编辑sshd配置 二、重启sshd 三、防火墙开放端口 四、重启防火墙 五、测试连接 六、防火墙关闭22端口 前言&#xff1a;ssh登录的默认端口是22&#xff0c;如果不修改默认端口的话&#xff0c;会不安全&#xff0c;默认端口会遭到攻击&#xff0c;为了安全要修…

JavaEE之HTTP协议 Ⅰ

文章目录前言一、协议格式总结二、认识URL三、认识"方法"(method)1.GETGET请求的特点2.POSTPOST 请求的特点总结前言 网络技术中,最核心的概念,就是"协议",HTTP就是应用层典型的协议 应用层,很多时候需要程序员自定义应用层协议,也有一些现成的协议,供我们…

代码随想录算法训练营第57天 | 647. 回文子串 516.最长回文子序列 dp总结

代码随想录系列文章目录 动态规划篇 —— 区间dp 文章目录代码随想录系列文章目录动态规划篇 —— 区间dp647. 回文子串516.最长回文子序列代码随想录中动态规划总结647. 回文子串 题目链接 回文子串还是很难的我觉得&#xff0c;所以应该多做几遍 这道题的dp数组代表就不是问…

Linux之用户操作【用户的增删改查你要的都有】【详细】

目录用户相关介绍添加用户useradd [选项] 用户名passwd 用户名细节说明删除用户userdel 用户名userdel -r 用户名查询用户id 用户名切换用户su 用户名默认输入su切换到管理员目录用户组groupadd 组名userdel 组名补充&#xff1a; useradd -g 用户组 用户名补充&#xff1a;use…

BigLEN(rat)脑内最丰富的多肽之一、LENSSPQAPARRLLPP

BigLEN(rat) TFA 是脑内最丰富的多肽之一&#xff0c;是有效的 GPR171 激动剂&#xff0c;其EC50 值为1.6 nM。 BigLEN(rat) TFA, one of the most abundant peptides in brain, is a potent GPR171 agonist, with an EC50 of 1.6 nM[1][2].编号: 200557 中文名称: BigLEN(rat)…

详解MySQL事务日志——undo log

前言 众所周知&#xff0c;事务的一大特点是原子性&#xff0c;即同一事务的SQL要同时成功或者失败。那大家有没有想过在MySQL的innoDB存储引擎中是如何保证这样的原子性操作的&#xff1f;实际上它是利用事务执行过程中生成的日志undo log来实现的&#xff0c;那么undo log究…

加速推进企业信息化建设,SRM采购系统赋能建筑工程产业生态链实现数字化转型

建筑工程行业是拉动国民经济发展的重要支柱产业之一。近年来建筑业占国民生产总值的20&#xff05;左右&#xff0c;对国民经济影响很大。随着我国建筑业企业生产和经营规模的不断扩大&#xff0c;建筑业总产值持续增长&#xff0c;传统的管理手段早已无法实现企业的精细化管理…

Fiddler/Charles - 夜神模拟器证书安装App抓包

Fiddler/Charles - 夜神模拟器证书安装App抓包 文章目录Fiddler/Charles - 夜神模拟器证书安装App抓包前言一、软件安装1.Openssl安装1.1下载安装1.2配置环境变量1.3查看openssl版本&#xff0c;输入命令&#xff1a;openssl version2.夜神模拟器安装1.1 下载安装1.2工具准备&a…

三、RTMP协议 视频Chunk和音频Chunk到底长啥样?

重要概念 RTMP Chunk Header RTMP Chunk Header的长度不是固定的&#xff0c;分为: 12 Bytes、8 Bytes、4 Bytes、1 Byte 四种&#xff0c;由RTMP Chunk Header前2位决定。 FLV VideoTagHeader 分析RTMP流时&#xff0c;经常看到与0x17或0x27进行比较的情况&#xff0c;那0x1…

Azide-PEG-acid,N3-PEG-COOH,叠氮-聚乙二醇-羧基多用于点击化学

Azide-PEG-acid&#xff08;N3-PEG-COOH&#xff09;&#xff0c;该化学试剂的中文名为叠氮-聚乙二醇-羧基&#xff0c;它所属分类为Azide PEG Carboxylic acid PEG。 该peg试剂的分子量均可定制&#xff0c;有&#xff1a;1000、2000、3400、20000、10000、5000 。该试剂质量…

k8s部署

kubernetes简要 Kubernetes 是用于自动部署, 扩展和管理容器化应用程序的开源系统. 它将组成应用程序的容器组合成逻辑单元, 以便于管理和服务发现 kubernetes 功能简介 服务发现和负载均衡 存储编排 自动部署和回滚 自动完成装箱计算 自我修复 密钥与配置管理 主机规…

UE5蓝图常用流程节点总结

整理了一下平常做功能开发比较常用的蓝图节点&#xff0c;目录如下&#xff1a; 1. ExecuteConsoleCommand 2. Do N 3. Do Once 4. DoOnceMultiInput 5. Gate 6.MultiGate 7. Branch 8. Sequence 9. FlipFlop 10. Delay 11. Retriggerable Delay 1. ExecuteConsole…

OffiSmart Summit智慧办公及空间管理上海线下峰会精彩亮点抢先看

“聚焦行业生态格局焕新&#xff0c;赋能智慧办公全面落地”——OffiSmart Summit上海国际智慧办公与空间管理峰会即将盛大召开&#xff0c;2022下半年不容错过的智慧办公行业盛会&#xff01;时间&#xff1a;2022年11月22日 9:00 - 16:30 地点&#xff1a;上海市浦东新区卓美…

Python3《机器学习实战》学习笔记(九):ANN人工神经网络基础详解

文章目录一、简介二、ANN算法细节详解2.1 深度学习要解决的问题2.2 深度学习应用领域2.3 计算机视觉任务2.4 视觉任务中遇到的问题2.4.1回顾K近邻算法2.4.2为啥不能用K近邻2.5得分函数2.6损失函数2.7前向传播流程2.8反向传播计算2.9神经网络整体架构2.10神经元个数对结果的影响…

【Linux】Jetson nano 使用记录,安装torch1.8、yolov5 tensorrt加速、java等

Jetson nano一、u盘系统安装1.1 烧录EMMC引导1.2 烧录U盘系统二、启动、环境配置2.1 设置vnc分辨率2.2. 更新软件三、启动、环境配置3.1 安装conda3.2 安装python3.6版本torch1.83.3 配置yolov5 tensorrt加速3.3.1 转换wts和engine3.3.2使用python脚本运行engine其它记录安装ja…

Postgresql顺滑升级步骤(11升级到14)

首先下载pgsql14的源码包进行安装&#xff1a; yum install postgresql14 –y yum install postgresql14-server -y 附带安装 yum install postgresql14-libs yum install postgresql14-contrib yum install postgresql14-devel 注&#xff1a;如果旧版本装了插件&#…

生态环境影响评价制图流程

生态现状评价内容中基本图件构成包含&#xff1a;项目区域地理位置图、工程平面图、调查样方、样线、点位、断面等布设图、土地利用现状图、地表水系图、植被类型图、植被覆盖度图、归一化植被指数图、生态系统类型图、土壤侵蚀图、物种适宜生境分布图等。 介绍 2.2.遥感常用数…

基于微信小程序的核酸检测系统源码

开发环境及工具&#xff1a; 大等于jdk1.8&#xff0c;大于mysql5.5&#xff0c;idea&#xff08;eclipse&#xff09;&#xff0c;微信开发者工具 技术说明&#xff1a; springboot mybatis 小程序 代码注释齐全&#xff0c;没有多余代码&#xff0c;适合学习(毕设)&#…

动态自适应可变加权极限学习机ELM预测算法附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

Vue(十)——页面路由(2)

目录 router-link的replace属性 编程式路由导航 缓存路由组件 两个新的生命周期钩子 路由守卫 全局守卫 独享守卫 组件内守卫 路由器的两种工作模式 hash模式 history模式 router-link的replace属性 浏览器历史记录的操作模式&#xff1a;push模式 对历史记录的操作…