tag 标签: diy

相关帖子
相关博文
  • 2025-2-13 11:43
    590 次阅读|
    0 个评论
    前言 基于 ESP32 设计开发的智能流动环境检测车,旨在克服传统固定监测方式的不足。该车能够在不同环境场景下灵活移动,深入到各个角落进行环境数据采集,大大拓展了环境监测的范围和灵活性。通过集成多种先进的传感器,如 BMP280 用于精确采集温湿度和气压数据,ESP32cam 摄像头能够捕捉直观的图像信息,再结合网络 API 获取的天气预报信息,实现了多源数据的综合采集与分析,为全面、准确地了解环境状况提供了丰富的数据支持。 展示 整车展示 APP展示 云端展示 功能 1.除草(12v割草机) 2.环境检测 3.实时图传 4.手柄控制 5.手机控制 6.GPS定位(备用) 硬件设计 1.采用两块ESP32-WROOM-32模组 ①号模组控制电机,并且搭配MPU6050陀螺仪模块进行PID控制电机,从而带动履带运动 ②号模组负责数据的处理和传输,将数据传输到API,然后服务器进行数据处理,反馈到APP和单片机 2.屏幕 ①1.8寸TFT_LCD ②0.96寸OLED 3.环境监测 采用GY-39模块,此模块集成BMP280和MAX44009 传感器 4.电机驱动 模块采用AT8236芯片,款双通道直流电机驱动芯片,能够同时驱动两个直流电机 5.手柄控制 采用PS2手柄进行手动控制,有接收器和手柄两部分,操作简单,功能按键多,传输距离10米左右,连接有良好的稳定性 6.实时图传 采用ESP32-CAM模块,这个模块基于ESP32-S芯片,搭配OV3660摄像头,可以自动采集图像,并且通过ESP32-S的HTTP通信将图片传输到服务器中,实现远程监控,由于ESP32-CAM工作时发热巨大,为了运行的稳定性且安全性,所以加装了Mini风扇进行散热 7.继电器模块 采用了12V的割草电机,用于割草,所以基于割草机和整体的安全性,采用继电器来控制割草电机,通过主控芯片来控制继电器,实现隔离和安全控制电机的功能 8.驱动电机 采用减速比为1:56的减速电机,型号520,额定电压12V 程序设计 Arduino IDE:这是 Arduino 的主要编程软件,是一个开源的集成开发环境。它基于 C/C++ 语言,为开发者提供了一个简单易用的平台,用于编写、编译和上传程序到 Arduino 开发板。其具有跨平台兼容性,支持 Windows、Mac OS X、Linux 等主流操作系统。 电机ESP32 功能ESP32 App Inventor 采用图形化的编程界面,通过简单的拖拽和拼接代码块来构建应用程序逻辑,无需手动编写大量的文本代码,大大降低了编程门槛。 APP的内容首先是能够实现ESP32进行远程控制,然后接收传感器的数据,和天气API的户外天气数据,并且获取ESP32-CAM的图像,实现远程查看监控站的信息 完整项目 项目开源文档下载: https://mbb.eet-china.com/download/316665.html
  • 热度 4
    2025-1-25 22:09
    3072 次阅读|
    0 个评论
    【电子DIY】智能天气监控站
    项目展示 ①正面、反面 ②左侧、右侧 项目源码 : https://mbb.eet-china.com/download/316656.html 前言 为什么想到要做这个小玩意呢,作为一个死宅,懒得看手机,但又想要抬头就能看见时间和天气信息,于是就做个这么个小东西,放在示波器上面正好(示波器外壳有个小槽,刚好可以卡住) 功能主要有,获取国家气象局的天气信息,还有实时的温湿度,主控采用ESP32,所以后续还可以开放更多奇奇怪怪的功能,比如油价信息、股票信息之类的,反正能联网可操作性就大多了 原理图、PCB、面板设计均使用嘉立创EDA,项目代码方面采用Arduino IDE,项目全开源,商用请联系 设计思路 硬件信息 ①主控:ESP32(esp32 wroom 32) ②屏幕:主屏1.8寸TFT_LED,副屏0.96寸OLED ③充电:IP5306 ④降压:AMS1117-3.3 ⑤通信:CH340K ⑥接口:TYPE-C-16P ⑦传感:DHT11 ⑧电池:2000毫安锂电 原理图 PCB 面板设计 我还是第一次用到嘉立创的面板设计,这里就给大家提供一个参考,大家感兴趣也可以试一下 我设计的尺寸大概是45*60mm,最少5张起,一张5块钱,不包邮(无法使用包邮卷,8元运费) 新人领了一张10元优惠券,所以最终是23块钱 不知道这个价格怎么样? 要补充一点,嘉立创面板的服务还是很到位的,可能他们怕你不会弄,会有专员加你确认生产稿,这点还是非常好评的 我第一次画就画错了,在确认生产稿环节,才将图纸改正确,不然血亏23块钱 我采用的方法是,拼了几张图片,中间不设图案,透明显示(屏幕显示) 不知道正确的方法是不是这样,反正效果也还可以 目前功能 ①温度、湿度检测 ②户外天气获取 ③自动配网 ④主屏、副屏显示 ⑤智能充放电 ⑥天气图片适配 ⑦天气文字适配 ⑧OLED支持常用中文库 ⑨NTP网络时钟 温湿度检测 使用DHT11传感器,库文件dht11库,库文件地址https://wwmg.lanzouu.com/id6GV2fydzpa 非常常用的库,使用方法也很简单,DHT11.read更新传感器信息,然后直接用DHT.humidi和DHT11.temperature读取温湿度信息 户外天气获取 通过获取天气API,然后使用JSON库解析API信息 天气API地址:http://api.xemowo.top/api/tqyb.html 调用ParseWeather函数(连接网络后),访问API,并且解析JSON信息,将数据保存至变量 自动配网 在setup函数中,就调用connectToWiFi函数,带入数据为超时时长,在15s内读取内存保存的网络数据,并且进行连接,连接失败或超时,则进行配网 进入配网状态,手机、电脑在wifi列表可见XEM_ESP32,进行连接,连接成功会自动跳转到配网界面 输入WIFI账号密码后,会将数据保存进内存,方便下次启动连接WIFI NTP时钟 采用NTPClient库,使用阿里云NTP授时 库函数:https://github.com/arduino-libraries/NTPClient 天气图片适配 工程文件夹中,BMP.H文件保存大部分常用天气的图标,以及一些用得到的图标,代码会根据当前天气,自动适配图片 天气文字适配 XEM_FONT.H文件中,则保存所需天气的中文字符 参考库大全 WiFi.h 内置 ArduinoJson.h https://github.com/bblanchon/ArduinoJson HTTPClient.h 内置 Arduino.h 内置 TFT_eSPI.h https://github.com/Bodmer/TFT_eSPI SPI.h 内置 string.h 内置(C/C++ 标准库) NTPClient.h https://github.com/arduino-libraries/NTPClient WiFiUdp.h 内置 U8g2lib.h https://github.com/olikraus/u8g2 Wire.h 内置 dht11.h https://github.com/adafruit/DHT-sensor-library 复刻成本 批发会更便宜,以下价格为单买 (一)元器件 1.8寸TFT_LEC:11元 0.96寸OLED:8元 ESP32:13元 DHT11:4元 CH340K:3元 IP5306:2元 AMS1117:1元 2000锂电池:3元 其他元器件:5元 (二)其他 PCB:白嫖 面板:23元 螺丝:2元 汇总:75元 总结 项目初代可能功能比较单一,但是ESP32的能力还远不止这么点,后续还可以更新APP,以及其他接口功能 后续可能考虑用3D打印替换面板,因为面板还是比较贵,而且不是封闭的 元器件可以批发买,外壳采用3D打印,成本可能可以降到50内 后代可能会考虑去掉OLED屏幕,以及将DHT11换成更小的传感芯片,可以将体积缩小一半,这样更加的迷你和轻便 大家有什么意见可以讨论一下,复刻有问题的,可以联系我
  • 热度 4
    2023-1-12 20:57
    3183 次阅读|
    0 个评论
    2021年8月22日星期日,发文“ 大事做不了 小事乐所为 也环保 ”, 说的是 三条 iPhone 和 iPad 的充电线,几年来的频繁插拔, 一年多前开始设备端的小插头塑胶壳有裂痕、与导线衔接处的塑胶皮也断裂脱落而露出了里面金属屏蔽线。 小心翼翼地做了修补和加固。 昨天,2023年1月11日星期三,上午,家人又说一根充电线插上插头,手机屏幕上电池图标显示充电线时断时续,伴随“嘟”的声音。 其实,几个月前,有两根已经被我再加固过了,包括家人说的这一根。 我想,一是毕竟外部的塑胶套管老化了易破裂;二是这两根线插拔使用的频率高多了,因为两个iPhone7 Plus电池系统功能衰老了,常常需要充电,出门都要带上充电线随时以备充电使用。 晚饭后,有整段时间了,就坐下来,小心翼翼地又动起手来。 用界刀小心地切开之前加固用的黑色热缩胶管和腐烂了的塑胶套管,再用牙签小心地一点点挑起和除掉锈蚀了的屏蔽金属网线和屏蔽薄膜,见附图。 接着,先用洗洁精清洗手术位置的污垢杂质,用小刷子仔细清洁,再用清水冲洗干净残留液体,见附图。然后放在通风处吹干,当然可以用吹风筒。 接着,小心理顺截断后两端的屏蔽线头,找来一节以前拆解保留的同类屏蔽线,抽出一小部分,用电烙铁焊接连通屏蔽线,再用屏蔽薄膜纸裹住全部导线,最后用热缩导管密封性固定住,见附图。 呵呵,完成了一个。 接着,再搞第二个。 呵呵,又可以使用一段时间了。 这次,为了可靠性考虑,这两根电缆线就只是在家里固定位置使用了,另外买两根新的作为外出移动使用。 大事做不了,小事乐所为。 益智又健康,节约又环保。
  • 热度 13
    2022-4-11 10:51
    3447 次阅读|
    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
    2927 次阅读|
    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值和字节长度。
相关资源