【雕爷学编程】Arduino动手做(72)---HX711 人体称重模块

2023-11-13

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

【Arduino】168种传感器模块系列实验(资料代码+图形编程+仿真编程)

实验七十二:人体秤50kg称重传感器模块(电阻应变半桥式)

在这里插入图片描述

在这里插入图片描述
应变片
是由敏感栅等构成用于测量应变的元件。电阻应变片的工作原理是基于应变效应制作的,即导体或半导体材料在外界力的作用下产生机械变形时,其电阻值相应的发生变化,这种现象称为“应变效应”。

在这里插入图片描述
为了系列实验和了解应变片,我特意去网上买了一片,就是其体积挺惊人,在包装盒里面好不容易才找到
在这里插入图片描述
应变效应
金属导体的电阻值,随着它受力所产生机械变形(拉伸或压缩)的大小而发生变化的现象,称之为金属的电阻应变效应。电阻值将发生变化这种现象称为“应变效应”。根据应变效应将应变片粘贴于被测材料上被测材料受到外界作用产生的应变就会传送到应变片上使应变片的电阻值发生变化通过测量应变片电阻值的变化就可得知被测机械量的大小。

应变效应应用范围十分广泛,可测量应变、应力、力矩、位移、加速度、扭矩等物理参量。电阻式应变片应用模式有两种,一是将应变片粘贴于弹性刚体上组成平衡电桥,然后接到转换电路,构成专用应变传感器;二是将应变片粘贴于被测物体上,然后接到专用应变仪直接读取应变量。

在这里插入图片描述
电阻应变片
电阻应变片的工作原理是基于应变效应制作的,即导体或半导体材料在外界力的作用下产生机械变形时,其电阻值相应的发生变化,这种现象称为“应变效应”。半导体应变片是用半导体材料制成的,其工作原理是基于半导体材料的压阻效应。压阻效应是指当半导体材料某一轴向受外力作用时,其电阻率发生变化的现象。应变片是由敏感栅等构成用于测量应变的元件,使用时将其牢固地粘贴在构件的测点上,构件受力后由于测点发生应变,敏感栅也随之变形而使其电阻发生变化,再由专用仪器测得其电阻变化大小,并转换为测点的应变值。金属电阻应变片品种繁多,形式多样,常见的有丝式电阻应变片和箔式电阻 应变片。箔式电阻应变片是一种基于应变——电阻效应制成的,用金属箔作为敏感栅的,能把被测试件的应变量转换成电阻变化量的敏感元件。

在这里插入图片描述
称重传感器工作原理
称重传感器是用来将重量信号或压力信号转换成电量信号的转换装置。称重传感器采用金属电阻应变片组成测量桥路,利用金属电阻丝在张力作用下伸长变细,电阻增加的原理,即金属电阻随所受应变而变化的效应而制成的。金属电阻具有阻碍电流流动的性质,同一种金属丝,一般来讲,越是细长,其电阻值就越大。当金属电阻丝受外力作用而伸缩时,其电阻值就会在某一范围内增减。因此,将金属丝(或膜)紧贴在被测物体上,当被测物体受外力而伸缩时,金属电阻丝(膜)也会按比例伸缩,其阻值也会相应变化。称重传感器就是将金属电阻应变片粘贴在金属称重梁上进行测量重量信号的。

