整活从未停止,坚持没有几个😢😢😢 2022-08-06 学习, 厌世烦话 暂无评论 ### 我可真是个大聪明🤡🤡🤡 > 整活从未停止,坚持没有几个,每天忙忙忙,焦虑焦虑焦虑,被自己给整笑了,一直能坚持下去的事情好像没有几件,上个月好像在看Vue,看了个半吊子,现在又开始看bootstrap,我在干哈啊? 那就接着奏乐,接着舞吧😂😂😂 > mvc的设计模式好像还是比较流行的,其实以前接触过mvc的项目,是基于.netframework的,现在流行的是.Net6,而且我感觉webapi和mvc的界限越来越模糊了,微软还是挺青睐bootstrap的,直接就默认内置内vs的模板项目中了,主要解决了多个终端的适配问题,大致的看了一下教程,确实挺牛皮的。教练!我要学! 也不说什么豪言壮语要做什么大项目了,我感觉我又会学个半吊子溜了。😅😅😅
Nodemcu(Esp8266)の折腾日记🤪~🤪~🤪~ 2022-08-01 学习 暂无评论 ## 写在前面 🥳🥳🥳 > 上周五从淮北回来,开发板和模块都到了,浅玩了一会儿,没学过嵌入式,这些东西太陌生了😅😅😅,而且c++也太久没碰,忘记的差不多了。 Tips(开发板相关): > - 不是所有的灯都是高电平亮,低电平灭,nodemcu板载的led就是低电平亮,高电平灭 - 引脚的分类(我知道的): - gnd 就是地线 - vcc 就是正极 - clk 可以输入时钟信号 - 引脚的模式: - 输入 INPUT 引脚可以接收电平信号 - 输出 OUTPUT 引脚输出电平信号 - 上拉 INPUT_PULLUP 不知道干啥的,好像是可以控制电阻的, - 有的模块有封装好的库,可以直接使用,有些是不需要的,比如led灯,只要给i/o引脚输入高电平就可以亮了,但是数码管是需要第三方的库,使用起来才比较“优雅” Tips(编程相关): > - setup() 初始化的时候执行的代码块 - 需要用pinMod(pin,mod)定义引脚模式,不然操作不了引脚, - loop() 循环的代码块 这里面的代码会一直循环,nodemcu硬件应该是只有单线程,实现多线程的话需要用第三方的库 ticker,b站有相关的教程 Timeline: 2022-8-1:顶多能点个灯,我终于可以控制rgb的灯了,为什么花了这么长时间,有两个原因, 1. 忘记定义引脚模式为输出模式 2. nodemcu板子上的引脚和esp8266的原始引脚是不对应的,板子上的D2应该定义GPIO4,给我睁大眼睛,看仔细。😒😒😒 接下来需要安排好引脚和模块的位置,用按钮输入信号,mqtt协议,巴法云,等。 📅:20220802 > 现在只剩下无源蜂鸣器没解决了 1. 当按钮按下的时候,数码管开始倒计时,并且向topic发送一条消息on,倒计时结束后会继续显示时间, 2. 当接收到mqtt的消息的时候也会开始倒计时,效果和开关是一样的 3. 也已经通过巴法云接入到了天猫精灵,应该也是可以直接接入米家的 ⭐代码分析⭐: MQTT: ``` c++ #include #include //********************需要修改的部分*******************// //巴法云私钥 #define ID_MQTT "****" //用户私钥,控制台获取 const char *topic = "TickDown001"; //主题名字,可在巴法云控制台自行创建,名称随意 //**************************************************// const char *mqtt_server = "bemfa.com"; //默认,MQTT服务器 const int mqtt_server_port = 9501; //默认,MQTT服务器 WiFiClient espClient; PubSubClient client(espClient); client.setServer(mqtt_server, mqtt_server_port); //设置mqtt服务器 client.setCallback(callback); // mqtt消息处理 //巴法云回调函数 void callback(char *topic, byte *payload, unsigned int length) { Serial.print("Topic:"); Serial.println(topic); String msg = ""; for (int i = 0; i < length; i++) { msg += (char)payload[i]; } Serial.print("Msg:"); Serial.println(msg); if (msg == "on" && IsStart == false) { IsStart = true; startTick(); } else if (msg == "off") { //如果接收字符off,亮灯 } msg = ""; } //订阅主题,如果需要订阅多个主题,可发送多条订阅指令client.subscribe(topic2);client.subscribe(topic3); client.subscribe(topic); client.publish(topic, "倒计时正在进行中!!!"); void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(ID_MQTT)) { Serial.println("connected"); Serial.print("subscribe:"); Serial.println(topic); //订阅主题,如果需要订阅多个主题,可发送多条订阅指令client.subscribe(topic2);client.subscribe(topic3); client.subscribe(topic); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } //loop函数巴法云 if (!client.connected()) { reconnect(); } client.loop(); ``` 以上是更MQTT协议相关的代码,其实很容易理解的 - 先引入必要的库 - 必要的几个参数 - 用户私钥 控制台获取 - topic主题,再控制台创建,智能家居的话可以是开关、插座、空调等等 - mqtt服务器地址和端口 - 实例化client需要传一个wifi的实例,然后`setServer()`传入服务器、端口、`setCallback()`设置回调函数 - 回调函数有三个参数,第一个是主题,第二个是返回值,第三个是值的长度,需要转换成string类型 - 订阅主题 `subscribe()`,执行多行可以订阅多个主题 - 发布消息`publish()`第一个参数是主题名,第二个是发布的内容 - `client.connected()`可以返回mqtt连接状态 - `client.loop();`这个可以理解成发送心跳包和读取服务器数据,需要一直执行的 📅:20220806 > 前几天把蜂鸣器也解决了,这里踩了一个坑(其实就是自己脑子不能转弯🥴🥴🥴) >下面是一张在网上找了一张频率对应的表  > 小学二年级学过频率的定义,一秒钟内震动的次数,比如“哆”频率是262,也就是一秒钟震动262次,1000/262=3.816794 3.8167毫秒,3816微妙震动一次,但是`delay()`方法最小单位是毫秒,所以要用这个微秒来做延迟`os_delay_us()` 其实3816是它的周期,一个周期是低电平 间隔 高电平 间隔 组成的,所以这个间隔的时间需要3816/2=1908us, 这是音调,要想出音乐还得要有拍子,比如哆的四分音符,它的for循环的次数就是 1000000/4/1908\*2=262.054507次,八分音符就是1000000/8/1908\*2=131.027254次 折腾倒计时就算结束了,下一个准备弄远程空调和远程开关 以上!
开始整活~~~esp8266模块 2022-07-20 学习 暂无评论 > bg:宿舍的洗衣机离我比较远,而且不能倒柔润剂和消毒液,洗的过程中需要去倒消毒液,然后还得收衣服,每次都用天猫精灵来设置两个提醒:sweat_smile::sweat_smile: 虽然但是,就是玩 :smile: > tg:用天猫精灵控制esp8266模块,模块上接了一个数码管,一个无源蜂鸣器、积木按钮,还有一个led灯(这些不知道能不能全接上),模块接收到了信号,会固定倒计时32分钟提醒一下倒洗衣液,44分钟之后收衣服,提醒方式就是蜂鸣器响,led灯闪。信号可以是按钮输入的高低电平,天猫精灵的信号:high_brightness: :high_brightness: 清单 :paperclip::paperclip::paperclip: - RGB模块 三色LED模块 全彩LED模块 ***1** - 新款蓝板 电子积木 大按键模块按钮模块五色套装 ***5** - 2.54MM 40P杜邦线 双头 - 母对母***15** - 公对母***15** - ESP8266串口wifi模块 NodeMCU Lua V3物联网开发板 CH340 ***1** - 无源蜂鸣器模块 低电平触发 发声模块 蜂鸣器控制板 报警器 ***1** - 4位数码管显示模块 LED亮度可调 带时钟点 TM1637 ***1** > follow-up: 如果上面那个可以实现,那么接下来会做这两个 1. 买小米的空调伴侣2来远程控制空调没戏了(插座位置是死角) 说不定可以用esp8266+红外传感器实现 2. 宿舍的开关面板撬不开,装不了智能开关,可以试试esp8266+SG90舵机实现机械开关。不知道那个舵机能不能按的动豆形开关,管他呢。 > end:现在啥都没买,叨逼叨这么多,菜狗赶快下单!!!:dog::dog:
关于Cloudflare自选ip的问题 2022-07-18 学习, Linux 暂无评论 ## 使用Cloudflare > 以前是根据教程来的,后来不能用面板添加域名,再加上Cloudflare不再支持免费的域名,那个ml域名只套了4个子域名,原来我解析的流程有严重的错误 1. 首先需要在cf上CNAME解析到源域名(这个域名A记录是服务器ip) 2. 需要在dns服务商那里解析到cf提供的域名上:star: > 之前就是这步出错了,导致一直提示证书无效,cf提供15年的证书是源证书,其实就是cf自签证书,还有一个浏览器到cf服务器的边缘证书,如果不接入cf,这个边缘证书就一直没有,导致证书错误, 3. 边缘正书Active之后,就可以在dns服务上解析到自选ip了。
SQL语句,一步一步。 2022-07-11 学习 暂无评论 ## 分组查询 group by >把多条数据进行分组输出,一般用`group by`,可以根据一个字段分组也可以根据多个分组,如果是多个字段分组,多个字段一样才算一组,任何一个字段不一样都不算一组,有点像主键🔑,举个例子🌰 ```sql select id,count(*) from table1 group by id; ``` ```sql select id,date,count(*) from table1 group by id,date; ``` > 根据id分组,获取这个id的个数,要注意的是`count(*)`必须是单行表达式,如果要在这个分组后的结果集中筛选可以在`group by` 后面加上`having 条件` ```sql select id,count(*) from table1 group by id having count(*)>10; ``` >❗切记哈❗,`where`条件是对表中的原始数据进行筛选,(或者说是对行数据进行筛选)分组后的结果集是不存在的新表,对这个新的结果集筛选要用`having` ## 连接查询 > 连接查询又称多表查询,有很多钟方式 > > ```sql > select 字段 > from 表一 > join 表二 //内外链接的区别在这 > on 连接的条件 > where 筛选条件 > group by 分组 > having 分组筛选 > order by 排序 > ``` - 内连接 `inner join` inner可以省略 内连接可以理解成,通过某个条件连接两个表(外键)这是99语法,其实就是92语法中,where条件,但是92语法可读性较差 - 外连接 - 左连:`left` - 右连接:`right` 外连接中要区分主从表,查询结果中包含了**主表的所有记录**,如果`on`后面的条件成立,则显示从表内容,如果不存在则显示`NULL`,**外连接可以理解成从表是主表的某种条件**,要需要查询哪个表,哪个就是主表。 左连接的左边是主表, 右连接的右边是主表, 某种意义上左右连接是一样的。 - 全连接:`full` (没听明白啥意思,反正用的少) - 交叉连接: `cross` 交叉连接就是两个表互乘,表a为1,2,3表b为4,5,6,用cross就是14,15,16。24,25,26。34,35,36,行数就是表一*表二 ## 子查询:star2: > 出现在其他语句内部的select就叫子查询,有点像套娃,可以出现在 select,from,where,having这个关键字的后面。 | 类别 | 特点 | 运算符 | Tips | | ---------- | -------- | :----------------------------: | :------------------------------------------------------: | | 标量子查询 | 一行一列 | 关系运算符 < > <= | 可以理解成是个变量,某个人具体的年龄,姓名等 | | 列子查询 | 一列多行 | **in**/**not in**/any/some/all | 结果集是列表,也可以用于函数,max,min等等 | | 行子查询 | 一行多列 | 没学明白 :sweat: | 多个条件,反正用的少 | | 表子查询 | 多行多列 | | 生成一个新的表,所以必须要有别名,根据别名在进行筛选操作 | >select 仅仅支持**标量** > >from支持**表** > > where或having **标量:star:** **列:star:** **行** ## 分页查询 > 网页中很常见的需求,ef框架做分页很简单,用Linq就行了。 > > ```sql > select 列表 from 表名 【一系列条件 where, group by】 limit offset,size; > select 列表 from 表名 【一系列条件 where, group by】 limit (page-1)*size,size; > ``` > > offset:起始的索引,从0开始的,如果是0可以省略 > > size:需要显示的个数,不是结束索引。 ## 联合查询 union > 大致意思是,多个表格合并成一个表格 需要列名的个数是一样的,他是按照查询字段的顺序直接连上去的,虽然不会报错,但是不合适。**会自动去重**,如果不去重可以使用`union all`