这个小钟已经做好并运行了有1个月了,这也是我第一次用esp8266和arduino ide做的练手项目。目前连续工作测试稳定正常,并且它一直都是以当初拼装出来的姿态在工作,如图:
赛博朋克2020.jpg
这个小钟会在开机和每24小时后连接到windows的ntp服务器对时,mic检测到一定响度的声音后亮起屏幕,安静时10秒后关闭屏幕。本来我想用以前买的一个传感器包里的红外检测模块在检测到人的时候就亮屏的,但是它好像坏了,就用了声控方案。
这个小钟已经做好并运行了有1个月了,这也是我第一次用esp8266和arduino ide做的练手项目。目前连续工作测试稳定正常,并且它一直都是以当初拼装出来的姿态在工作,如图:
赛博朋克2020.jpg
这个小钟会在开机和每24小时后连接到windows的ntp服务器对时,mic检测到一定响度的声音后亮起屏幕,安静时10秒后关闭屏幕。本来我想用以前买的一个传感器包里的红外检测模块在检测到人的时候就亮屏的,但是它好像坏了,就用了声控方案。
在Arduino中使用digitalWrite来设置引脚的高低电平其实并不只是做了改变引脚寄存器数据这一件事,所以它的效率并不高,在需要高频输出的场景下就会出现瓶颈。
最近我在写大型LED矩阵屏驱动板的时候就遇到了这样的情况,一轮loop的速度太慢以至于watch dog以为程序死循环了而导致重启。后来我查来查去发现可以通过直接改变寄存器的数据来改变引脚的输出电平,而且官方头文件里其实也有对应的宏可以进行相关操作,但我怎么试都没成功,最后在一个官方demo里发现了一个函数,效率也同样不错,所以抄出来记录一下
1 2 3 4 5 6 7 8 9 |
void ICACHE_RAM_ATTR __digitalWrite(uint8_t pin, uint8_t val) { if(pin < 16){ if(val) GPOS = (1 << pin); else GPOC = (1 << pin); } else if(pin == 16){ if(val) GP16O |= 1; else GP16O &= ~1; } } |
只要调用 __digitalWrite(gpio引脚,0或1) 就可以了。
==========更新===========
把这个函数写成宏可以更进一步提高效率
1 2 3 4 5 6 7 8 9 |
//pin最好为常数,以便编译器优化掉判断 #define __digitalWrite(pin,val)\ if(pin < 16){\ if(val) GPOS = (1 << pin);\ else GPOC = (1 << pin);\ } else if(pin == 16){\ if(val) GP16O |= 1;\ else GP16O &= ~1;\ } |
新版bilibili右键菜单去掉了原本的实用功能视频变速,加上了不常用的功能,音效设定也不知道是不是从ac抄来的。
现在没有右键变速后每次变速鼠标都要移动到播放器右下角的倍速上等待设定条出来再点击,而且底部控制栏有时候是会隐藏的,远没有视频上随处可点的右键菜单快捷,所以写了个油猴脚本又加回了这个功能,从0.5倍开始以0.25倍递增到2倍。
有Tampermonkey插件的可以直接点击上面的链接安装,没有的先安装插件。
本文演示的代码均在这里,本文仅说明原理,不会细化到webgl基础。
最近学会了用WebGL2画球,其实学会也有两个多月了,但由于某些误解一直没法生成正确的贴图映射,导致贴图错乱,直到两周前才突然开窍发现了原因,又拖到今天才来发这么一篇文章。忙里偷闲做事就是效率低下,好在并没有什么迫切需求要做,慢慢学也无所谓。
要用WebGL画球主要就是要先建个球模,然后给它上色或者贴图。要贴图就要搞清楚每个顶点和贴图的坐标映射关系,不同的球模类型映射关系也不一样,我这画的是最容易理解的经纬球,即以地球仪那种经纬线为线框的球体。
接下来开始我们的正题。
先摆一个随便找的经纬球
现在假装看不见经线(竖线),只能看见纬线(横线),那么这个球外面每隔一定的角度就绕着一个正圆,我们生成模型也可以用这种逻辑,首先生成一个正圆,然后把它按角度调整好大小并放到正确的位置上。关于生成一个合适边数的圆的方法我在前一篇文章已经写过了,这里就不再赘述了。
在屏幕上绘制圆的时候实际上就是在画一个正多边形,只是边非常多而已。
这篇文章来水一个画多少边合适的问题。(注:我并不是不知道canvas2d有圆弧绘制函数,这是为下一篇文章准备的内容)
要一个圆的边看起来平滑,就需要边数足够多,直到在屏幕上看不出它有棱角就够了,这里摆一幅图。
原本我的电脑是两根8G阿斯加特内存插在两个通道各一个槽上组的双通道,最近发现有的时候不够用了,所以又买了一条16G的内存。
之所以这点破事也要写一篇文章,是因为这个过程里我一边调试一边蓝屏了十几次,觉得有必要记录一下。
这是原本的插法
现在是这个插法
两个通道上各凑满16G组成双通道32G
前两周我偶然在放歌的时候拔掉了耳机,从耳机切换到音箱的时候发现这个音箱(前面做了自动开关的那个)音质不对头,于是产生了买个新音箱的念头。
前几天刷淘宝的时候偶尔看到了YAS-107这个回音壁,感觉价格还能接受,于是买下了。
首先这个错误是Browserify报出来的,看着网上一篇篇给babel加preset的解决方案让我一度以为这是babel出问题了。
但我按照那些方案依然不能解决这个问题,比如加stage-0,还有加es2015的preset之类的,另外现在这些preset已经被弃用了,官方推荐用preset-env来代替。而我手动加了commonjs的plugin也一样报错。
一番研究之后发现我其他所有es模块被引用都能正常打包,唯独node_module里面的一个模块的es6模块不能加载,看来Browserify是默认不允许node_module里的模块以es6格式输出模块的。所以解决方案是要么把文件从node_module里移出来,要么想办法让Browserify允许node_module以es6输出模块,我最后用的是前者,因为那个sourceType:module我怎么设置也依然没有效果。
有时候本地开发的时候会使用 php -S 命令启动一个服务器来调试,由于该web服务器模式直接echo会把内容输出到页面上,所以需要想办法把内容输出到控制台界面。
php里有几个 php:// 开头的特殊读写流可以使用,文档见此:https://www.php.net/manual/en/wrappers.php.php
虽然该页面上说有常量 STDIN 、 STDOUT 和 STDERR ,但是不知道为啥使用它们会报错不存在常量,所以我们可以自己定义:
1 2 3 |
define('STDOUT',fopen('php://stdout', 'a')); define('STDERR',fopen('php://stderr', 'a')); define('STDIN',fopen('php://stdin', 'r')); |
然后就可以定义自己的输出函数来输出到控制台了
1 2 3 4 5 6 7 8 |
function stdout($c){ fwrite(STDOUT, $c); } function stdoutl($c){ stdout($c.PHP_EOL); } stdoutl("poi");//输出到控制台,并换一行 |
我也不清楚这个问题是否具有普遍性,因为我这的具体情况是Pixel XL在Android 10下使用默认启动器,在用快图浏览内置的壁纸编辑器更改了几张壁纸后出现了这这样的情况。这次是我第二次碰到这个问题,而且每次都是被快图浏览搞出来的。上次我直接重刷系统了事了,但这次不想再花那么多时间来重新设置各种app所以尝试了一下解决问题,为了出现同样情况的人好找,也就把标题写得广一点了。 继续阅读Android设置壁纸后主屏幕死循环重启
2020年初占位,暂时没啥特别想说的。
最近在公司里事情超多,几乎就是自己在布置新办公大厅的网络和监控,好在期限又缓下来了,今天元旦不用去加班了。
手机被路边龟孙黄牛拍地上,然后镜头盖碎了,买了个回来换换,过程挺简单
这手机用了好多年了,现在pixel都出到第四代了我这第一代还在服役。
为了防止拆坏还特意查了很多拆解文章,结果基本上都是ifixit的转载文章,而且这篇文章只表达了一点:不要自己拆,屏幕肯定会坏。
但我这电池一天5冲实在吃不消了,必须得换,于是买了个电池来自己换。
不出所料屏幕爆了。
这个屏幕上oled部分直接贴在外屏上,所以只要拆的时候掰歪外屏到一定程度,内屏一定会爆。
这里放一张后来新买的屏幕总成背面图:
没有固定支架,相当脆弱。
不过这屏幕早就烧屏了,我反正也不心疼,就连电池带屏幕一起换了吧。
我总结一下不一定有用的拆解建议:先从底部翘起一点之后用细线切割之后的胶,绝对不能指望撬起整块屏幕。