在这里插入图片描述
桥式测量电路
电阻应变式称重传感器包括两个主要部分,一个是弹性敏感元件:利用它将被测的重量转换为弹性体的应变值;另一个是电阻应变计:它作为传感元件将弹性体电阻应变式称重传感器。 当传感器不受载荷时,弹性敏感元件不产生应变,粘贴在其上的应变片不发生变形,阻值不变,电桥平衡,输出电压为零;当传感器受力时,即弹性敏感元件受载荷P时,应变片就会发生形变,阻值发生变化,电桥失去平衡,有输出电压。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
内部为1000欧半桥应变片,量程为50kg称重传感器,半桥结构。
测量时,外侧边正确施加外力,E字形传感器的应变梁部分(即中间贴应变片的,有白色覆胶的梁臂)和外侧边要形成一个方向相反的剪切力,即中间的应变梁在受力下必需可以发生弯曲变化,应变梁受力面另一侧不可有阻挡物。
在这里插入图片描述
传感器内部是一组半桥应变片,使用方法可以有以下三种:
1、使用一只传感器配合外接电阻组成全桥测量,量程为一个传感器的量程:50kg。对外接电阻要求较高。
2、使用二只传感器组成全桥测量,量程为两只传感器的量程之和:50kgx2=100kg。
3、使用四只传感器组成全桥测量,量程为四只传感器的量程之和:50kgx4=200k。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
HX711 24位精度AD称重模块
在这里插入图片描述
HX711
是一款专为高精度电子秤而设计的24位A/D转换器芯片。与同类型其它芯片相比,该芯片集成了包括稳压电源、片内时钟振荡器等其它同类型芯片所需要的外围电路,具有集成度高、响应速度快、抗干扰性强等优点。降低了电子秤的整机成本,提高了整机的性能和可靠性。该芯片与后端MCU 芯片的接口和编程非常简单,所有控制信号由管脚驱动,无需对芯片内部的寄存器编程。输入选择开关可任意选取通道A 或通道B,与其内部的低噪声可编程放大器相连。通道A 的可编程增益为128 或64,对应的满额度差分输入信号幅值分别为±20mV或±40mV。通道B 则为固定的32 增益,用于系统参数检测。芯片内提供的稳压电源可以直接向外部传感器和芯片内的A/D 转换器提供电源,系统板上无需另外的模拟电源。芯片内的时钟振荡器不需要任何外接器件。上电自动复位功能简化了开机的初始化过程。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
主要参数
满额度差分输入范围 V(inp)-V(inn) ±0.5(AVDD/GAIN) V
输入共模电压范围 AGND+0.6 AVDD-0.6 V
使用片内振荡器,RATE = 0 10
使用片内振荡器,RATE = DVDD 80
外部时钟或晶振,RATE = 0 fclk/1,105,920
输出数据速率
外部时钟或晶振,RATE = DVDD fclk/138,240 Hz
输出数据编码 二进制补码 800000 7FFFFF(HEX) RATE = 0 400
输出参考电压(VBG) 1.25 V
外部时钟或晶振频率 1 11.0592 30 MHz
模拟电源电流(含稳压电路) 1600μA 断电 0.3 μA
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
模块采用24位高精度的A/D转换器芯片hx711,是一款专为高精度电子称而设计的, 具有两路模拟通道输入, 内部集成128倍增益可编程放大器。输入电路可配置为 提供桥压的电桥式(如压力、称重)传感器模式 是一款理想的高精度低成本采样前端模块。采样hx711 24位ad芯片,双通道 差分输入。全贴片 机器焊接,带金属屏蔽,配送直、弯两种插针,满足各种安装焊接方式,板上使用了2个47uF的胆电容,用料很足,内置上拉电阻,且预留CPU焊接位置,很适合自己二次开发各种各样的传感器相关应用。
在这里插入图片描述
模块电原理图
在这里插入图片描述
模块主要特点
● 带金属屏蔽,强抗干扰,预留cpu(STC15F104)位置,可自行升级二次开发。
● 两路可选择差分输入
● 片内低噪声可编程放大器,可选增益为32、64 和128
● 片内稳压电路可直接向外部传感器和芯片内A/D 转换器提供电源
● 片内时钟振荡器无需任何外接器件,必要时也可使用外接晶振或时钟
● 上电自动复位电路
● 简单的数字控制和串口通讯:所有控制由管脚输入,芯片内寄存器无需编程
● 可选择10Hz 或80Hz 的输出数据速率
● 同步抑制50Hz 和60Hz 的电源干扰
● 耗电量(含稳压电源电路):
典型工作电流:< 1.7mA, 断电电流:< 1μA
● 工作电压范围:2.6 ~ 5.5V
● 工作温度范围:-20 ~ +85℃

