基于SD卡的基因(DNA)炫酷LED桌面灯
基于SD卡的基因(DNA)炫酷LED桌面灯
- 一、介绍
- 一个已知的问题
- 解决办法
- 二、支持目录
- 材料准备
- LED灯光文件(我使用的PLA颜色)
- 三、 打印部件和焊接
- 四、拼装打印的DNA散件
- 五、组合DNA螺旋结构
- 六、执行DNA文件
- 七、程序烧录
- 八、总结及成品展示
一、介绍
这款LED灯通过人类的完整基因组点亮房间。它从SD卡中缓慢读取DNA代码,并将基因碱基对显示为颜色,这些颜色沿着螺旋结构向上移动。四个碱基—A、T、G和C—分别以红色、紫色、绿色和蓝色表示。它有一个电源按钮,以及底座上的速度和亮度调节旋钮。对于螺旋结构,我尽力使比例尽可能接近实际的DNA。这是一个让人陷入沉思的有趣灯具。因为大约有三十亿个碱基对,所以需要很长时间才能完整地展示一遍。
实物图如下:

视频如下:
DNA LAMP
一个已知的问题
这款LED灯在最快速度下应该每2毫秒显示一个新的碱基对。但实际上,它的移动速度比这慢得多。最初,我将整个染色体存储在一个文本文件中。Arduino会读取该文件,然后移动到下一个染色体/文件。我注意到,随着时间的推移,它似乎变得越来越慢,确实如此。我怀疑这种减速的原因是,寻找下一个字母的代码不得不遍历所有之前的字母。当它在文件的开头时,这不会花费很长时间,但当下一个字母是几百万个字母之后时,找到它需要一秒钟。
解决办法
为了解决这个问题,我改变了方式,不再是将整个染色体存储在一个文本文件中,而是将染色体分割成许多文件(每个文件100万个字母)。不幸的是,这并没有真正解决慢速问题。接下来,我尝试重新配置,以便SD卡上一次只保存一个染色体。这样的想法是,Arduino会读取该染色体的文件,完成后,用户将SD卡上的染色体文件替换为下一个染色体的文件。这确实提高了速度。
最后,我意识到在读取完文件后让代码删除文件也是一种帮助。仍然有改进的空间。我相信我的代码可以改进,但SD卡的读取速度以及Arduino的速度也可能限制了性能。
我认为这个项目处于一个即将成为中级开发者的初学者水平。这里是指南…
二、支持目录
材料准备
- LED灯(需要2串,每串11个LED灯(总共22个))
- PLA材料 - 绿色、灰色和透明色
- 2个电位计
- 1个按钮
- 可焊接的面包板
- 导线
- 5V电源线(我使用了一根USB电缆并将其切成两半,以便我可以焊接导线到面包板上)
- Micro SD卡
- Micro SD卡读取器
- Adafruit ItsyBitsy 32u4 3V
- 3-5个M3x6mm螺栓
- 电源锁存材料
- 1个2N3904晶体管
- 1个FQP27P06 MOSFET
- 2个二极管(我相当确定这是我使用的)
- 2个100千欧姆电阻
- 1个270欧姆电阻
- 1个10千欧姆电阻
- 1个13千欧姆电阻
- 1个12千欧姆电阻
LED灯光文件(我使用的PLA颜色)
- 1个DNA Lamp Bottom.stl(绿色)
- 1个DNA Lamp Base.stl(绿色)
- 22个DNA Lamp_crossbeam short.stl(透明色)
- 2个DNA Lamp_pillar base.stl(灰色)
- 2个DNA Lamp_pillar cap2.stl(灰色)
- 20个DNA Lamp_pillar.stl(灰色)
以上.stl模型下载的文件可以私信我获取
当然除了以上材料以外你还需要准备胶水等一些常用的工具。
三、 打印部件和焊接


- 打印部件。如果我没记错的话,柱子需要支撑,接触构建板的地方需要一个边缘。
- 将Arduino、SD卡读取器、电源锁存器以及连接到面包板的导线焊接起来。照片显示了最终的样子。不要焊接输入电源线。我是基于这个制作的电源锁存器。电源锁存器是必需的,这样Arduino在关闭之前就可以将其在DNA中的位置保存到EEPROM中。
- 清理打印部件。
四、拼装打印的DNA散件


