tag 标签: 创客传感器

相关博文
  • 热度 1
    2022-5-27 12:15
    256 次阅读|
    0 个评论
    【昊泽爷爷】Arduino动手做(101)---12位智能RGB彩环
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百零一:12位 WS2812 5050 RGB LED 智能全彩RGB环开发板大环 WS2812B 280μs,中断时不会造成误复位,支持较低频率,价格低廉单片机。刷新频率更新到2kHz,画面频率低,高清摄像机无闪烁,提高出色的展示效果。LED具有驱动电压低、环保节能、亮度高、散射角大、一致性好、功率低、寿命长等优点。集成在led上的控制芯片越来越多电路简单,体积小,安装方便。 主要特点 控制电路和LED共用唯一的电源。 控制电路和RGB芯片集成在5050个组件的封装中,形成完整的可寻址像素。内置信号整形电路,对下一个驱动器进行波形整形后,确保波形不失真累积。 内置电气复位电路和失电复位电路。 三基色各像素可实现256亮度显示,完成16777216色全彩色显示,扫描频率为2kHz。 单线路级联端口传输信号。 任意两点距离不超过3米的传输信号,无任何增加电路。 刷新率为30fps时,层叠数不小于1024像素。以800Kbps的速度发送数据。 灯光颜色一致性高,性价比高。 应用 全彩模块,全彩软灯带。 LED装饰照明,室内外LED视频不规则屏幕。 名称:12位WS2812智能全彩圆盘LED模块 整体尺寸:直径7cm 芯片:WS2812B(内置于LED) LED:5050封装RGB全彩高亮 电压:5V 端口:数字 平台:单片机(Arduino 、51单片机等) 控制方式:内置控制芯片,只需一个IO口即可控制 (1) Arduino 参考开源代码 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百零一:12位 WS2812 5050 RGB LED 智能全彩RGB环开发板大环 1、安装库:IDE-工具-管理库-搜索Adafruit_NeoPixel-安装 2、项目:点亮环形LED模块,循环快闪绿色光 3、接脚: VCC → 5V GND → GND DI 接 D7 */ #include #define PIN 7 #define MAX_LED 12 #define ADD true #define SUB false int val = 0; boolean stat = ADD; Adafruit_NeoPixel strip = Adafruit_NeoPixel( MAX_LED, PIN, NEO_RGB + NEO_KHZ800 ); void setup(){ strip.begin(); strip.show(); } void loop(){ uint8_t i,a=0; uint32_t color = strip.Color(255, 100, 0); while(a<17) { for(i=0;i<16;i++) { if(i==a) strip.setPixelColor(i, color); else strip.setPixelColor(i, 0); } strip.show(); delay(20); a++; } } 实验场景图 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百零一:12位 WS2812 5050 RGB LED 智能全彩RGB环开发板大环 1、安装库:IDE-工具-管理库-搜索Adafruit_NeoPixel-安装 2、项目:灯环显示彩色 3、接脚: VCC → 5V GND → GND DI 接 D7 */ #include #ifdef __AVR__ #include #endif #define PIN 7 // Parameter 1 = number of pixels in strip // Parameter 2 = Arduino pin number (most are valid) // Parameter 3 = pixel type flags, add together as needed: // NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs) // NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers) // NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products) // NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2) // NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products) Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, PIN, NEO_GRB + NEO_KHZ800); // IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across // pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input // and minimize distance between Arduino and first pixel. Avoid connecting // on a live circuit...if you must, connect GND first. void setup() { // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket #if defined (__AVR_ATtiny85__) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif // End of trinket special code strip.begin(); strip.show(); // Initialize all pixels to 'off' } void loop() { // Some example procedures showing how to display to the pixels: //colorWipe(strip.Color(255, 0, 0), 50); // Red // colorWipe(strip.Color(0, 255, 0), 50); // Green //colorWipe(strip.Color(0, 0, 255), 50); // Blue //colorWipe(strip.Color(0, 0, 0, 255), 50); // White RGBW // Send a theater pixel chase in... // theaterChase(strip.Color(127, 127, 127), 50); // White //theaterChase(strip.Color(127, 0, 0), 50); // Red //theaterChase(strip.Color(0, 0, 127), 50); // Blue rainbow(20); //rainbowCycle(20); //theaterChaseRainbow(50); } // Fill the dots one after the other with a color void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i
  • 热度 4
    2022-2-23 10:49
    865 次阅读|
    0 个评论
    【雕爷学编程】Arduino动手做(100)---MAX30102手腕心率
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百: MAX30102血氧仪手腕心率脉搏检测心跳传感器模块 MAX30102 是一种综合性脉搏血氧测定法,心率监测模块。它包括内部LED,光电探测器、光学元件和低噪声电子设备具有环境光抑制功能。max30102提供了完整的系统解决方案,简化流程设计适用于移动和可穿戴设备。MAX30102在单个1.8V电源上工作为内部LED提供单独的5.0V电源。通信通过标准I2c兼容接口。模块可以通过软件关闭零备用电流,允许电源轨始终保持通电。 应用 ●可穿戴设备 ●健身辅助设备 MAX30102的优点和特点 ●心率监测器和脉搏血氧计传感器输入LED反射溶液 ●微型5.6毫米x 3.3毫米x 1.55毫米14针光学模块 •集成的盖玻片提供最佳、坚固的 ●移动设备超低功率运行 •可编程采样率和LED电流节电 •低功率心率监测器(<1兆瓦) •超低停机电流(0.7μA,典型值) ●快速数据输出能力 •采样率高 ●强大的运动伪影复原能力 •高信噪比 -40°C至+85°C工作温度范围 MAX30102手腕心率模块 有两个发光二极管,一个光检测器,优化光学和低噪声的仿真信号处理,以检测脉搏血氧饱和度和心脏速率信号。 1、只需要将手指头紧贴在传感器上,就能估计 脉搏血氧饱和度(SpO2)及脉搏(相当于心跳)。 2、携带氧气的红血球能吸收较多红外光(850-1000nm),未携带氧气的红血球则是吸收较多的红光(600-750nm)。 3、因此pulse oximeter就是一个迷你的分光计,利用不同红血球之吸收光谱的原理,来分析血氧饱和度。 4、这种实时而快速的测量方式,也广泛被运用在许多临床的参考。 MAX30102手腕心率模块电原理图 经过多方寻找,从一个研究MAX30102算法的程序中找到了一个经过亲自验证有效的实际血氧标定计算公式: SpO2=-45.060*R*R+ 30.354 *R + 94.845 其中的R可以通过红光和红外光光强的对数值计算得到,这个标定表达式实际上是对血氧饱和度的二次曲线拟合,是经过测量得到的。最后终于可以输出血氧饱和度数据了。 MAX30102手腕心率模块主要应用 辅助健身设备 智能电话 平板电脑 可穿戴设备 MAX30102的发光部分包括两个LED,一个是红光LED(660nm),另一个是红外光LED(880nm),这个是测量血氧饱和度SPO2最常见的配置。接收部分是一个对可见光和红外光都敏感的光电二极管,其接收的光强度信号转换为电流信号,经过环境光消除电路后,最后被自带的18位ADC进行采样转化,至此模拟部分完成。AD转化后的数字经过数字滤波后储存在数据寄存器中,最后可通过I2C总线被外接MCU读取。在硬件上,LED的电源和其他部分的电源不是同一个,因为LED为了保证足够的出射光强,需要瞬间大电流(最大50ma),这就要求LED的正向电压足够大(要求3.1V以上)。而其余的AD转换和I2C总线部分,为了实现低功耗要求电压足够小(要求1.8V),所以传感器需要两路独立的电源。此外,由于LED电源会产生瞬间大电流,所以电源引脚附近要加一个大电容减轻对电源电压的影响。 传统的脉搏测量方法主要有三种:一是从心电信号中提取;二是从测量血压时压力传感器测到的波动来计算脉率;三是光电容积法。前两种方法提取信号都会限制病人的活动,如果长时间使用会增加病人生理和心理上的不舒适感。而光电容积法脉搏测量作为监护测量中最普遍的方法之一,其具有方法简单、佩戴方便、可靠性高等特点。 光电容积法的基本原理是利用人体组织在血管搏动时造成透光率不同来进行脉搏和血氧饱和度测量的。其使用的传感器由光源和光电变换器两部分组成,通过绑带或夹子固定在病人的手指、手腕或耳垂上。光源一般采用对动脉血中氧合血红蛋白(HbO2)和去氧血红蛋白(Hb)有选择性的特定波长的发光二极管(一般选用660nm附近的红光和900nm附近的红外光)。当光束透过人体外周血管,由于动脉搏动充血容积变化导致这束光的透光率发生改变,此时由光电变换器接收经人体组织反射的光线,转变为电信号并将其放大和输出。由于脉搏是随心脏的搏动而周期性变化的信号,动脉血管容积也呈现周期性变化,因此光电变换器的电信号变化周期就是脉搏率。 MAX30102手腕心率模块实验接线示意图 实验开源代码 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验一百: MAX30102血氧仪手腕心率脉搏检测心跳传感器模块 1、安装库:IDE-工具-管理库-搜索“MAX30105”-安装 2、项目:串口读取测量数据 3、连线(I2C): VIN → 3.3V GND → GND SDA 接 A4 SCL 接 A5 */ #include #include "MAX30105.h" #include "heartRate.h" MAX30105 particleSensor; const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good. byte rates ; //Array of heart rates byte rateSpot = 0; long lastBeat = 0; //Time at which the last beat occurred float beatsPerMinute; int beatAvg; void setup(){ Serial.begin(115200); Serial.println("Initializing..."); // Initialize sensor if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed { Serial.println("MAX30105 was not found. Please check wiring/power. "); while (1); } Serial.println("Place your index finger on the sensor with steady pressure."); particleSensor.setup(); //Configure sensor with default settings particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED } void loop(){ long irValue = particleSensor.getIR(); if (checkForBeat(irValue) == true) { //We sensed a beat! long delta = millis() - lastBeat; lastBeat = millis(); beatsPerMinute = 60 / (delta / 1000.0); if (beatsPerMinute 20) { rates = (byte)beatsPerMinute; //Store this reading in the array rateSpot %= RATE_SIZE; //Wrap variable //Take average of readings beatAvg = 0; for (byte x = 0 ; x < RATE_SIZE ; x++) beatAvg += rates ; beatAvg /= RATE_SIZE; } } Serial.print("IR="); Serial.print(irValue); Serial.print(", BPM="); Serial.print(beatsPerMinute); Serial.print(", Avg BPM="); Serial.print(beatAvg); Serial.println(); delay(1000); } Initializing... Place your index finger on the sensor with steady pressure. 正在初始化… 将食指稳定地放在传感器上。 (初始化后的串口数据-未放上手指) 实验串口返回情况 模块电原理图之二
  • 热度 6
    2022-2-19 13:51
    664 次阅读|
    3 个评论
    【雕爷学编程】Arduino动手做(99)---8X32 LED点阵模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十九: 8X32 LED点阵显示模块 MAX7219 输出 共阴 5V 四位点阵模组 MAX7219 是美国MAXIM 公司推出的多位LED 显示驱动器,采用3 线串行接口传送数据,可直接与单片机接口连接,用户能方便修改其内部参数,以实现多位LED 显示。它内含硬件动态扫描电路、BCD译码器、段驱动器和位驱动器。此外,其内部还含有8X8 位静态RAM,用于存放8 个数字的显示数据。显然,它可直接驱动64 段LED点阵显示器。当多片MAX7219 级联时,可控制更多的LED 点阵显示器。显示的数据通过单片机数据处理后,送给MAX7219 显示。 MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。MAX7221与SPI™、QSPI™以及 MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。一个方便的四线串行接口可以联接所有通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219/MAX7221同样允许用户对每一个数据选择编码或者不编码。整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。 MAX7219管脚描述 1 DIN 串行数据输入端口。在时钟上升沿时数据被载入内部的16位寄存器。 2,3,5-8,10,11 DIG 0–DIG7 八个数据驱动线路置显示器共阴极为低电平。关闭时7219此管脚输出高电平,7221呈现高阻抗。 4,9 GND 地线 (4脚和9脚必须同时接地) 12 LOAD (MAX7219) 载入数据。连续数据的后16位在LOAD端的上升沿时被锁定。CS (MAX7221) 片选端。该端为低电平时串行数据被载入移位寄存器。连续数据的后16位在cs端的上升沿时被锁定。 13 CLK 时钟序列输入端。最大速率为 10MHz.在时钟的上升沿, 数据移入内部移位寄存器。 下降沿时, 数据从DOUT端输出。对MAX7221来说,只有当cs端为低电平时时钟输入才有效。 14-17,20-23 SEG 7 段和小数点驱动,为显示器提供电流。当一个段驱A–SEG G, 动关闭时,7219的此端呈低电平,7221呈现高阻抗。DP 18 SET 通过一个电阻连接到VDD 来提高段电流。 19 V+ 正极电压输入,+5V 24 DOUT 串行数据输出端口,从DIN输入的数据在16.5个时钟周期后在此端有效。当使用多个MAX7219/MAX7221时用此端方便扩展。 MAX7219功能特点 1 10MHz连续串行口 2 独立的LED段控制 3 数字的译码与非译码选择 4 150μA的低功耗关闭模式 5 亮度的数字和模拟控制 6 高电压中断显示 7 共阴极LED显示驱动 8 限制回转电流的段驱动来减少EMI(MAX7221) 9 SPI, QSPI, MICROWIRE串行接口(MAX7221) 10 24脚的 DIP和 SO 封装 8X32 LED点阵显示模块 MAX7219 输出 共阴 5V 四位点阵模组 8X32 LED点阵显示级联模块,MAX7219是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。只有一个外部寄存器用来设置各个LED的段电流。一个方便的四线串行接口可以联接所有通用的微处理器。每个数据可以寻址在更新时不需要改写所有的显示。MAX7219同样允许用户对每一个数据选择编码或者不编码。整个设备包含一个150μA的低功耗关闭模式,模拟和数字亮度控制,一个扫描限制寄存器允许用户显示1-8位数据,还有一个让所有LED发光的检测模式。只需要3个IO口即可驱动1个点阵!点阵显示时无闪烁!支持级联! 8X32 LED点阵显示模块参考电原理图 模块参数: 1.单个模块可以驱动一个8*8共阴点阵 2.模块工作电压:5V 3.模块尺寸:长12.8厘米X宽3.2厘米X高1.3厘米 4.带64个固定螺丝孔,孔径3mm 5.模块带输入输出接口,支持多个模块级联 接线说明: 1.模块左边为输入端口,右边为输出端口。 2.控制单个模块时,只需要将输入端口接到CPU 3.多个模块级联时,第1个模块的输入端接CPU,输出端接第2个模块的输入端,第2个模块的输出端接第3个模块的输入端,以此类推... 实验开源代码 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十九:8X32 LED点阵显示模块 MAX7219 输出 共阴 5V 四位点阵模组 1、下载安装库: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 2、项目:应用多种函数,显示字母,笑脸等图案以及左向移动 3、连线: VCC → 5V GND → GND DIN → D11 CS → D12 CLK → D13 */ #include int DIN = 11; // DIN pin of MAX7219 module int CLK = 13; // CLK pin of MAX7219 module int CS = 12; // CS pin of MAX7219 module int maxInUse = 1; MaxMatrix m(DIN, CS, CLK, maxInUse); char A = {4, 8, B01111111, B01001001, B01001001, B00110110, }; char smile01 = {8, 8, B00111100, B01000010, B10010101, B10010001, B10010001, B10010101, B01000010, B00111100 }; char smile03 实验开源代码之二 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十九:8X32 LED点阵显示模块 MAX7219 输出 共阴 5V 四位点阵模组 1、下载安装库: GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219 2、项目:程序中将所要显示的图型使用数组方式存放,主回圈中交错显示在 8x8 点阵 模块上产生一个有趣的点阵动画 3、连线: VCC → 5V GND → GND DIN 接 D11 (MOSI) CS 接 D10 (SS) CLK 接 D13 (SCK) */ #include const byte sprite = { { 0xf8, 0xbc, 0x15, 0x7e, 0x7e, 0x15, 0xbc, 0xf8 }, { 0xfc, 0x8e, 0x1b, 0x2e, 0x2e, 0x1b, 0x8e, 0xfc } }; const byte DECODEMODE = 0x09; const byte INTENSITY = 0x0a; const byte SCANLIMIT = 0x0b; const byte SHUTDOWN = 0x0c; const byte DISPLAYTEST = 0x0f; void max7219(const byte reg, const byte data) { digitalWrite(SS, LOW); SPI.transfer(reg); SPI.transfer(data); digitalWrite(SS, HIGH); } void setup() { SPI.begin(); max7219(SCANLIMIT, 7); max7219(DECODEMODE, 0); max7219(INTENSITY, 2); max7219(DISPLAYTEST, 0); max7219(SHUTDOWN, 1); for(byte i=0; i<8; i++) { max7219(i+1, 0); } } void loop() { for(byte j=0; j<2; j++) { for(byte i=0; i<8; i++) { max7219(i+1, sprite ); } delay(500); } } 实验开源代码之三 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十九:8X32 LED点阵显示模块 MAX7219 输出 共阴 5V 四位点阵模组 1、下载库 https://www.pjrc.com/teensy/arduino_libraries/Matrix_Sprite.zip 2、项目:在四个8x8屏间跳动的红点(快速扫描所有点阵) 3、连线: VCC → 5V GND → GND DIN 接 D11 (MOSI) CS 接 D10 (SS) CLK 接 D13 (SCK) */ #include // Sprite before Matrix #include const int numChips = 4; //DIN, CLK, SS, #chips Matrix myLeds = Matrix(11, 13, 10, numChips); void setup() { myLeds.clear(); } void loop() { byte x, y; // light one LED at a time, scanning left to right // and top to bottom... useful for testing the matrix for (y=0; y<8; y++) { for (x=0; x<(numChips * 8); x++) { myLeds.write(x, y, HIGH); delay(20); myLeds.write(x, y, LOW); } } } 实验开源代码之四 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十九:8X32 LED点阵显示模块 MAX7219 输出 共阴 5V 四位点阵模组 1、下载库 https://www.pjrc.com/teensy/arduino_libraries/Matrix_Sprite.zip 2、项目:显示字母 3、连线: VCC → 5V GND → GND DIN 接 D11 (MOSI) CS 接 D10 (SS) CLK 接 D13 (SCK) */ #include // Sprite before Matrix #include //DIN, CLK, CS, #chips Matrix myLeds = Matrix(11, 13, 10, 3); Sprite letter_L = Sprite(5, 8, B11000, B11000, B11000, B11000, B11000, B11000, B11111, B11111 ); Sprite letter_E = Sprite(5, 8, B11111, B11111, B11000, B11110, B11110, B11000, B11111, B11111 ); Sprite letter_D = Sprite(6, 8, B111100, B111110, B110111, B110011, B110011, B110111, B111110, B111100 ); Sprite letter_S = Sprite(5, 8, B01110, B11111, B11000, B11110, B01111, B00011, B11111, B01110 ); void setup() { myLeds.clear(); myLeds.setBrightness(0); myLeds.write(3, 0, letter_L); myLeds.write(10, 0, letter_E); myLeds.write(18, 0, letter_D); myLeds.write(26, 0, letter_S); } void loop() { } 实验场景图 Matrix库的几个函数 基本用法,仅限像素 Matrix myLeds = Matrix(DIN,CLK,LOAD,numChips); 使用您选择的名称创建Matrix对象的实例。DIN,CLK和LOAD是连接这些信号的引脚号。如果连接了多个单独连接的MAX7219芯片,则可以创建多个对象。 myLeds。clear(); 清除整个显示屏。 myLeds。setBrightness(15); 设置显示亮度,从0到15(最亮)。 myLeds。write(x,y,value); 更改单个像素。对于关闭,值应为LOW,对于on,值应为HIGH。 基本用法,使用Sprite Sprite myIcon = Sprite(宽度,高度,B11000,B11000,B11111,B11111); 创建一个精灵对象。您可以根据需要创建任意数量的精灵,每个精灵都有一个唯一的名称。宽度应与每个数据值中的位数匹配,高度应与数据值的数量匹配。 myLeds。write(x,y,myIcon); 在显示屏上绘制一个闪烁的精灵。 Sprite库允许创建与Matrix库一起使用的图像精灵 Sprite 启动LCD库。 width() 返回精灵的宽度(以像素为单位)。 height() 返回精灵的高度(以像素为单位)。 write() 将数据写入精灵的x,y位置。 read() 返回存储在sprite的x,y位置的数据。 实验开源仿真编程(Linkboy V4.63) 实验开源图形编程(Mind+、Mixly、编玩边学) 【花雕动手做】有趣好玩的音乐可视化系列小项目(08)---四位32段点阵屏 项目之三:红绿色32段级联频谱点阵屏灯(FFT算法) 实验开源代码 /* 【花雕动手做】有趣好玩的音乐可视化系列小项目(08)---四位32段点阵屏 项目之三:红绿色32段级联频谱点阵屏灯(FFT算法) 接脚连线:MAX9814 接A0 MAX7219 UNO VCC →→→→→ 5V GND →→→→→ GND DIN →→→→→ D11(数据,数据接收引脚) CS →→→→→ D10(负载,命令接收引脚) CLK →→→→→ D13(时钟,时钟引脚) */ #include #include #include MD_MAX72XX disp = MD_MAX72XX(MD_MAX72XX::FC16_HW, 10, 1); arduinoFFT FFT = arduinoFFT(); double realComponent ; double imagComponent ; int spectralHeight = analogRead(A7) / sensitivity; imagComponent = 0; } FFT.Windowing(realComponent, 64, FFT_WIN_TYP_HAMMING, FFT_FORWARD); FFT.Compute(realComponent, imagComponent, 64, FFT_FORWARD); FFT.ComplexToMagnitude(realComponent, imagComponent, 64); for (int i = 0; i < 32; i++) { realComponent = constrain(realComponent , 0, 80); realComponent = map(realComponent , 0, 80, 0, 8); index = realComponent ; value = spectralHeight ; c = 31 - i; disp.setColumn(c, value); } } 实验场景动态图 https://img.mydigit.cn/forum/202111/22/142941orny1mpjp1ktcdtr.gif 实验视频剪辑 https://v.youku.com/v_show/id_XNTgyMTc1NTk2OA==.html?spm=a2hcb.playlsit.page.1
  • 热度 3
    2022-2-17 08:06
    611 次阅读|
    0 个评论
    【雕爷学编程】Arduino动手做(98)---RC522 RFID射频模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验九十八: MFRC-522 RC522 RFID射频 IC卡感应模块读卡器S50复旦卡钥匙扣模组 MF RC522 是应用于13.56MHz 非接触式通信中高集成度读写卡系列芯片中的一员。是NXP 公司针对“三表”应用推出的一款低 电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。 MF RC522特点和优势 高度集成的模拟电路来解调和解码的响应 缓冲的输出驱动器,用于连接一个天线的最小数量 外部元件 支持ISO / IEC 14443 A / MIFARE 典型操作距离在读/写模式下可达至50mm视 天线的尺寸和调整 支持MF1xxS20 , MF1xxS70和MF1xxS50在读/写模式加密 支持ISO / IEC 14443高达848 kBd的更高传输速度的通信 支持MFIN / MFOUT 额外的内部电源IC智能卡,通过MFIN / MFOUT连接 支持的主机接口 MFRC522是一个高度集成的读取器/写入器IC,适用于非接触式通信 在13.56MHz 。该MFRC522读卡器支持ISO / IEC 14443 A / MIFARE模式。 该MFRC522的内部发射器能够驱动一个读/写器天线设计 符合ISO / IEC 14443 A / MIFARE卡和转发器,无需额外通信 有源电路。接收器模块提供了一个强大而英法fi cient实现 从ISO / IEC解调和解码信号14443 A / MIFARE兼容卡 转发器。数字模块管理的完整的ISO / IEC 14443 A和取景 错误检测(奇偶和CRC )功能。 该MFRC522支持MF1xxS20 , MF1xxS70和MF1xxS50产品。该MFRC522 支持非接触式通信,并使用MIFARE更高的传输速度高达 848 kBd的两个方向。 提供了下面的主机接口: •串行外设接口(SPI ) •串行UART (类似与RS232电平依赖于引脚电压源) •I2C- BUS接口 MF522-AN模块采用Philips MFRC522原装芯片设计读卡电路,使用方便,成本低廉,适用于设备开发、读卡器开发等高级应用的用户、需要进行射频卡终端设计/生产的用户。本模块可直接装入各种读卡器模具。模块采用电压为3.3V,通过SPI接口简单的几条线就可以直接与用户任何CPU主板相连接通信,可以保证模块稳定可靠的工作、读卡距离远; 【电气参数简介】 工作电流:13—26mA/直流3.3V 空闲电流:10-13mA/直流3.3V 休眠电流:<80uA 峰值电流:<30mA 工作频率:13.56MHz 支持的卡类型:mifare1 S50、mifare1 S70、mifare UltraLight、mifare Pro、mifare Desfire 产品物理特性:尺寸:40mm×60mm 环境工作温度:摄氏-20—80度 环境储存温度:摄氏-40—85度 环境相对湿度:相对湿度5%—95% 【模块接口SPI参数】 数据传输速率:最大10Mbit/s MFRC-522 RC522 RFID射频 IC卡感应模块读卡器S50复旦卡钥匙扣模组 模块参考电原理图 射频卡 非接触式IC卡又称射频卡,由IC芯片、感应天线组成,封装在一个标准的PVC卡片内,芯片及天线无任何外露部分。是世界上最近几年发展起来的一项新技术,它成功的将射频识别技术和IC卡技术结合起来,结束了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。卡片在一定距离范围(通常为5—10cm)靠近读写器表面,通过无线电波的传递来完成数据的读写操作。 工作原理 射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。 发射原理 非接触性IC卡与读卡器之间通过无线电波来完成读写操作。二者之间的通讯频率为13.56MHZ。非接触性IC卡本身是无源卡,当读写器对卡进行读写操作时,读写器发出的信号由两部分叠加组成:一部分是电源信号,该信号由卡接收后,与本身的L/C产生一个瞬间能量来供给芯片工作。另一部分则是指令和数据信号,指挥芯片完成数据的读取、修改、储存等,并返回信号给读写器,完成一次读写操作。读写器则一般由单片机,专用智能模块和天线组成,并配有与PC的通讯接口,打印口,I/O口等,以便应用于不同的领域。 Miafre 1 s50 感应式IC卡 ◇ 芯 片:  Philips Mifare 1 S50 ◇ 存储容量:  8Kbit ,16个分区,每分区两组密码 ◇ 工作频率:  13.56MHZ ◇ 通讯速度:  106Kboud ◇ 读写距离:  2.5—10CM ◇ 读写时间:  1-2MS ◇ 工作温度:  -20℃-85℃ ◇ 擦写次数:  >100000次 ◇ 数据保存:  >10年 ◇ 规  格:  0.87×85.5×54/ 非标卡 ◇ 封装材料:  PVC、PET、0.13铜钱 ◇ 封装工艺:  超声波自动植线/自动碰焊 ◇ 制作标准:  ISO 14443, ISO 10536 ◇ 应用范围:  企业/校园一卡通、公交储值卡、高速公路收费、停车场、小区管理等 实验原理 RFID系统组成 RFID 技术利用无线射频方式在阅读器和射频卡之间进行非接触双向数据传输,以达到目标识别和数据交换的目的。最基本的 RFID 系统由三部分组成: 1. 标签(Tag,即射频卡):由耦合元件及芯片组成,标签含有内置天线,用于和射频天线间进行通信。 2. 阅读器:读取(在读写卡中还可以写入)标签信息的设备。 3. 天线:在标签和读取器间传递射频信号。 工作原理 MCU通过对读卡器芯片内寄存器的读写来控制读卡器芯片,读卡器芯片收到MCU发来的命令后,按照非接触式射频卡协议格式,通过天线及其匹配电路向附近发出一组固定频率的调制信号(13.56 MHz)进行寻卡,若此范围内有卡片存在,卡片内部的LC谐振电路(谐振频率与读卡器发送的电磁波频率相同)在电磁波的激励下,产生共振,在卡片内部电压泵的作用下不断为其另一端的电容充电,获得能量,当该电容电压达到2 V时,即可作为电源为卡片的其他电路提供工作电压。 当有卡片处在读卡器的有效工作范围内时,MCU向卡片发出寻卡命令,卡片将回复卡片类型,建立卡片与读卡器的第一步联系,若同时有多张卡片在天线的工作范围内,读卡器通过启动防冲撞机制,根据卡片序列号来选定一张卡片,被选中的卡片再与读卡器进行密码校验,确保读卡器对卡片有操作权限以及卡片的合法性,而未被选中的则仍然处在闲置状态,等待下一次寻卡命令。密码验证通过之后,就可以对卡片进行读写等应用操作。 RC522模块 模块的射频读写芯片应该是飞利浦的 MF RC522,在上一篇文章我应该已经附上了英文和中文的手册。MF RC522提供了3种接口模式:高达10 Mb/s的SPI、I2C总线模式(快速模式下能达400 kb/s,而高速模式下能达3.4 Mb/s)、最高达1228.8 kb/s的UART模式。买来的模块采用了第一种模式——四线制SPI,通信中的时钟信号由 Arduino 产生,MF RC522芯片设置为从机模式,接收来自 Arduino 的数据以设置寄存器,并负责射频接口通信中相关数据的收发。数据的传输路径为:Arduino 通过 MOSI 线将数据发到 MF RC522,MF RC522 通过 MISO 线发回至 Arduino。 RC522模块各引脚功能 SDA -- 串行数据线(IIC接口时的I/O线);在SPI接口中为NSS(从机标志管脚); SCK -- 连接MCU的SCK信号; MOSI -- MCU输出,RC522接收(即主设备输出,从设备输入); MISO -- RC522输出,MCU接收(即从设备输出,主设备输入); IRQ -- 中断请求输出; GND -- 接地; RST -- 复位; 3.3V -- VSS,工作电压,若使用的事5V的MCU,注意分压。 实验开源代码 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十八:MFRC-522 RC522 RFID射频 IC卡感应模块读卡器S50复旦卡钥匙扣模组 1、工具-管理库-搜索“MFRC522”库-安装 2、项目:使用MFRC522 RFID和Arduino读写标签 3、RFID与Arduino Uno的连线 SDA------------------------Digital 10 SCK------------------------Digital 13 MOSI----------------------Digital 11 MISO----------------------Digital 12 IRQ------------------------不用连接 GND-----------------------GND RST------------------------Digital 9 3.3V------------------------3.3V (千万不要连接到5V接口!!!) */ #include #include #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance. void setup() { Serial.begin(9600); // Initialize serial communications with the PC SPI.begin(); // Init SPI bus mfrc522.PCD_Init(); // Init MFRC522 card Serial.println("Scan PICC to see UID and type..."); } void loop() { // Look for new cards if ( ! mfrc522.PICC_IsNewCardPresent()) { return; } // Select one of the cards if ( ! mfrc522.PICC_ReadCardSerial()) { return; } // Dump debug info about the card. PICC_HaltA() is automatically called. mfrc522.PICC_DumpToSerial(&(mfrc522.uid)); } 实验串口返回情况 实验场景图 实验开源代码之二 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十八:MFRC-522 RC522 RFID射频 IC卡感应模块读卡器S50复旦卡钥匙扣模组 1、工具-管理库-搜索“MFRC522”库-安装 2、项目二:读取UID,并将其分别以十进制和十六进制输出到串口 3、RFID与Arduino Uno的连线 SDA------------------------Digital 10 SCK------------------------Digital 13 MOSI----------------------Digital 11 MISO----------------------Digital 12 IRQ------------------------不用连接 GND-----------------------GND RST------------------------Digital 9 3.3V------------------------3.3V (千万不要连接到5V接口!!!) */ #include #include #define SS_PIN 10 #define RST_PIN 9 MFRC522 rfid(SS_PIN, RST_PIN); //实例化类 // 初始化数组用于存储读取到的NUID byte nuidPICC ; void setup() { Serial.begin(9600); SPI.begin(); // 初始化SPI总线 rfid.PCD_Init(); // 初始化 MFRC522 } void loop() { // 找卡 if ( ! rfid.PICC_IsNewCardPresent()) return; // 验证NUID是否可读 if ( ! rfid.PICC_ReadCardSerial()) return; MFRC522::ICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak); // 检查是否MIFARE卡类型 if (piccType != MFRC522::ICC_TYPE_MIFARE_MINI && piccType != MFRC522::ICC_TYPE_MIFARE_1K && piccType != MFRC522::ICC_TYPE_MIFARE_4K) { Serial.println("不支持读取此卡类型"); return; } // 将NUID保存到nuidPICC数组 for (byte i = 0; i < 4; i++) { nuidPICC = rfid.uid.uidByte; } Serial.print("十六进制UID:"); printHex(rfid.uid.uidByte, rfid.uid.size); Serial.println(); Serial.print("十进制UID:"); printDec(rfid.uid.uidByte, rfid.uid.size); Serial.println(); // 使放置在读卡区的IC卡进入休眠状态,不再重复读卡 rfid.PICC_HaltA(); // 停止读卡模块编码 rfid.PCD_StopCrypto1(); } void printHex(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer < 0x10 ? " 0" : ""); Serial.print(buffer, HEX); } } void printDec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer < 0x10 ? " 0" : ""); Serial.print(buffer, DEC); } } 实验串口返回情况 实验开源代码之三 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十八:MFRC-522 RC522 RFID射频 IC卡感应模块读卡器S50复旦卡钥匙扣模组 1、安装库:IDE-工具-管理库-搜索“MFRC522”库-安装 2、项目三:RC522 模块的读写操作 3、RFID与Arduino Uno的连线 SDA------------------------Digital 10 SCK------------------------Digital 13 MOSI----------------------Digital 11 MISO----------------------Digital 12 IRQ------------------------不用连接 GND-----------------------GND RST------------------------Digital 9 3.3V------------------------3.3V (千万不要连接到5V接口!!!) */ #include #include #define RST_PIN 9 // 配置针脚 #define SS_PIN 10 MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建新的RFID实例 MFRC522::MIFARE_Key key; void setup() { Serial.begin(9600); // 设置串口波特率为9600 while (!Serial); // 如果串口没有打开,则死循环下去不进行下面的操作 SPI.begin(); // SPI开始 mfrc522.PCD_Init(); // Init MFRC522 card for (byte i = 0; i < 6; i++) { key.keyByte = 0xFF; } Serial.println(F("扫描卡开始进行读或者写")); Serial.print(F("使用A和B作为键")); dump_byte_array(key.keyByte, MFRC522::MF_KEY_SIZE); Serial.println(); Serial.println(F("注意,会把数据写入到卡在#1")); } void loop() { // 寻找新卡 if ( ! mfrc522.PICC_IsNewCardPresent()) return; // 选择一张卡 if ( ! mfrc522.PICC_ReadCardSerial()) return; // 显示卡片的详细信息 Serial.print(F("卡片 UID:")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println(); Serial.print(F("卡片类型: ")); MFRC522:ICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); Serial.println(mfrc522.PICC_GetTypeName(piccType)); // 检查兼容性 if ( piccType != MFRC522:ICC_TYPE_MIFARE_MINI && piccType != MFRC522:ICC_TYPE_MIFARE_1K && piccType != MFRC522:ICC_TYPE_MIFARE_4K) { Serial.println(F("仅仅适合Mifare Classic卡的读写")); return; } // 我们只使用第二个扇区 // 覆盖扇区4 byte sector = 1; byte blockAddr = 4; byte dataBlock ; byte size = sizeof(buffer); // 原来的数据 Serial.println(F("显示原本的数据...")); status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522:ICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("身份验证失败?或者是卡链接失败")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // 显示整个扇区 Serial.println(F("显示所有扇区的数据")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // 从块儿读取数据 Serial.print(F("读取块儿的数据在:")); Serial.print(blockAddr); Serial.println(F("块 ...")); status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("读卡失败,没有连接上 ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("数据内容在第 ")); Serial.print(blockAddr); Serial.println(F(" 块:")); dump_byte_array(buffer, 16); Serial.println(); Serial.println(); //开始进行写入准备 Serial.println(F("开始进行写入的准备...")); status = (MFRC522::StatusCode) mfrc522.PCD_Authenticate(MFRC522:ICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("写入失败,没有连接上或者没有权限 ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // Write data to the block Serial.print(F("在第: ")); Serial.print(blockAddr); Serial.println(F(" 块中写入数据...")); dump_byte_array(dataBlock, 16); Serial.println(); status = (MFRC522::StatusCode) mfrc522.MIFARE_Write(blockAddr, dataBlock, 16); if (status != MFRC522::STATUS_OK) { Serial.print(F("写入失败... ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.println(); // 再次读取卡中数据,这次是写入之后的数据 Serial.print(F("读取写入后第")); Serial.print(blockAddr); Serial.println(F(" 块的数据 ...")); status = (MFRC522::StatusCode) mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("读取失败... ")); Serial.println(mfrc522.GetStatusCodeName(status)); } Serial.print(F("块 ")); Serial.print(blockAddr); Serial.println(F("数据为 :")); dump_byte_array(buffer, 16); Serial.println(); // 验证一下数据,要保证写入前后数据是相等的 // 通过计算块中的字节数量 Serial.println(F("等待验证结果...")); byte count = 0; for (byte i = 0; i < 16; i++) { // 比较一下缓存中的数据(我们读出来的数据) = (我们刚刚写的数据) if (buffer == dataBlock) count++; } Serial.print(F("匹配的字节数量 = ")); Serial.println(count); if (count == 16) { Serial.println(F("验证成功 :")); } else { Serial.println(F("失败,数据不匹配")); Serial.println(F("也许写入的内容不恰当")); } Serial.println(); // 转储扇区数据 Serial.println(F("写入后的数据内容为::")); mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector); Serial.println(); // 停止 PICC mfrc522.PICC_HaltA(); //停止加密PCD mfrc522.PCD_StopCrypto1(); } /** * 将字节数组转储为串行的十六进制值 */ void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer < 0x10 ? " 0" : " "); Serial.print(buffer, HEX); } } 实验串口返回情况 实验开源仿真编程(Linkboy V4.62) 实验仿真编程(Linkboy V4.62)之二 实验串口返回情况 实验开源仿真编程(Linkboy V4.62)其他 NFC Tools PRO 应该是目前为止最强大的NFC工具了吧(APP),可惜nfc这玩意儿不是所有手机都标配。NFC Tools PRO是一款可以读取和写入nfc标签的工具,同时还提供了一些额外功能。NFC工具专业版包含额外的功能,如配置文件管理等等。保存您的标记或任务配置文件后重新使用它们。NFC工具专业版允许您在记录或任务直接从现有的NFC标签导入。您可以非常快的编辑您的标签。您也可以直接运行的任务配置文件。 主要功能: - 读写NFC - NFC标签配置文件管理 - 从标签导入任务
  • 热度 2
    2022-2-10 07:31
    990 次阅读|
    0 个评论
    【雕爷学编程】Arduino动手做(97)---10段LED光柱模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十七: 10段LED发光条MT102510AG数码显示光柱模块 10段光条数码管红色20个脚,外形尺寸:25.10x10.10x7.9mm,一面脚为正极一面为负极,超亮红色光条,10个笔段可以单独控制 模块特性 *能在低电压、小电流条件下驱动发光; *发光响应时间极短(<0.1μs),高频特性好,单色性好,亮度高; *体积小,重量轻,抗冲击性能好。固态封装,封装方式为灌胶型,稳定性高; *寿命长,使用寿命在5万小时以上; *可连续扫描驱动各灯段; *良好的显示效果、视角宽; *推荐恒流使用,恒压会出现亮度不均匀现象; *表面有保护膜的产品,可以在使用前撕下来; *使用温度:-30℃至65℃。 实验开源代码 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十七:10段LED发光条MT102510AG数码显示光柱模块 1、项目一:10段红色数码光条,逐条点亮逐条熄灭 2、接脚(2、3、4、5、6、7、8、9、10、11) */ int BASE = 2 ; int NUM = 10; void setup(){ for (int i = BASE; i < BASE + NUM; i ++) { pinMode(i, OUTPUT); } } void loop(){ for (int i = BASE; i < BASE + NUM; i ++) { digitalWrite(i, LOW); delay(200); } for (int i = BASE; i < BASE + NUM; i ++) { digitalWrite(i, HIGH); delay(200); } } 实验场景图 实验开源代码之二 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十七:10段LED发光条MT102510AG数码显示光柱模块 1、程序之二,流水灯效果:全灭的灯逐个往一边点亮,再逐 个往开始端灭掉,循环即可,当然也可以其它效果,可自己设定 2、接脚(2、3、4、5、6、7、8、9、10、11) */ int led1 = 2; int led2 = 3; int led3 = 4; int led4 = 5; int led5 = 6; int led6 = 7; int led7 = 8; int led8 = 9; int led9 = 10; int led10 = 11; int i; void setup() { for (i = 2; i < 12; i++) { pinMode(i, OUTPUT); } } void loop() { for (i = 1; i < 12; i++) { digitalWrite(i, HIGH); delay(50); 1; i--) { digitalWrite(i, LOW); delay(50); } } 实验开源代码之三 /* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验九十七:10段LED发光条MT102510AG数码显示光柱模块 1、程序之三,控制多个LED实现多种闪烁效果 2、接脚(2、3、4、5、6、7、8、9、10、11) */ int led1 = 2; int led2 = 3; int led3 = 4; int led4 = 5; int led5 = 6; int led6 = 7; int led7 = 8; int led8 = 9; int led9 = 10; int led10 = 11; int n; void setup(){ for(n=2;n<=11;n++) { pinMode(n, OUTPUT); } } void loop(){ turn1(); clean(); turn2(); clean(); turn3(); clean(); } void turn1() { for(n=2;n<=11;n++) { digitalWrite(n,HIGH); delay(300); } for(n=2;n<=11;n++) { digitalWrite(n,LOW); delay(300); } } void turn2() { for(int x=0;x<=2;x++) { for(n=2;n<=11;n++) { digitalWrite(n,HIGH); } delay(300); for(n=2;n<=11;n++) { digitalWrite(n,LOW); } delay(300); } } void turn3() { for(int x=0;x<=2;x++) { digitalWrite(2,HIGH); digitalWrite(3,HIGH); for(n=4;n<=11;n++){ digitalWrite(n,LOW); } delay(300); digitalWrite(6,HIGH); digitalWrite(7,HIGH); digitalWrite(2,LOW); digitalWrite(3,LOW); digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(8,LOW); digitalWrite(9,LOW); digitalWrite(10,LOW); digitalWrite(11,LOW); delay(300); digitalWrite(10,HIGH); digitalWrite(11,HIGH); for(n=2;n<=9;n++){ digitalWrite(n,LOW); } delay(300); } } void clean() { for(n=2;n<=11;n++) { digitalWrite(n,LOW); } delay(300); } 实验的视频记录 https://v.youku.com/v_show/id_XNDMzNTk0ODE1Ng==.html?spm=a2hzp.8244740.0.0 实验开源图形编程(Mind+、Mixly、编玩边学)