在这里插入图片描述
模块检测方法
1,初步快速判断:断开模块所有连线,仅仅给模块供电5v(就是vcc接+5v,gnd接地),然后把模块的ck端口对地短接,然后再去测 out+对地电压,应该4.5v左右,接着测DO/RX端口对地电压,应该0v左右,如果电压都符合,说明模块99%正常。
2,完整测试判断:使用测试电路图搭个电路,给单片机烧入测试程序,然后用串口线连接电脑,在电脑上运行串口助手,就可以接收到测试电路发出来的读数报告,读数正常,表明模块正常。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实验准备接线时,才发现收来的四个称重传感器中,有一个只有二根线(其它3个都是3根接线),看来要搞不定了
在这里插入图片描述
HX711.h头文件

#ifndef HX711_h

#define HX711_h

#include "Arduino.h"

class Hx711

{

private:

    int DOUT;//定义数据引脚

    int SCK;//定义时钟引脚

    float scale;//定义比例系数

    long offset;//定义补偿值

public:

    Hx711(int IO_DOUT,int IO_SCK);//构造函数

    void setScale(float IO_scale);//设置比例系数

    void setOffset(long IO_offset);//设置补偿值

    long getValue();//采集一次ADC值

    long getAverageValue(char IO_times);//采集ADC平均值

    float getWeight(char IO_times);//得出重量值

};

#endif

HX711.cpp 文件

#include "HX711.h"

#include "Arduino.h"

//int DOUT;//定义数据引脚

//int SCK;//定义时钟引脚

//float scale;//定义比例系数

//long offset;//定义补偿值

//int times;//定义采集次数

Hx711::Hx711(int IO_DOUT,int IO_SCK)//构造函数

{

    DOUT = IO_DOUT;

    SCK = IO_SCK;

    pinMode(SCK, OUTPUT);//设置IO口工作方式

    pinMode(DOUT, INPUT);

}

void Hx711::setScale(float IO_scale)//设置比例系数

{

    scale = IO_scale;

}

void Hx711::setOffset(long IO_offset)//设置补偿值

{

    offset = IO_offset;

}

long Hx711::getValue()//采集一次ADC值

{

    unsigned long Count;

    unsigned char i;

    digitalWrite(SCK,LOW);

    Count = 0;

    while(digitalRead(DOUT) == 1);//低电平时数据可以输出

    for(i=0;i<24;i++)//循环读取数据

    {

        digitalWrite(SCK,HIGH);

        Count = Count<<1;

        digitalWrite(SCK,LOW);

        if(digitalRead(DOUT) == 1) Count++;//最低位置1

    }

    digitalWrite(SCK,HIGH);

    Count = Count^0x800000;//最高位置0

    digitalWrite(SCK,LOW);//128增益

    return Count;

}

long Hx711::getAverageValue(char IO_times)//采集ADC平均值

{

    long sum=0;

    char i;

    for(i=0;i<IO_times;i++)

    {

        sum += getValue();

    }

    return sum/IO_times;

}

float Hx711::getWeight(char IO_times)//得出重量值

{

    long temp;

    temp = getAverageValue(IO_times) - offset;

    return (float)temp/scale;

}

实验没有通过,一直卡在HX711库上,编译无法通过…

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

/*

 【Arduino】66种传感器模块系列实验(73)

 实验七十三:人体秤50kg称重传感器模块(电阻应变半桥式)

 */

 

 #include <HX711.h> 

 

 HX711 hx(9, 10); 

 

 void setup() { 

 Serial.begin(9600); 

 } 

 

 void loop() 

 { 

 double sum = 0; 

 for (int i = 0; i < 10; i++) 

 sum += hx.read(); 

 Serial.println(sum/10); 

 delay(3000);

 }