- 剪下一段包含11个LED的灯带(确保在第11和第12个LED之间的中间剪断电线,这样第11个LED上就有一段电线可以用来焊接)。
- 按照图片所示,将这些LED穿过10个柱子。每两个LED之间应该有一个柱子。
- 这串LED中的最后一个(在第一个螺旋柱的顶部)将连接到第二串的第一个LED(在那个柱子的底部),因此需要在第11个LED上焊接一条电线到数据线(白色线)。然后,这条线需要穿过所有的柱子,以便所有四根线(三个LED输入线+这个输出数据线)都从柱子底部伸出。这个输出数据线最终将被拉伸到基座的底部以连接到另一串LED,所以确保它足够长(见图片)。
- 为下一步做准备,剪下大约两打胶带来包裹柱子,以便在胶水干燥时将其固定在一起。
- 使用泡沫/膨胀大猩猩胶将所有十个柱子部件粘合在一起,确保LED从柱子之间的孔中突出,如图片所示。LED应该相对松散且自由。用胶带包裹接合处。尽量减少胶水粘在柱子外部的数量。
- 剪下另一段包含11个LED的灯带,并将它们穿过另外10个柱子。
- 用另一串柱子重复粘合过程。
五、组合DNA螺旋结构


- 将柱头帽和柱基座粘合到柱子上,确保将所有导线穿过基座部分的底部孔。对于每个“横档”,使用两个交叉梁部件,并将它们夹在一起,使得一个交叉梁部件在顶部,另一个在底部。这可能是一个紧密的配合,所以要做好心理准备。我使用透明大猩猩胶来粘合交叉梁。将一个交叉梁部件插入灯座部分的足迹中并粘合在那里。然后粘合两个柱子到基座上,确保将所有导线穿过基座的孔(如图)。然后在上面粘合另一个交叉梁,使其全部闭合在一起,第一个横档就完成了。
- 将两个交叉梁粘合到所有其他“横档”上。
- 对于接下来的步骤,面包板最终将安装在灯座部分,确保从螺旋顶部部分到面包板的导线足够长,以便顶部部分可以被移除并侧放以访问面包板(如图)。
- 将通往第一柱子起始端的LED数据线焊接到面包板上的Arduino的第5脚。
将之前从第一柱子最后一个LED末端伸出的LED数据线焊接到第二柱子的第一个LED上。 - 将电源和地线焊接到两个LED柱子上。
- 在灯座部分安装电位计和按钮,并焊接它们与面包板之间的所有连接。我使用了一些热熔胶来帮助固定电位计,以便在旋转时不会转动。我还在基座上用记号笔标记了电位计。
- 使用M3x5螺栓将面包板安装到灯座底部。确保螺栓没有短路/连接面包板上的任何线路。我使用了一小块电工胶带作为临时的“垫圈”,将螺栓头与板子隔开。
- 将电源线穿过灯座底部侧面的孔,然后将其焊接到面包板上的正确位置。
六、执行DNA文件

