tag 标签: diy

相关帖子
相关博文
  • 热度 4
    2023-1-12 20:57
    3117 次阅读|
    0 个评论
    2021年8月22日星期日,发文“ 大事做不了 小事乐所为 也环保 ”, 说的是 三条 iPhone 和 iPad 的充电线,几年来的频繁插拔, 一年多前开始设备端的小插头塑胶壳有裂痕、与导线衔接处的塑胶皮也断裂脱落而露出了里面金属屏蔽线。 小心翼翼地做了修补和加固。 昨天,2023年1月11日星期三,上午,家人又说一根充电线插上插头,手机屏幕上电池图标显示充电线时断时续,伴随“嘟”的声音。 其实,几个月前,有两根已经被我再加固过了,包括家人说的这一根。 我想,一是毕竟外部的塑胶套管老化了易破裂;二是这两根线插拔使用的频率高多了,因为两个iPhone7 Plus电池系统功能衰老了,常常需要充电,出门都要带上充电线随时以备充电使用。 晚饭后,有整段时间了,就坐下来,小心翼翼地又动起手来。 用界刀小心地切开之前加固用的黑色热缩胶管和腐烂了的塑胶套管,再用牙签小心地一点点挑起和除掉锈蚀了的屏蔽金属网线和屏蔽薄膜,见附图。 接着,先用洗洁精清洗手术位置的污垢杂质,用小刷子仔细清洁,再用清水冲洗干净残留液体,见附图。然后放在通风处吹干,当然可以用吹风筒。 接着,小心理顺截断后两端的屏蔽线头,找来一节以前拆解保留的同类屏蔽线,抽出一小部分,用电烙铁焊接连通屏蔽线,再用屏蔽薄膜纸裹住全部导线,最后用热缩导管密封性固定住,见附图。 呵呵,完成了一个。 接着,再搞第二个。 呵呵,又可以使用一段时间了。 这次,为了可靠性考虑,这两根电缆线就只是在家里固定位置使用了,另外买两根新的作为外出移动使用。 大事做不了,小事乐所为。 益智又健康,节约又环保。
  • 热度 13
    2022-4-11 10:51
    3240 次阅读|
    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); } }
  • 热度 7
    2022-3-31 11:01
    2684 次阅读|
    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值和字节长度。
  • 热度 13
    2022-3-23 12:03
    5726 次阅读|
    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接口获得更精准的测量结果。
  • 热度 22
    2021-8-22 11:27
    2022 次阅读|
    1 个评论
    大事做不了 小事乐所为 也环保
      三条iPhone和iPad的充电线,几年来的频繁插拔,一年多前开始设备端的小插头塑胶壳有裂痕、与导线衔接处的塑胶皮也断裂脱落而露出了里面金属屏蔽线。 呵呵,平时不觉得,拍照放大一看,导线也不清洁有污浊,修理完后,用酒精擦拭了一遍,干净多了。 人在外地有事长居一段时间,工具材料都在家里,不能动手修理补救。 前些日子回到家中,闲下来了。就琢磨怎么修理,想了方案,并着手修理。 材料、工具备齐。 开工! 就是先用一段黄蜡套管,破开,然后裹住导线破损部分。 再用较大一点热塑胶管在接头部位两部分都套住,加热紧固。   再将插头手持套和上面刚才套装的部分整体套一个热缩胶管,热缩收紧定型,完成!做第二个时,注意了胶套的长度适度。   三个都做完了,适用满意,延长了三根充电线的使用寿命。   为了可靠耐用,还在热缩胶管与导线衔接处滴了一点AA胶,固定使其不会因插拔使用久了而容易滑脱。   当然,把导线整个都用酒精擦拭干净多了,前面说了,哈哈!   大事做不了,小事乐所为。   益智又健康,节约又环保。
相关资源