在这里插入图片描述
实验开源图形编程(Mind+、编玩边学)
在这里插入图片描述
实验开源仿真编程(linkboy V4.1)
在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【雕爷学编程】Arduino动手做(72)---HX711 人体称重模块 的相关文章

  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • Fedora 中的 Arduino 上传错误“stk500_recv(): 程序员没有响应”

    我正在尝试上传库存Blink在 Fedora Core 15 Linux 中使用 Arduino IDE 绘制草图 我收到此错误 avrdude stk500 recv 程序员没有响应 要重现该问题 通过 USB 线插入 Arduino U
  • printf 的包装

    我在Arduino下编码 我想开发串行打印格式化功能 所以我尝试使用sprintf未知大小的缓冲区 基本上 我们可以避免谈论 Arduino 及其串行输出 并考虑将文本写入缓冲区 然后使用printf 我试过这个 include
  • 读取串行端口 - 忽略在一定时间内写入串行端口的部分数据

    我想定期读取串行端口上的数据和Arduino 所以本质上是这样的 读一读 Wait 读一读 Wait Take etc 我面临的问题是端口将缓冲其信息 因此一旦我调用等待函数 串行端口上的数据就会开始缓冲 等待函数完成后 我尝试再次读取数据
  • Android 和 Arduino 都通过蓝牙接收奇怪的值

    我正在 Android 端使用 BluetoothChat 代码使用聊天框向 Arduino UNO 发送开 关信号 我发送 110 119 或下面定义的其他情况 但是当我显示接收到的值时 它显示奇怪的Arduino 串行监视器中的值 即
  • Arduino:使用串口和软件串口与蓝牙模块

    我的目的是使用 Arduino 通过 HC 05 蓝牙模块在 PC 和 Android 设备之间建立通信 我使用 PC 和 Arduino 串行监视器 之间的 USB 通信以及 SoftwareSerial 来连接到 HC 05 我的问题是
  • Java RXTX 库不加载本机库

    基本上我想使用 Arduino 编写一个简单的通信工具java 的 RXTX 库 http rxtx qbang org wiki index php Main Page并且在加载动态库时严重失败 我的系统规格 操作系统 OS X 优胜美地
  • Android BLE 扫描与 UUID 过滤器列表混淆

    我正在 Android 移动设备 A 上执行 UUID 过滤扫描 并且有两个测试用例 一个人在另一台 Android 设备 移动设备 b 上使用名为 BLE Scanner 的应用程序来创建具有两个测试服务 每个服务都有自己唯一的 UUID
  • Python自动选择串口(适用于Arduino)

    目前 Python 程序必须知道设备 Arduino 位于哪个端口 然后 Python 才能与设备进行通信 Problem 每当设备拔出并重新插入时 其 COM 端口都会发生变化 因此必须再次向 Python 提供正确的串行端口 以便它找到
  • 在Python中快速绘制数据

    我正在尝试使用 arduino 绘制来自 mpu6050 imu 的数据 MPU6050 发送数据的速度比绘图快 Arduino 代码从串口提供 6 个数据 即偏航 俯仰 滚动 轴 ay 和 az 我需要快速情节的建议 Python代码 i
  • Arduino 的 C++ 类文件中的字符串无法编译

    我正在用 C 为 Arduino 编写一个堆栈类sketch http www arduino cc en Tutorial Sketch 我相信它完全符合AVR 如果这就是它的名字 我记不清了 编译器 我都用过malloc and fre
  • pySerial 与 python 2.7 和 3.4 的差异

    我正在开发一个项目 需要通过串口将一些数字从 Windows 10 中的 python 发送到 arduino uno 作为一个简单的测试 我只想通过发送 2 来打开 LED 并通过从命令提示符发送 4 来关闭 LED 尽管我希望最终能够将
  • Arduino C++ 析构函数?

    我知道在Arduino中你不能使用delete 那么什么时候调用 C 类中定义的析构函数呢 同样 如果我想创建一个指向数组的指针 我必须使用malloc and free 当对象被销毁时 析构函数被调用 对于自动 堆栈上 变量 它在离开其作
  • 在链接时合并全局数组/从多个编译单元填充全局数组

    我想定义一系列的东西 比如事件处理程序 的内容 该数组在编译时是完全已知的 但定义在 多个编译单元 分布在多个库中 至少在最终 静态 链接之前是相当解耦的 我想要 也保持这种方式 因此添加或删除编译单元将 还可以自动管理事件处理程序 而无需
  • 如何在 Arduino 中将 char 变量作为数字打印到串行端口?

    我正在使用 Arduino Uno 我正在从 EEPROM 读取一个字节值并将该值存储在类型变量中char 1 字节 我想将变量的值作为数字 而不是相应的 ASCII 代码 打印到串行监视器 例如考虑char val 5 我想查看串行监视器
  • 如何使用基于HM-10蓝牙模块的BLE Shield?

    我是 arduino 项目的新手 我想请你帮忙 我从 http imall iteadstudio com development platform arduino shields im130704001 html http imall i
  • ESP32:dsb1820 温度传感器给出恒定的负 127 读数

    我正在尝试使用连接到 esp32 微控制器的单个 dsb1820 温度传感器来获取温度读数 传感器连接到 esp32 的 GPIO 4 我打算将温度读数发送到云端 我面临的问题是温度读数总是给出值 127 我在网上某处读到 当 dsb182
  • 仅从日期计算夏令时

    我正在使用 Arduino 和实时时钟芯片 该芯片补偿了闰年等 因此它始终具有正确的日期 但我认为由于区域复杂性 它不处理夏令时 时钟可以给出日 月 年 从 1 开始 以及星期几 星期日 0 到星期六 6 因为我需要与用户输入的日期和时间进
  • 类中的易失性变量:“‘易失性’之前预期有非限定 ID”?

    我有两个static volatile我的类中定义的变量ADC 该类写为 裁剪以节省空间 pragma once include PeriodicProcess PeriodicProcess h include
  • Arduino 引导加载程序

    有人可以解释一下如何Arduino引导加载程序 http code google com p arduino source browse tags 0019 hardware arduino bootloaders atmega ATmeg