由于DNA文件大小为3GB,我无法将它们附加到本指南中。以下是获取它们的步骤:
- 访问网站
- 滚动到页面底部,打开染色体1的RefSeq链接。
- 按照图片指示下载为FASTA文件。
- 对其他染色体重复上述步骤。
- FASTA文件包含了标题和N等不需要的内容。
dna_processing.py脚本可以去除所有这些内容,并创建只包含ATGC的文本文件。将所有文件和dna_processing.py文件移动到一个文件夹中。 - 在
dna_processing.py中,将chromosome_number设置为1来处理第一个染色体并运行代码。 - 为每个染色体更改
chromosome_number并重新运行代码。
我一开始没有理解的一件事是:'A’总是与’T’配对,'G’总是与’C’配对。因此,FASTA/文本文件中的所有字母只是每对的一半。例如,文件中的一个’A’意味着一个AT配对,这就是在螺旋的“横档”上显示的内容。
DNA执行文件可以私信我进行获取
七、程序烧录
DNA_Lamp_Clean.ino 和 functions.ino 构成了螺旋灯的主要程序。正如我之前所说,一个已知的问题是碱基对在螺旋中的移动速度没有我想象的那么快。理想情况下(在最快速度下),它们应该每2毫秒更新一次,但实际上(在SD卡上存放所有染色体文件的情况下),我测量的速度在80-500毫秒之间(有时候可能会更慢;我的测试并不全面)。让事情变快的一个方法是一次只在SD卡上放置单个染色体的文件,但这意味着当Arduino处理完这些文件后,你将不得不将下一个染色体的文件放到SD卡上。你可以通过在代码中更改 ONE_CHROM_AT_TIME 来配置(所有文件或仅单个染色体)。
在主程序中,每个文件播放完毕后都会有庆祝模式,因此我也附加了一个仅包含庆祝模式的程序。我是用ChatGPT生成这些模式的,这相当容易也很有趣。我只需坐下来,请求模式,然后看看它们看起来有多酷。如果你想修改主程序中的模式,这段代码很有帮助。或者你可能只想全程运行模式代码。
在所有内容都上传并工作后(确保也将上一步骤中生成的DNA文件放到micro SD卡上),使用2-4个M3螺栓将灯座和底部连接在一起。你可能需要用刀子将底部的孔稍微扩大一些。确保在两部分组合在一起时,没有任何导线被夹住,以及按钮和电位计上裸露的电气连接没有触碰/短路到面包板上的任何东西。
以上所涉及到的程序可以私信我进行获取
八、总结及成品展示

