tag 标签: diy

相关帖子
相关博文
  • 热度 6
    2022-4-11 10:51
    1231 次阅读|
    0 个评论
    用MAX30102制作一个血氧及心率测量仪
    项目采用MAX30102血氧及心率监视模块、Arduino UNO板、OLED显示器和蜂鸣器,搭建了一个简单的心率(BPM)测量仪。 这里,BPM为每分钟的心跳数,正常人的数字为65-75之间,体育运动员的数字要低些;血氧饱和度(SaO2)对于正常然来说大概为95%。 项目物料 本项目所需材料包括: Max30102(×1):这是项目的功能器件,是一款用于可穿戴设备的高灵敏脉冲式血样及心率传感器,具有不同版本,但是只要型号正确即可。 Arduino UNO(×1) OLED 128x32(×1):低功耗显示器。 Buzzer (×1):蜂鸣器 面包板(×1):方便组件安装和连接的线路板。 连接线 本项目所用代码来自Sparkfun_MAX3010x示例库,OLED和Buzzer代码根据 "HeartRate" 示例改进而来,这需要用户将手指放在传感器上。 注意,如果将手指放在传感器上,就要保持安静,直到蜂鸣器的“哔哔”声与你的心率节拍同步,或者与OLED动画同步,这时可读出正确的BPM心率读数。 本项目采用4次BPM读数的平均值,因此比较准确。 让OLED显示bmp图像 OLED显示的是小的“心形”栅格图(bmp),一旦传感器检测到一次心跳,就立即切换为大点的“心形”栅格图并保持一会儿,这样屏幕就像心跳一样,一闪一闪的,并伴有蜂鸣器的“哔哔”声。 选择希望看到的图走向的格式,如 .png\ .bmp\ .dib等。切记,本项目屏幕尺寸为128x32px,图像尺寸要小一些,为32x32px和24x21px。 下载LCD助手并打开。 可看到如下"数字" 这就是所谓的代码: display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); 其含义为: display.drawBitmap(Starting x pos, Starting y pos, Bitmap name, Width, Height, Color); 这段代码描述了两件事——“当检测到手指时做什么”,以及“捡到心跳时做什么”。 以下是更新后的代码: MAX_BPM_OLED_Buzzer.inoArduino Modified from the SparkFun MAX3010x library /* This code works with MAX30102 + 128x32 OLED i2c + Buzzer and Arduino UNO * It's displays the Average BPM on the screen, with an animation and a buzzer sound * everytime a heart pulse is detected * It's a modified version of the HeartRate library example * Refer to www.surtrtech.com for more details or SurtrTech YouTube channel */ #include //OLED libraries #include #include #include "MAX30105.h" //MAX3010x library #include "heartRate.h" //Heart rate calculating algorithm 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; #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 32 // OLED display height, in pixels #define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); //Declaring the display name (display) static const unsigned char PROGMEM logo2_bmp = { 0x01, 0xF0, 0x0F, 0x80, 0x06, 0x1C, 0x38, 0x60, 0x18, 0x06, 0x60, 0x18, 0x10, 0x01, 0x80, 0x08, 0x20, 0x01, 0x80, 0x04, 0x40, 0x00, 0x00, 0x02, 0x40, 0x00, 0x00, 0x02, 0xC0, 0x00, 0x08, 0x03, 0x80, 0x00, 0x08, 0x01, 0x80, 0x00, 0x18, 0x01, 0x80, 0x00, 0x1C, 0x01, 0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x14, 0x00, 0x80, 0x00, 0x14, 0x00, 0x40, 0x10, 0x12, 0x00, 0x40, 0x10, 0x12, 0x00, 0x7E, 0x1F, 0x23, 0xFE, 0x03, 0x31, 0xA0, 0x04, 0x01, 0xA0, 0xA0, 0x0C, 0x00, 0xA0, 0xA0, 0x08, 0x00, 0x60, 0xE0, 0x10, 0x00, 0x20, 0x60, 0x20, 0x06, 0x00, 0x40, 0x60, 0x03, 0x00, 0x40, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x00, 0xC0, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x30, 0x0C, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x03, 0xC0, 0x00, 0x00, 0x01, 0x80, 0x00 }; void setup() { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //Start the OLED display display.display(); delay(3000); // Initialize sensor particleSensor.begin(Wire, I2C_SPEED_FAST); //Use default I2C port, 400kHz speed particleSensor.setup(); //Configure sensor with default settings particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running } void loop() { long irValue = particleSensor.getIR(); //Reading the IR value it will permit us to know if there's a finger on the sensor or not //Also detecting a heartbeat 7000){ //If a finger is detected display.clearDisplay(); //Clear the display display.drawBitmap(5, 5, logo2_bmp, 24, 21, WHITE); //Draw the first bmp picture (little heart) display.setTextSize(2); //Near it display the average BPM you can display the BPM if you want display.setTextColor(WHITE); display.setCursor(50,0); display.println("BPM"); display.setCursor(50,18); display.println(beatAvg); display.display(); if (checkForBeat(irValue) == true) //If a heart beat is detected { display.clearDisplay(); //Clear the display display.drawBitmap(0, 0, logo3_bmp, 32, 32, WHITE); //Draw the second picture (bigger heart) display.setTextSize(2); //And still displays the average BPM display.setTextColor(WHITE); display.setCursor(50,0); display.println("BPM"); display.setCursor(50,18); display.println(beatAvg); display.display(); tone(3,1000); //And tone the buzzer for a 100ms you can reduce it it will be better delay(100); noTone(3); //Deactivate the buzzer to have the effect of a "bip" //We sensed a beat! long delta = millis() - lastBeat; //Measure duration between two beats lastBeat = millis(); beatsPerMinute = 60 / (delta / 1000.0); //Calculating the BPM if (beatsPerMinute 20) //To calculate the average we strore some values (4) then do some math to calculate the average { 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; } } } if (irValue < 7000){ //If no finger is detected it inform the user and put the average BPM to 0 or it will be stored for the next measure beatAvg=0; display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(30,5); display.println("Please Place "); display.setCursor(30,15); display.println("your finger "); display.display(); noTone(3); } }
  • 热度 2
    2022-3-31 11:01
    732 次阅读|
    0 个评论
    用PN532模块制作一个OLED显示的NFC读卡器
    NFC(近场通信)在两个小环形天线之间使用磁感应,常用于各种智能卡的读写。项目采用Arduino Uno开发板读取PN532 NFC模块卡,显示器采用0.96″I2C OLED小屏幕。 使用的物料清单如下: Arduino Nano开发板 Adafruit PN532 RFID/NFC模块 SSD1306 0.96″OLED显示器 跳线 面包板 Arduino IDE(集成开发环境) Adafruit PN532 NFC近场通讯模块兼容Arduino设备,运用UART串口进行通讯。可用USB to UART转换器,通过电脑进行测试。用户也可根据自己需要,利用管脚改变数据传输方式,如IIC、SPI等。 该PN532 NFC近场通讯模块基于NXP PN532芯片,包含80C51微控制器内核,集成了13.56MHz下的各种主动/被动式非接触通信方法和协议,支持6种不同的工作模式: 读写器模式,支持ISO/IEC 14443A / MIFARE机制 读写器模式,支持 FeliCa机制 读写器模式,支持ISO/IEC 14443B机制 卡操作模式,支持ISO 14443A / MIFARE机制 卡操作模式,FeliCa机制 ISO/IEC18092,ECM340点对点 首先,我们按照电路图将PN532模块和OLED显示器连接到Arduino开发板: GND (Ground) GND VCC (Power supply) 5V SDA (Data) A4 SCL (Clock) A5 为读卡器更先进,我们采用Adafruit PN532 library,这个数据库兼容Arduino UNO/Nano板,支持I2C or SPI通信模式。下载Adafruit PN532库、Adafruit GFX库和SSD1306 OLED库,将如下代码上传到Arduino Nano开发板: #include #include #include #include #include #define PN532_IRQ (2) #define PN532_RESET (3) // Not connected by default on the NFC Shield #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32; Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET); Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup(void) { Serial.begin(115200); while (!Serial) delay(10); // for Leonardo/Micro/Zero Serial.println("Hello!"); nfc.begin(); if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } uint32_t versiondata = nfc.getFirmwareVersion(); if (! versiondata) { Serial.print("Didn't find PN53x board"); while (1); // halt } // Got ok data, print it out! Serial.print("Found chip PN5"); 24) & 0xFF, HEX); Serial.print("Firmware ver. "); 16) & 0xFF, DEC); 8) & 0xFF, DEC); display.clearDisplay(); display.setCursor(0, 0); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Found chip PN5"); 24) & 0xFF, HEX); display.setCursor(0, 20); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Firmware ver. "); 16) & 0xFF, DEC); display.print("."); 8) & 0xFF, DEC); nfc.setPassiveActivationRetries(0xFF); // configure board to read RFID tags nfc.SAMConfig(); Serial.println("Waiting for an ISO14443A card"); display.setCursor(0, 40); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("Waiting for NFC Card"); display.display(); } void loop(void) { boolean success; uint8_t uid , &uidLength); if (success) { Serial.println("Found a card!"); Serial.print("UID Length: "); Serial.print(uidLength, DEC); Serial.println(" bytes"); Serial.print("UID Value: "); display.clearDisplay(); display.setCursor(10, 0); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.print("UID Length:"); display.print(uidLength, DEC); display.print(" bytes"); display.setCursor(35, 20); //oled display display.setTextSize(1); display.setTextColor(WHITE); display.println("UID Value: "); display.setCursor(5, 35); //oled display for (uint8_t i=0; i < uidLength; i++) { Serial.print(" 0x"); Serial.print(uid , HEX); display.print(" 0x"); display.print(uid , HEX); display.display(); } Serial.println(""); // Wait 1 second before continuing delay(1000); } else { // PN532 probably timed out waiting for a card Serial.println("Timed out waiting for a card"); } } 上传成功后就可以开始测试了。OLED显示器将显示固件版本1.6,并询问是否扫描卡片。 将银行卡、旅行卡、公交卡等NFC卡靠近PN532 NFC模块板,PN532将读取字节长度和UID值,并显示在OLED屏幕上。 字节长度有时是4位,有时是7位,这取决于卡的发卡机构的设定。如果不喜欢这个OLED显示器,也可以改用串口监视工具Serial Monitor来显示UID值和字节长度。
  • 热度 4
    2022-3-23 12:03
    1024 次阅读|
    0 个评论
    用pH传感器和ESP32制作一个智能pH检测仪
    本项目是一个基于IoT技术的智能pH测量仪,使用了一个pH传感器和ESP32 WiFi模块,pH读数通过ThingSpeak可视化服务器显示。项目物料清单如下: ESP32开发板 (ESP-WROOM-32) PH传感器 9V电池或DC适配器 跳线 面包板 项目清单中的pH传感器是一款比较先进的工业级电极,这是专门为Arduino、ESP8266、ESP32和其他MCU而设计的线性模拟工具,测量范围0-14pH。ESP32是内置12-bit ADC的32位芯片, 可进行高精度的测量。 PH传感器检测包 项目连接器板上的LED可用作电源指示器。该板子带有BNC-type连接器和PH传感器接口。使用时,将pH sensor与BNC连接器连接,再将PH接口插入MCU板的任一模拟输入端口即可。如果已经编程就绪,就很容易获得pH值,也可以通过万用表来测量输出电压。 高分辨率pH探针可按照用户定义的间隔对液体取样,并将结果发送到远端服务器,响应时间少于1分钟,应用场景有养鱼缸、水厂、实验室等。 PH传感器带有BNC连接器的工业级pH电极,电源指示器LED,和一个校准PH探针。技术规格如下: 模块电压:DC 9.00V 1A 测量范围:0-14PH 测量精度:±0.1pH 响应时间: 1min 输出:模拟电压0.5V to 3V Alkali误差: 0.2PH 内阻: 250MO 本仪器事先进行了校准,测量结果与温度成正比。如果PH传感器探针连接状态改变了,就需要重新校准:PH4 = 1.5V, PH7 = 2.0V & PH9 = 2.5V。校准时,让PH传感器探针直立并保持较长一段时间。如果该传感器在2-3天内多次使用过,测量结果就会更加精准。 在测试中将PH探针浸入溶液之前,要先用去离子水冲洗传感器的试管,然后用薄绉纸擦拭干净。要获得稳定测量结果,大约需要30-40秒时间。 一旦测量读数完成,在收储PH探针之前,要再用去离子水冲洗探针,用薄绉纸将表面溶液擦拭干净,然后盖上保护盖进行保管。 注意,PH传感器探针的试管尖非常敏感,禁止用手触碰,也不能放在地上。该灯泡型的外壳非常脆弱,不用时应按规定妥善保管。 用ESP32接口测试PH传感器 制作IoT pH检测仪之前,要先将其与ESP32 WiFi模块按照如下电路图连接并测试。 该pH传感器使用外接9V电池,或者9V DC电源供电。将pH传感器信号板的输出连接到ESP32的VP引脚,这个引脚可作为A0引脚使用。传感器的输出范围为0.5-3V,可与ESP32的模拟引脚一起使用。 基本测试代码 pH传感器是模拟传感器,需要将模拟输出转换成数字pH值。下面是一组简单ESP32 & pH传感器代码,拷贝并将这些代码黏贴到Arduino IDE。 从开发板管理器选择ESP32和COM端口后,就可以上传代码了。 const int potPin=A0; float ph; float Value=0; void setup() { // put your setup code here, to run once: Serial.begin(115200); pinMode(potPin,INPUT); delay(1000); } void loop(){ Value= analogRead(potPin); Serial.print(Value); Serial.print(" | "); float voltage=Value*(3.3/4095.0); ph=(3.3*voltage); Serial.println(ph); delay(500); } 上传代码后,打开Serial Monitor,传感器数值就出现了。 刚才我们测量的是柠檬汁,Ph值范围为2.8~3.0。我们也测量了一个常用洗衣液,其Ph值大于8。我们也测量了一杯牛奶,其Ph值会为5左右。 如果传感器探针与测量套装保持完整的话,我们就没有必要对其进行校准了。否则,如果连接状态改变了,就要微调Ph模块中的5K电位器,按照前述方法进行校准。 制作智能pH检测仪 接下来,我们重写代码构建一个基于IoT的pH检测仪,通过这个pH检测仪我们可在世界上任何地方监视目标的pH值。 项目使用Thingspeak服务器在线监视pH数据。ThingSpeak是一个面向IoT项目的工具,首先应登录https://thingspeak.com并注册一个账号,然后开设一个新通道,为pH读数数据创建一个新装置。 接着,创建API Key。后面更改程序和设定数据时需要这个Key。 下面是基于pH Sensor & ESP32的智能pH测量仪代码: String apiKey = "*************"; const char *ssid = "*************"; const char *password = "*************"; 这需要黏贴并拷贝前面的API Key来升级API密码,同时更新Wi-Fi信用、Wi-Fi名称,以及一个后期可变更的密码。 拷贝以下代码并上传到ESP32开发板: #include const int potPin=A0; float ph; float Value=0; String apiKey = "*************"; // Enter your Write API key from ThingSpeak const char *ssid = "*************"; // replace with your wifi ssid and wpa2 key const char *password = "*************"; const char* server = "api.thingspeak.com";// don't change this WiFiClient client; void setup() { // put your setup code here, to run once: Serial.begin(115200); pinMode(potPin,INPUT); delay(1000); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(2000); Serial.print("."); } // Print local IP address and start web server Serial.println(""); Serial.println("WiFi connected."); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void loop() { // put your main code here, to run repeatedly: Value= analogRead(potPin); Serial.print(Value); Serial.print(" | "); float voltage=Value*(3.3/4095.0); ph=(3.3*voltage); Serial.println(ph); delay(500); if (client.connect(server, 80)) // "184.106.153.149" or api.thingspeak.com { String postStr = apiKey; postStr += "&field1="; postStr += String(ph); postStr += "\r\n"; client.print("POST /update HTTP/1.1\n"); client.print("Host: api.thingspeak.com\n"); client.print("Connection: close\n"); client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n"); client.print("Content-Type: application/x-www-form-urlencoded\n"); client.print("Content-Length: "); client.print(postStr.length()); client.print("\n\n"); client.print(postStr); } } 上传完成后,ESP32将尝试连接WiFi网络。每隔15秒,传感器就向Thinkspeak server上传数据。我们可在Thinkspeak控制面板看到上传的数据结果。 如果你对模拟Ph传感器的测量结果不满意,也可以采用科学仪器级别的Ph传感器,通过它们的I2C & UART接口获得更精准的测量结果。
  • 热度 11
    2021-8-22 11:27
    1059 次阅读|
    0 个评论
    大事做不了 小事乐所为 也环保
      三条iPhone和iPad的充电线,几年来的频繁插拔,一年多前开始设备端的小插头塑胶壳有裂痕、与导线衔接处的塑胶皮也断裂脱落而露出了里面金属屏蔽线。 呵呵,平时不觉得,拍照放大一看,导线也不清洁有污浊,修理完后,用酒精擦拭了一遍,干净多了。 人在外地有事长居一段时间,工具材料都在家里,不能动手修理补救。 前些日子回到家中,闲下来了。就琢磨怎么修理,想了方案,并着手修理。 材料、工具备齐。 开工! 就是先用一段黄蜡套管,破开,然后裹住导线破损部分。 再用较大一点热塑胶管在接头部位两部分都套住,加热紧固。   再将插头手持套和上面刚才套装的部分整体套一个热缩胶管,热缩收紧定型,完成!做第二个时,注意了胶套的长度适度。   三个都做完了,适用满意,延长了三根充电线的使用寿命。   为了可靠耐用,还在热缩胶管与导线衔接处滴了一点AA胶,固定使其不会因插拔使用久了而容易滑脱。   当然,把导线整个都用酒精擦拭干净多了,前面说了,哈哈!   大事做不了,小事乐所为。   益智又健康,节约又环保。
  • 2019-7-25 23:11
    7095 次阅读|
    4 个评论
    【DIY】紫外线强度测试仪
    现有的紫外线强度测试有两种,一个是标准的测试仪器, 200 以上,一两千的也有,数字化,很准,但是使用要求高。另一种是紫外线测试卡,两三块一张,随身携带很方便,其中使用的是光敏变色涂料,在不同的紫外强度下颜色深度不同,可以定性参考(淘宝都有得卖哦)。 但是比专业仪器简单,比变色卡直观,操作简单又不贵的东西就没有了。所以就需要自己制作一个。 首先在淘宝上买了一个 GY-ML8511的传感器模块,15元,回来接好线并将使能EN脚拉高,如下图所示。其实还有一种是 UVM-30A 的传感器也能用,但是贵不少。 下图是入射功率和输出电压的比例关系,可以看出基本是线性的。 下图是这个传感器的响应频谱,集中在紫外波段,含有少量的紫光成分。 剩下的就是怎么样把输出的电压显示出来,我是从来懒得自己设计编程的人,那么自然想到了电量指示模块,下图也是在淘宝一起买的模块, 10 元。通过对标准电压的比较,给出不同的颜色显示,最右侧最低挡位是绿色,最左侧是红色,中间档位是黄色。使用的是 LM3914 来驱动灯条,宽电压输入,基准电压为 1.25V 。 而我们上面传感器的输出最大到 2.5V 左右,因此就需要分压来实现。由于原电路上接的是 Vcc 电压,所以需要把电路切开,然后把分压的电位器高位接传感器的输出 OUT 。割线如下图,原理图可以在淘宝上搜,很简单。接好线路以后,从 OUT 输入一个 2V 电压,调节右边的电位器,使 LM3914 的信号输入引脚正好是 1V ,说明分压成功。由于传感器最低输出就是 1V ,所以从 OUT 输入一个 1V 电压,调节左边的电位器,使灯条正好最下面的灯点亮。 正好以前拆了一个坏的玩具剩下一个电池盒,正好接上去用。 用紫外灯测试,直接爆到红灯。 测试我们的 “紫外”灭蝇灯,竟然是 1 档?!看来这个只是紫光 LED ,果然是廉价货。 近距离测试紫外灯显示 6 档。 放上我的防紫外线眼镜以后回落到 1 档,说明我的眼镜还是有防紫外线的作用的。 总共花费25元硬件成本,人工500,大功告成。最后放上一个动画,距离紫外灯不同距离时候显示的不同颜色。
相关资源