随机推荐

  • pip安装pytorch 清华镜像

    每次要搭配环境的时候就头大 资源基本是国外 下载起来特别慢 有些连服务器都访问不了 不用镜像 按照书上或者网上的正常流程搭配环境 基本上都是以超时告终 然后就在网上疯狂找资源 网上有人说是个程序员都会翻墙 我可能是个假的程序员吧 什么都不会
  • Arthas watch命令使用

    目录 属性遍历深度 1 watch 类全限定名 方法名 遍历深度为1的入参 对象 返回信息 2 watch 类全限定名 方法名 x n 观察遍历深度为n的入参 对象 返回信息 观察事件点 1 watch 类全限定名 方法名 params x
  • Python爬虫从入门到精通:(39)增量式爬虫_Python涛哥

    概念 检测网络数据更新的情况 以便于爬取到最新更新出来的数据 实现核心 去重 实战中去重的方式 记录表 记录表需要记录什么 记录的一定是爬取过的相关信息 例如某电影网 爬取过的相关信息 每一部电影详情页的url 只需要使用某一组数据 该组数
  • 一个产品的商业目标应该从哪些方面制定?

    产品面向社区治理相关服务 比如信息发布 事件调解 活动发布 数据统计等等 但感觉缺少合理的商业策略和商务模式 文心一言 一个产品的商业目标应该从以下几个方面制定 市场定位 确定你的产品的目标客户是谁 这可以是你的社区治理服务所面向的人群 也
  • 【数学公式】Mathpix和MathType等等

    MathML MathML指 数学标记语言 是XML语言的一个子集 用来在web网页 甚至部分软件中显示数学公式 简言之 就是使用特殊的类似HTML的标记在网页中显示数学公式 MathType公式编辑器 MathType是一个强大的数学公式
  • JSP的原理

    Tomcat的lib目录下的jasper jar包 这个包里面有一个HttpJspBase类 这个类我们看一下源码 Source code recreated from a class file by IntelliJ IDEA power
  • CC++ 标头和源文件:它们如何工作?

    本文将向您展示将程序划分为C中的组件部分或正确使用标头和源文件C 诀窍 介绍 我主要是为我的一个朋友写这篇文章的 但是 如果我不与大家分享这一点 我会对社区造成伤害 所以就在这里 我们将探索标头和源文件以及它们的作用 这些代码的大部分在 C
  • SSH框架简介篇

    文章目录 概述 目录结构 struts Spring Hibernate 总结 概述 SSH框架 Struts Spring Hibernate 是一种广泛应用的Java企业级开发框架组合 它将Struts Spring和Hibernate
  • LVM原理及配置

    1 简介 1 1 什么是LVM LVM是 Logical Volume Manager 逻辑卷管理 的简写 它由Heinz Mauelshagen在Linux 2 4内核上实现 目前最新版本为 稳定版1 0 5 开发版 1 1 0 rc2
  • 中国天气网接口

    中国天气weather com http m weather com cn data 101110101 html 六天预报 http www weather com cn data sk 101110101 html 实时天气信息 其中1
  • RSA pkcs1与pkcs8 java获取私钥

    RSA pkcs1与pkcs8 java获取私钥 目录 RSA pkcs1与pkcs8 java获取私钥 获取秘钥 获取pkcs1 格式秘钥 获取pkcs8格式秘钥 读取秘钥信息 解密 获取秘钥 maven依赖
  • 【网络】几种常见的协议

    几种常见的协议 DNS Domain Name System 域名解析协议 端口号 53 通过域名解析获得域名所对应的IP FTP File Transfer Protocol 文件传输协议 端口号 21 用户可通过客户机程序向远程主机上传
  • el-input正则限制

    el input限制只能输入1 9且只保留一位小数 return rules deductionPrice required true message 请输入折扣力度 trigger blur validator this valuePri
  • 栈溢出学习

    前言 跟着ctfwiki学习 所有题目都在ctfwiki上可以找到 加油加油 栈溢出原理 栈溢出指的是程序向栈中某个变量中写入的字节数超过了这个变量本身所申请的字节数 因而导致与其相邻的栈中的变量的值被改变 看一个简单的程序 include
  • 【枚举的定义;枚举变量的定义、初始化和赋值】(学习笔记16--枚举)

    目录 枚举的定义 枚举变量的定义 枚举变量的初始化与赋值 使用枚举类型 可以提高程序代码的健壮性和可读性 并且枚举成员属于常量 甚至可以使用枚举成员名作为维的大小 来进行数组的定义 枚举的定义 定义枚举的格式为 enum 枚举名 枚举成员1
  • Muduo网络库核心梳理

    Muduo网络库 Muduo网络库本身并不复杂 是一个新手入门C 面向对象网络编程的经典实战项目 但是 新手在刚刚上手读代码的时候 非常容易陷入代码的汪洋大海 迷失方向 本文旨在简要梳理Muduo网络库的核心内容 帮助初学者快速上手源码阅读
  • DES算法简单介绍及用法

    大家好 今天给大家分享一下DES加密 一 DES介绍 加密一般分为可逆加密和不可逆加密 其中可逆加密一般又分为对称加密和非对称加密 前者是我们使用公用密钥加密之后可以使用公用密钥再解密出来 而后者则是使用公用密钥加密之后必须使用私用密钥来解
  • MySQL这一章就够了(一)

    前言 呕心沥血5个月淦出本文 整理所有MySQL知识 我愿称之为地表最强MySQL MySql笔记 MySQL是关系型数据库 基于SQL查询的开源跨平台数据库管理系统 它最初是由瑞典MySQL AB公司开发的 现在它是Oracle Corp
  • 手把手教你区块链java开发智能合约nft(第四篇)-如何动态获取gasPrice和gasLimit?

    手把手教你区块链java开发智能合约nft 第三篇 如何动态获取gasPrice和gasLimit 初学区块链 那真叫一个痛苦并无助 如果没有人带你的话 今天写的这篇是在前面文章基础上写的 初学区块链的朋友建议先看我前面写的文章 手把手教你
  • 【雕爷学编程】Arduino动手做(72)---HX711 人体称重模块

    37款传感器与执行器的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止这37种的 鉴于本人手头积累了一些传感器和执行器模块 依照实践出真知 一定要动手做 的理念 以学习和交流为目的 这里准备逐一动手尝试系列实验 不管