按下电源按钮可以打开灯具。要关闭它,按住电源按钮直到灯光停止移动。
最后,为灯具找个地方,坐下来,享受这场灯光秀。整个人类的基因组代码正在照亮你的房间。
希望你喜欢这个项目,并在构建过程中找到乐趣!如果你有任何问题或需要帮助,欢迎在评论区交流。
作者:Svan.
注意:本博文为不得在未经本人同意进行转载或者二次创作,违者必究!!!
相关文章:
基于SD卡的基因(DNA)炫酷LED桌面灯
基于SD卡的基因(DNA)炫酷LED桌面灯 一、介绍一个已知的问题解决办法 二、支持目录材料准备LED灯光文件(我使用的PLA颜色) 三、 打印部件和焊接四、拼装打印的DNA散件五、组合DNA螺旋结构六、执行DNA文件七、程序烧录八、总结及成品…...
【算法系列-链表】设计链表
【算法系列-链表】设计链表 文章目录 【算法系列-链表】设计链表1. 算法分析🛸2. 解题过程🎬2.1 初始化2.1.1 思路分析🎯2.1.2 代码示例🌰 2.2 get(获取第n个节点的值)2.2.1 思路分析🎯2.2.2 代码示例🌰 2.…...
螺狮壳里做道场:老破机搭建的私人数据中心---Centos下Docker学习03(网络及IP规划)
3 网络及IP规划 3.1 容器连接网络初步规划 规划所有容器与虚拟机的三张网卡以macvlan的方式进行连接(以后根据应用可以更改),在docker下创建nat、wifi、nei、wai四张网卡,他们和虚拟机及宿主机上NIC的相关连接参数如下表所示&am…...
Zookeeper下载、安装配置
一、基础配置 使用zookeeper 需要提前配置安装好zookeeper的环境 端口 默认的2888端 默认的 2888端口主要用于Leader和Follower之间的通信。在ZooKeeper集群中,这个端口用于数据同步、服务器初始化以及会话管理等方面的通信。默认的3888 3888端口则是在选举L…...
【代码记录】多线程示例代码
用多线程处理多gpu模型输入的时候写的,感觉复用性会很不错,用以记录和分享 import threading def multithreadhelper(workfn,alldata:list,number:int):# workfn takes only one argument: a example of alldata# data preparationdef chunk_data(data,…...
【数据结构】什么是平衡二叉搜索树(AVL Tree)?
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌AVL树的概念 📌AVL树的操作 🎏AVL树的插入操作 ↩️右单旋 ↩️↪️右左双旋 ↪️↩️左右双旋 ↪️左单旋 🎏AVL树的删…...
ip的类型有多少种?我想做大数据需要使用哪一种
IP地址主要分为两种类型: IPv4(Internet Protocol version 4): 由32位二进制数组成,通常以四个十进制数表示(例如:192.168.1.1)。每个十进制数的范围是0到255。IPv4地址的总数量约为…...
位运算(6)_只出现一次的数字 II
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 位运算(6)_只出现一次的数字 II 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 …...
C#的Socket编程细节
目录 Socket中的Accept 步骤1:创建并绑定服务端套接字 步骤2:接受连接请求 步骤3:与客户端通信 步骤4:关闭套接字 注意事项 Socket中的Connected 使用Connected属性 客户端检查连接状态 服务端检查连接状态 注意事项 S…...
python三局两胜游戏
分为以下步骤实现这个功能 1、猜拳 2、机器产生数值 3、人去猜数字,定义剪刀石头布 4、控制机器产生,123程序运行的时候可能会出现一点玄学问题,就是,提示n1这一行不符合pep8然后报错,不用管,运行就可以&am…...
java:brew安装rabbitmq以及简单示例
什么是消息队列mq 可以看我之前写的这篇 消息队列MQ rabbitmq简介 RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在…...
基于单片机跑步机控制系统设计
** 文章目录 前言概要功能设计设计思路 软件设计效果图 程序文章目录 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对…...
【架构】efk日志监控
文章目录 一、EFK组件及其功能二、EFK日志监控的工作流程三、EFK日志监控的优势四、EFK日志监控的应用场景 推荐阅读 EFK日志监控是一种高效的日志管理解决方案,由Elasticsearch、Fluentd(或Logstash)和Kibana三个开源工具组成。以下是对EFK日…...
亚信安全发布第34期《勒索家族和勒索事件监控报告》
本周态势快速感知 本周全球共监测到勒索事件91起,近三周勒索事件数量较为稳定。从整体上看,Ransomhub是影响最严重的勒索家族;Play和ElDorado恶意家族也是两个活动频繁的恶意家族,需要注意防范。本周,土耳其公司巴克皮…...
如何在实际应用中使用回溯算法解决问题?
如何在实际应用中使用回溯算法解决问题? 回溯算法是一种强大的问题解决方法,它通过尝试不同的选择并在遇到不可行的情况时回退,以找到满足特定条件的解决方案。在实际应用中,回溯算法可以用于解决各种复杂的问题。本文将介绍如何在实际应用中使用回溯算法,并通过一些案例…...
9. 正则表达式
编程工具和技术是以一种混乱、进化的方式生存和传播的。获胜的并不总是最好或最杰出的工具,而是那些在合适的利基市场中发挥足够好的功能,或者恰好与另一项成功的技术相结合的工具。 在本章中,我将讨论这样一种工具--正则表达式。正则表达式是…...
初始C++模板
1.泛型编程 1.1什么事泛型编程 在学习C语言时,我们时常会有这样的烦恼: 在针对每一种不同的类型变量进行函数传参或者是运算处理时,我们总是编写不同的函数或者是进行不同的处理,才能达到目的,这时,我们…...
建投数据自主研发相关系统获得欧拉操作系统及华为鲲鹏技术认证书
近日,经欧拉生态创新中心和华为技术有限公司测评,建投数据自主研发的投资项目管理系统、全面风险管理信息系统、商业不动产业务系统,完成了基于欧拉操作系统openEuler 22.03、华为鲲鹏Kunpeng 920(Taisha 200)的兼容性…...
node启动websocket保持后台一直运行
在 Node.js 中启动一个 WebSocket 服务器并使其在后台持续运行,你可以使用几种方法。下面是一种常见的方法,通过创建一个简单的 WebSocket 服务器并使用 node 命令直接运行它,同时确保它在后台运行。 1. 创建 WebSocket 服务器 首先&#x…...
CSS画出三角形的做法
引言: 在网页中,会有三角形的出现,我们脑海里会有很多想法,如何去实现他们,我来提供一种比较好玩的做法。 方法: 我们实现一个三角形,当然可以使用精灵图、或者iconfont的做法,这…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...
