大家好,在这个教程中,我将向您展示如何使用非常著名的ESP32和3个传感器制作气象站,这些传感器可以测量和显示实时值,包括:温度湿度气压紫外线指数红外线辐射可见光参数以实时值和图表的形式显示在BlynkIoT平台的Web仪表板和电话应用程序上。这可能是开始使用物联网的好项目。硬件和连接部分很容易。代码和设置部分有点长,所以请仔细阅读说明直到最后,以确保一切正常。您还可以在下方观看此项目的完整演示视频。演示视频补给品ESP32开发板DHT11/21/22温湿度传感器SI1145阳光传感器BMP180气压传感器穿孔板或面包板(用于连接)公对母跳线Grove连接器电缆(仅当您使用Grove传感器时)微型USB数据线第1步:连接首先,我们首先将所有传感器连接到ESP32。我已附上接线图图像,以便您查看。您也可以下载下面的pdf文件。由于我使用的是Grove传感器,我首先将Grove电缆连接到所有传感器,并使用公对母跳线进一步将它们连接到ESP32。您可以使用电路板放置ESP32,也可以焊接一个非常简单的屏蔽,就像我在ESP32上的每个引脚上并联连接公头所做的那样。我为Vin、Gnd、D21和D22等引脚添加了一些额外的公头,因为这些引脚使用最多。尽管连接非常简单,但我将它们写在下面以便于理解。温度和湿度传感器仅使用一个数字引脚进行通信(将连接到引脚D5),而其他两个传感器使用I2C通信,因此它们都将连接到ESP32上的D21(SDA)和D22(SCL)引脚.DHT温度和湿度传感器的连接:Vcc(红色)→ESP32上的Vin接地(黑色)→ESP32上的接地NC(白色)→未连接SIG(黄色)→ESP32上的D5BMP180气压传感器的连接:Vcc(红色)→ESP32上的Vin接地(黑色)→ESP32上的接地SDA(白色)→ESP32上的D21SCL(黄色)→ESP32上的D22SI1145阳光传感器的连接:Vcc(红色)→ESP32上的Vin接地(黑色)→ESP32上的接地SDA(白色)→ESP32上的D21SCL(黄色)→ESP32上的D22示意图-ESP32气象站.pdf第2步:清理布线完成连接后,我将所有传感器和ESP32用一些双面胶带放在一块硬板上,然后用胶带清理布线,使它看起来很整洁。第3步:代码从下面下载此项目的代码并在您的ArduinoIDE中打开它。Code_ESP32_Weather_Station.ino第4步:在ArduinoIDE上设置ESP32如果您是第一次使用ESP32,则默认情况下不会在ArduinoIDE上添加它。所以为了让它与ArduinoIDE兼容,我们需要先将它添加到IDE中。如果您之前已经将ESP32与ArduinoIDE一起使用,则可以跳过此步骤。首先去官方的Espressif文档并复制稳定的发布链接。我在下面提到了它,所以你也可以从这里复制https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json现在在您的ArduinoIDE上:转到文件>首选项在“其他董事会经理URL”下粘贴上面复制的链接如果已经提到了其他链接,请用逗号分隔此链接和其他链接点击确定现在转到工具>董事会>董事会经理在搜索栏下,输入ESP32并回车您将看到EspressifSystems的ESP32点击它下面的安装点击关闭现在,如果您转到Tools>Board,您现在将能够看到添加的所有ESP32变体。第5步:安装所需的库为了使我们的代码正常工作,我们必须安装必要的库。现在去Sketch>IncludeLibrary>ManageLibraries在搜索栏中输入“Blynk”并安装VolodymyrShymanskyy的Blynk库同样下载以下库:Adafruit的DHT传感器库SeeedStudio的Grove气压计传感器SeeedStudio的Grove阳光传感器第6步:创建Blynk帐户转到blynk.io并创建一个新帐户或直接登录已有账户。第7步:创建新模板完成登录后,它会显示“首先创建您的第一个模板”,因此单击“新建模板”。在名称下,您可以输入任何内容。我将其命名为“气象站”在“硬件”下选择ESP32在“连接类型”下选择WiFi如果需要,您还可以添加描述点击“完成”现在您将看到提供的唯一模板ID和名称第8步:创建数据流要从ESP32接收Blynk上的数据,您必须创建数据流。首先转到“数据流”在“新数据流”下选择“虚拟引脚”第一个数据流被命名为“温度”在引脚下选择“V0”数据类型将是“双”,因为我们收到带小数位的准确值单位为摄氏度(°C)“最小值”可以保持为0,“最大值”可以保持为100在“小数”下选择“#.##”,因为我们希望我们的值最多保留2个小数位默认值可以保持为0点击“创建”现在同样我们需要添加5个其他数据流:湿度:引脚-V1数据类型-双单位-百分比(%)最小值-0最大值-100小数点-#。##默认值-0压力:引脚-V2数据类型-双单位-无(因为毫巴不可用)最小值-0最大值-2000小数点-#。##默认值-0可见光:引脚-V3数据类型-双单位-无最小值-0最大值-300小数点-#。##默认值-0红外辐射:引脚-V4数据类型-双单位-无最小值-0最大值-300小数点-#。##默认值-0紫外线指数:引脚-V5数据类型-双单位-无最小值-0最大值-300小数点-#。##默认值-0添加所有这些数据流后,单击保存。第9步:配置Web仪表板:添加标签WebDashboard是显示所有数据的地方。我们可以将许多类型的小部件添加到WebDashboard-一些用于显示数据,一些用于提供信号首先我们必须放置一个标签将其拖放到仪表板上你甚至可以调整它的大小现在为每个值再放置5个标签小部件要配置小部件,请单击其上的齿轮图标第一个将被命名为温度然后选择数据流(从中获取并显示数据)作为温度(V0)您可以探索其他几个选项您可以设置标签颜色并根据值进行更改您可以选择“显示级别”,它将在标签旁边显示温度级别完成后点击保存现在对其他5个标签重复相同的过程只需为相应的标签选择正确的数据流第10步:配置Web仪表板:添加图表现在我们已经完成了标签,我们可以添加图表来查看过去的数据。拖放图表小部件在免费版Blynk中,我们无法在同一张图表上显示2个不同的数据流,因此我们需要为所有值添加6个不同的图表配置图表也类似,只需选择正确的数据流选择图表颜色选择图表类型,例如线条、面积、柱形或阶梯线如果需要,打开“显示Y轴”和“自动缩放”点击保存对所有其他图表重复相同的操作现在我们的WebDashboard已经完成,我们可以点击Save。请记住,它现在显示的值将是完全随机的。这只是为了显示一些示例数据。第11步:创建新设备配置模板后,现在我们将添加我们的设备。操作步骤:首先转到左侧的“搜索”点击“新设备”选择“从模板”选择我们创建的模板(在我的例子中是气象站)设备名称可以根据您的选择保留(我保持与模板名称相同)点击创建现在我们的设备已经创建,但它会显示离线,因为它仍然没有连接第12步:将凭证复制到代码中创建设备后,您将在页面右上角看到一些凭据。这些是:模板编号设备名称身份验证令牌将它们一一复制,并在各自位置的代码中替换它们。在#defineBLYNK_TEMPLATE_ID之后,在“”下添加您的模板ID在#defineBLYNK_DEVICE_NAME之后,在“”下添加您的设备名称下charauth[]="";在“”下添加您的身份验证令牌下charssid[]="";在“”下添加您的WiFi名称(SSID)下charpass[]="";在“”下添加您的WiFi密码第13步:设置DHT传感器类型可能需要在代码中再做一点小改动。如果您使用的是DHT11或DHT21温度和湿度传感器而不是DHT22(默认设置),请取消注释相应的行。例如,如果您使用的是DHT11:#defineDHTTYPEDHT11//#defineDHTTYPEDHT22//#defineDHTTYPEDHT21如果您使用的是DHT21://#defineDHTTYPEDHT11//#defineDHTTYPEDHT22#defineDHTTYPEDHT21如果您使用的是DHT22,请不要进行任何更改!第14步:将代码上传到ESP32使用Micro-USB电缆将ESP32连接到PC。在工具中选择正确的板子和com端口。板取决于您使用的是什么型号的ESP32,比如我的是ESP32开发套件。最后,点击上传。一旦显示“正在连接...”,请按住ESP32上的启动按钮几秒钟然后松开。它应该就可以成功上传了。第15步:测试和故障排除上传完成后:打开串行监视器将波特率设置为115200按下ESP32上的重置按钮如果已成功连接到WiFi,您应该会看到串行监视器上显示Blynk徽标如果未连接,请检查您是否在代码中正确输入了WiFi凭据以及AuthToken、设备名称和模板ID现在回到Blynk仪表板您应该可以在线看到您的设备并且正确显示值如果某些值未正确显示,请首先编辑仪表板并检查您是否选择了正确的数据流如果仍然无法正常工作,请检查传感器连接并重新连接。为确保所有传感器都正常工作,您可以首先上传每个传感器的示例草图,以在串行监视器上显示值并逐个检查它们你可以看看上面的图片。就我而言,一切都像魅力一样运作。我什至让设备打开了几个小时,它没有任何连接问题。我附上了过去一小时和过去6小时的图表数据的一些图片。为了证明它确实有效,我将空气吹到温度和湿度传感器上。由于我们呼出的空气比周围的空气潮湿且温暖,因此您可以在其中一张图片中看到值的峰值。该图表还显示了温度和湿度的突然增加以及压力的一些下降,因为温度和压力成反比。第16步:设置移动仪表板在这里,我将解释如何将气象站连接到手机。这是完全可选的。首先从PlayStore/AppStore下载BlynkIoT应用程序使用您之前使用的相同凭据登录我们的设备将默认添加,因为它与网络同步,但我们仍然需要设置移动仪表板这几乎类似于设置Web仪表板如果您单击小部件框上屏幕的右上角,您将看到所有可用的小部件以及一些新的小部件,以及网络仪表板中不存在的一些小部件我们对标签值感兴趣,因此选择它,将其放在仪表板上并根据需要调整大小现在再放5个单击标签进行配置,并遵循与WebDashboard相同的过程在这里您可以在显示的值之前和之后添加文本,因此我在值之后添加了相应的单位如果需要,您还可以添加超级图表同样,对于免费版本,您只能在图表中显示一个数据流您甚至可以编辑过去数据的范围,例如15分钟、30分钟、1小时等。第17步:测试移动仪表板如果您的设备已打开并且您已正确完成所有操作,您将看到显示的所有值。该应用程序有一些错误,例如它会自动删除小部件名称和数据流,因此请继续检查。该应用程序在黑暗模式下也能正常运行。第18步:结论了解工作原理后,您可以尝试在此项目中添加更多传感器(例如风速传感器、雨量传感器等)。这并不难。你只需要更多的虚拟别针,你将不得不添加更多的标签和图表。您还可以添加LCD显示屏以在设备本身上显示数据。如果您购买高级版Blynk,数据也可以存储在云端。如果您有任何疑问,可以在下面发表评论或给我发送电子邮件:
[email protected]以上内容翻译自网络,原作者Saiyam,如涉及侵权,请联系删除。
项目说明AutoBill是一个人工智能驱动的零售商店自动结账系统,它结合了计算机视觉和机器学习的力量,提供了令人惊叹的购物体验。AutoBill提供更快的结账购物体验,以最大限度地减少商店中的人际互动,从而在大流行期间保证购物者和员工的安全。AutoBill使用计算机视觉和机器学习来视觉检测并立即识别放置的物品,重量传感器测量放置在台面上的物品的重量。一旦物品被识别,物品就会自动添加到购物车中,并立即生成账单。生成支付二维码,用户可以通过扫描二维码支付账单设备特点人工智能驱动即时结账无接触结账易于部署演示视频硬件组件树莓派3B型×1种子重量传感器(称重传感器)0-3kg×1SparkFun称重传感器放大器-HX711×15V2A电源×1REES525百万像素160°广角鱼眼相机×1WS2812BRGB灯条×1DCPOWERJACK2.1MM桶式PCB安装座×1胶合板×1工具清单钳子激光切割机(通用)剥线钳和切割机,18-10AWG/0.75-4mm²容量电线烙铁(通用)运行流程让我们看一下AutoBill的逻辑流程。物体检测EdgeImpulse是领先的边缘设备机器学习开发平台之一,对开发人员免费,并受到企业的信赖。在这里,我们正在使用机器学习来构建一个可以识别商店中可用产品的系统。然后我们将系统部署在RaspberryPi3B上。数据采集要制作机器学习模型,拥有大量产品图像非常重要。在训练模型时,这些产品图像用于让模型区分它们。确保您拥有商店中提供的各种角度和缩放级别的产品。对于数据采集,您可以从任何设备或开发板上捕获数据,或上传您现有的数据集。所以在这里我们正在上传我们现有的数据集。对于上传,只需转到数据采集选项卡并选择一个文件。然后将其标记并上传到培训部分。EdgeImpulse只接受JPG或PNG图像文件。如果您有任何其他格式,只需使用在线转换器将其转换为JPG或PNG格式。因此,我们上传了所有带有AppleLays和Coke等四个不同标签的数据。所以系统只会在结账时识别这些对象。如果您想识别除这些之外的任何其他对象,您需要上传它们的数据集。在这里,我们为每个对象上传了大约40张图片。神经网络需要学习数据集中的模式,数据越多越好。标签数据标记队列向您显示数据集中所有未标记的数据。标记对象就像在对象周围拖动一个框并输入标签一样简单。为了让生活更轻松,我们尝试通过在后台运行对象跟踪算法来自动化这个过程。如果您在多张照片中有相同的对象,我们可以为您移动盒子,您只需要确认新盒子。拖动框后,单击保存标签并重复此操作,直到标记整个数据集。设计脉冲有了训练集,您就可以设计一个脉冲。脉冲获取原始数据,调整图像大小,使用预处理块来处理图像,然后使用学习块对新数据进行分类。预处理块总是为相同的输入返回相同的值(例如将彩色图像转换为灰度图像),而学习块从过去的经验中学习。对于这个系统,我们将使用“图像”预处理块。该块接收彩色图像,可选地使图像灰度化,然后将数据转换为特征数组。然后我们将使用“迁移学习”学习块,它将所有图像都输入并学习区分两个(“咖啡”、“灯”)类。在工作室中转到创建脉冲,将图像宽度和图像高度设置为96,将“调整大小模式”设置为适合最短轴,并添加“图像”和“对象检测(图像)”块。然后点击保存冲动。然后在图像选项卡中,您可以看到每张图像的原始特征和处理后的特征。您可以使用选项在“RGB”和“灰度”模式之间切换,但现在,将颜色深度接下来您需要:调整所有数据的大小。对所有这些数据应用处理块。创建完整数据集的3D可视化。单击生成功能以启动该过程。之后将加载“功能浏览器”。这是数据集中所有数据的图。因为图像有很多维度(这里:96x96x3=27648个特征),我们在可视化之前在数据集上运行一个称为“降维”的过程。在这里,27648个特征被压缩到只有3个,然后根据相似度进行聚类。即使我们的数据很少,您也可以看到集群形成,并且可以单击这些点来查看哪个图像属于哪个点。处理完所有数据后,就该开始训练神经网络了。神经网络是一组算法,松散地模仿人脑,旨在识别模式。我们在这里训练的网络将图像数据作为输入,并尝试将其映射到三个类之一。从头开始构建一个良好的工作计算机视觉模型非常困难,因为您需要各种各样的输入数据才能使模型很好地泛化,并且在GPU上训练此类模型可能需要数天时间。为了使这更容易和更快,我们正在使用迁移学习。这使您可以搭载经过良好训练的模型,只重新训练神经网络的上层,从而生成更可靠的模型,这些模型可以在很短的时间内进行训练,并且可以使用更小的数据集。要配置迁移学习模型,请单击左侧菜单中的对象检测。在这里,您可以选择基本模型(默认选择的模型将起作用,但您可以根据您的大小要求进行更改),并设置网络学习的速率。保持所有设置不变,然后单击Starttraining。模型完成后,您将在训练输出下方看到准确度数字。我们现在已经训练了我们的模型。随着模型的训练,让我们在一些测试数据上进行尝试。在收集数据时,我们将数据分为训练数据集和测试数据集。该模型仅在训练数据上进行训练,因此我们可以使用测试数据集中的数据来验证该模型在现实世界中的运行情况。这将帮助我们确保模型没有学会过度拟合训练数据,这是一种常见的情况。要验证您的模型,请转到模型测试并选择Classifyall。在这里,我们达到了93.75%的精度,这对于数据如此少的模型来说非常棒。要详细查看分类,请单击项目旁边的三个点,然后选择显示分类。这会将您带到实时分类屏幕,其中包含有关文件的更多详细信息(您也可以从此处直接从开发板捕获新数据)。此屏幕可以帮助您确定项目被错误分类的原因。通过设计、训练和验证的冲动,您可以将此模型部署回您的设备。这使得模型在没有互联网连接的情况下运行,最大限度地减少延迟,并以最低的功耗运行。EdgeImpulse可以将完整的脉冲(包括预处理步骤、神经网络权重和分类代码)打包到单个C++库或模型文件中,您可以将其包含在嵌入式软件中。树莓派3BRaspberryPi3B是非常成功的信用卡大小的计算机系统的强大开发。该设备的大脑是RaspberryPi。所有主要过程都由该设备执行。如果您不知道如何设置Pi,请前往此处。要在EdgeImpulse中设置此设备,请运行以下命令:curl-sLhttps://deb.nodesource.com/setup_12.x|sudobash-sudoaptinstall-ygccg++makebuild-essentialnodejssoxgstreamer1.0-toolsgstreamer1.0-plugins-goodgstreamer1.0-plugins-basegstreamer1.0-plugins-base-appsnpmconfigsetuserroot&&sudonpminstalledge-impulse-linux-g--unsafe-perm如果您有RaspberryPi摄像头模块,您还需要先激活它。运行以下命令:sudoraspi-config使用光标键选择并打开接口选项,然后选择摄像头并按照提示启用摄像头。然后重启树莓派。设置好所有软件后,将相机连接到RaspberryPi并运行。edge-impulse-linux这将启动一个向导,要求您登录并选择一个EdgeImpulse项目。如果要切换项目,请使用--clean运行命令。就这样!您的设备现在已连接到EdgeImpulse。要验证这一点,请转到您的EdgeImpulse项目,然后单击Devices。该设备将在此处列出。要在本地运行您的冲动,只需再次连接到您的RaspberryPi,然后运行。edge-impulse-linux-runner这将使用全硬件加速自动编译您的模型,将模型下载到您的树莓派,然后开始分类。在这里,我们使用LinuxPythonSDK将模型与系统集成。要使用PythonSDK,您需要拥有最新版本的Python(>=3.7)要安装Raspberrypi的SDK,您需要运行以下命令。sudoapt-getinstalllibatlas-base-devlibportaudio0libportaudio2libportaudiocpp0portaudio19-devpip3installedge_impulse_linux-ihttps://pypi.python.org/simple要对数据进行分类,您需要一个模型文件。我们已经训练了我们的模型。此模型文件包含所有信号处理代码、经典ML算法和神经网络-通常包含硬件优化以尽可能快地运行。要下载模型文件,请运行以下命令。edge-impulse-linux-runner--downloadmodelfile.eim这会将文件下载到modelfile.eim。摄像头模组在这里,我使用REES525百万像素160°广角鱼眼相机进行物体检测。由于其高视角,它可以覆盖比普通相机模块更多的区域。该摄像头模组的主要特点是Omnivision5647传感器在一个定焦模块中。该模块通过15针带状电缆连接到RaspberryPi,连接到专用的15针MIPI相机串行接口(CSI)。CSI总线具有极高的数据速率,并且专门将像素数据传输到BCM2835处理器。传感器本身具有5兆像素的原始分辨率,并具有板载定焦镜头。该相机支持1080p@30fps、720p@60fps和640x480p60/90视频录制,最新版本的树莓派首选操作系统Raspbian也支持它。为了将相机模块连接到Raspberrypi,我们使用了18英寸柔性电缆。树莓派和摄像头模块之间有相当大的距离。重量传感器(称重传感器)在这里,我们使用的是电阻式称重传感器。电阻式称重传感器根据压阻原理工作。当向传感器施加负载/力/应力时,它会改变其电阻。当施加输入电压时,电阻的这种变化会导致输出电压的变化。电阻式称重传感器是通过使用附有多个应变仪的弹性构件(具有非常高度可重复的偏转模式)制成的。在这里,我们使用的称重传感器有四个应变计,它们粘合到称重传感器的上表面和下表面。当负载施加到电阻式称重传感器的主体上时,如上所示,弹性构件如图所示发生偏转,并由于施加的应力而在这些位置产生应变。结果,其中两个应变仪处于压缩状态,而另外两个处于拉伸状态。在测量过程中,重量作用在称重传感器的金属弹簧元件上并引起弹性变形。该应变(正或负)通过安装在弹簧元件上的应变仪(SG)转换为电信号。最简单的称重传感器类型是带有应变仪的弯曲梁。我们使用惠斯通电桥电路将这种应变/电阻变化转换为与负载成比例的电压。四个应变仪配置为惠斯通电桥配置,四个独立的电阻器连接,如所谓的惠斯通电桥网络所示。激励电压——通常是5V施加到一组角上,并测量其他两个角之间的电压差。在没有施加负载的平衡状态下,当四个电阻值紧密匹配时,电压输出为零或非常接近零。这就是为什么它被称为平衡桥电路。当应变仪连接到的金属构件受到力的作用时,产生的应变会导致一个(或多个)电阻器的电阻发生变化。电阻的这种变化会导致输出电压的变化。在将小的毫伏级信号仔细放大为更高幅度的0-5V信号后,可以测量和数字化输出电压的这种微小变化(通常为响应满负载的总变化的20mv左右)。HX711舷外机HX711模块是称重传感器放大器分线板,可让您轻松读取称重传感器以测量重量。本模块采用24片高精度A/D转换芯片HX711。它专为高精度电子秤设计,具有两个模拟输入通道,内部集成128倍可编程增益放大器。输入电路可配置为提供桥式压力桥(如压力、称重传感器模式),是一种高精度、低成本的理想采样前端模块。HX711是一款IC,可让您轻松地将称重传感器集成到您的项目中。无需任何放大器或双电源,只需使用此板,您就可以轻松地将其连接到任何微控制器以测量重量。HX711使用两线接口(时钟和数据)进行通信。与其他芯片相比,HX711增加了高集成度、快速响应、抗扰度等优势,提高了整体性能和可靠性。最后,它是电子爱好者的最佳选择之一。该芯片降低了电子秤的成本,同时提高了性能和可靠性。它的规格是差分输入电压:±40mV(满量程差分输入电压为±40mV)数据精度:24位(24位A/D转换芯片。)刷新频率:10/80Hz工作电压:2.7V至5VDC工作电流:尺寸:24x16mm校准按照原理图将称重传感器、HX711模块连接到树莓派,并在树莓派中运行calibration.py代码。然后你会得到你自己的称重传感器的比率,然后把你的主要代码放进去。每个称重传感器的比率在不同的场合会有所不同。下面是我对称重传感器的校准。所以用我的称重传感器称重是90%准确的。为了使用HX711连接称重传感器和树莓派,我使用了MarcelZak的代码片段。你可以在这里找到他的存储库。WS2812BRGBLED灯条WS2812B5V可寻址RGB防水LED灯条非常灵活,易于使用,灯条的每个LED都可以使用微控制器单独控制。每个LED都配备了一个集成驱动器,可让您独立控制每个LED的颜色和亮度。为了点亮系统中的商品,我们使用了这个RGBLED灯条。这些灯条上的组合LED/驱动器IC是极其紧凑的WS2812B(本质上是直接集成到5050RGBLED中的改进型WS2811LED驱动器),可实现更高的LED密度。WS2812B使用专用的单线控制接口,需要严格的时序。电源供应在这里,我们使用了一个5V2A的电源为整个项目供电。我们还使用了直流电源插孔来插入此适配器。收银台搭建我使用了4块具有以下尺寸的胶合板。这些胶合板用100号砂纸打磨以获得光滑的表面。为了将称重传感器放置在胶合板上,我在正确测量组件空间后用钻头在木头上打了必要的孔。这些胶合板是用钉子制成的。给橱柜上底漆后,我用木材填充物来填充橱柜中的空隙。最后为橱柜涂上缎面漆。固定组件最初,我们在螺母和螺栓的帮助下将称重传感器安装在机柜上。称重传感器的一端应刚性连接,另一端应漂浮在空中,这样我们才能得到合适的物体重量。然后我们通过安装将称重传感器连接到HX711分线模块。然后我们通过它附近的一个孔从HX711模块中拉出电线。然后我们将摄像头模块安装在称重传感器的另一面。然后我们将LED灯带平行于相机模块。然后将这些条平行连接。相机模块的柔性电缆和条带上的电线被拉出。为了放置树莓派,我们使用了一个白色的黑盒子。然后用螺丝固定在柜子上。我们还在白盒上制作了必要的孔,用于将组件与树莓派连接起来。首先,我们将直流电源插孔连接到盒子中。然后我们连接树莓派并按照原理图连接整个组件。然后我们盖上盖子。然后固定底座。在这里,我们使用基片作为切割适当尺寸的亚克力板。最终成品是这样的。结账界面结账界面有两部分,前端使用HTML、JS开发,使用NodeJS和Express开发的后端API1.前端使用HTML、JS开发前端不断检查后端API中发生的更改并将更改显示给用户。将商品添加到API后,前端将显示为添加到购物车的商品。2.使用NodeJS和Express开发的后端API后端RESTAPI是使用NodeJS和Express开发的。ExpressJS是Node.js最流行的HTTP服务器库之一,它带有非常基本的功能。后端API保留直观识别的产品详细信息。为了设置我们的界面,我们使用了一个带有小支架的触摸界面的小型平板电脑。后续改进计划生成数字收据保留交易历史屏幕促销和优惠集成多个商店以便于分析定制零件和外壳-3D模型原理图-带称重传感器和LED灯条的RPI原理图-带摄像头模块的Rpi完整代码感谢您的关注。以上内容翻译自网络,原作者Nekhil(CEO@CodersCafe),如涉及侵权可联系删除。
本方案是一种室外摄像头,可计算通过的流量并记录其速度和方向。介绍嗨-我住在路边。这是一条乡村小路,但在我看来,随着通勤交通的增加,它每年都变得越来越繁忙,而且大部分交通都超过了限速。但我无法证明。所以我决定建立自己的交通摄像头并进行自己的监控。我的房子在一个村庄的边缘,所以位于30英里/小时的速度限制内......只是。在道路上约50米处,限速增加到60英里/小时。如果接近的车辆以超过30英里/小时的速度行驶,则有限速路标和另一个在明亮的LED灯中闪烁30的标志,但是虽然许多人遵守限速,但很多人不这样做,许多人只是忽略了它。准确判断超车速度并不总是那么容易,但我估计大多数人都将我家前面的道路用作加速或减速区域。但我又无法证明。地方当局通常通过在马路对面铺设两条橡胶条来进行交通和速度调查。它们充满空气,路边的传感器检测轮胎压缩空气空间时气压的变化。相距已知距离的两条带可让您计算出速度。这不是我的选择。我打算建造一些半永久性的东西来监控交通数月,我不想冒险给道路使用者带来任何滋扰或危险。所以我的要求是建立一个可靠的、长期的方法来测量我家门前的交通量和速度。另一个要求是确定可能证明有趣的行进方向。拍摄过往车辆的照片是一种奖励,但不是必需的。简而言之,我最终使用RaspberryPi和相机构建了一个解决方案。我找到了Greg的网站,该网站解决了类似的挑战,他的代码构成了这个项目的基础。我根据自己的情况修改了它并让它运行。一年后,我现在可以看到每天的交通波动,有多少司机遵守限速,并计算每天有多少车辆通过。最近,它证实了由于冠状病毒的爆发导致的流量大幅下降,以及尽管封锁仍然存在,但流量逐渐增加。自从我完成项目以来,我已经写了一年多,这并不理想;我应该在构建项目时编写它。我现在知道得更好了,但封锁让我有时间把它写下来。但是,我确实在构建过程中保留了一些笔记,现在我的目标是将这些笔记和照片转换为更易于阅读的内容,以帮助其他人构建类似的项目。该项目的性质非常技术性,对我来说有点令人生畏,但不要让这让你失望。虽然我接触过Pis和Arduinos,但我不会认为自己是大师。这是我使用Pi的第一个合适的项目。我过去写过代码,但不会认为自己是现代软件开发人员,因为我的编码技能没有跟上。编码没有什么特别困难的,尽管可能很难完全理解为什么即使有评论我也在做某些事情。所以我在这个网站上添加了一个部分来解释每个部分的目的。大部分时间都花在理解现有的代码库上,然后根据我的目的对其进行修改,这证明了最有趣的部分。如您所见,我在此过程中遇到了一些具有挑战性的问题需要解决。您将需要针对您的特定情况更改代码中的某些设置。背景调查所以基本的需求是建立某种摄像头,可以计算交通流量并计算出经过的车辆的速度和方向。更复杂的是,我房子的前面与路边不平行,道路大约是。10米开外。我的房子和道路之间还有一条人行道(人行道)和一块草地,所以会有一些行人在车辆和相机之间经过,但我们在这里不是很忙……也许是奇怪的遛狗者/跑步者,尤其是在美好的日子.我很快专注于使用基于计算机的视觉进行车辆识别的相机解决方案。所以格雷格住在北纬40度左右的俄亥俄州,我的印象是他主要关心的是几个人的速度,但他并不关心交通量,也不想在晚上记录数据。我住在苏格兰北纬56度左右,冬天下午4点左右天黑了,那是通勤高峰时间之前。没有路灯,所以如果我要获得任何可靠的长期数据,我需要一个可以在黑暗中工作的解决方案。我最初的想法是使用红外相机解决这个问题,实际上我购买了PiIR相机,尽管我认为我可以只使用普通的Pi相机,正如我将解释的那样。这不是热感应红外传感器,因此您需要一个红外光源来照亮您的拍摄对象。挑战是用10米外的红外灯照亮这条路。我已经有一个内置2个红外灯的IP安全摄像头,所以我测试了Pi的红外摄像头,看它是否可以从IP摄像头提供的红外灯在黑暗中“看到”。结果太暗而无法使用。这可能是因为Pi摄像机设置的红外波段与我的IP摄像机提供的红外波段不同,但效果不佳。我考虑过购买大型IR泛光照明器,但它们并不十分微妙,使用相当大的功率并且会增加所需的布线、更多的费用和另一件出错的事情。当时我并不确定该解决方案是否可行,因此我不想为无法重复使用的东西承担费用。然后我意识到无论如何我真的不需要在黑暗中看到。在这个国家,当您在夜间开车时,必须打开车灯,这是一个很方便的法律要求。现代汽车往往会稍微侧向漏光,以便为驾驶员提供更广阔的视野。如果我能检测到前大灯的运动,那会起作用吗?Greg的代码使用了优秀的OpenCV软件。算法寻找运动的斑点,白天会在整个车辆周围放一个盒子。但是在夜间它看不到大部分车辆,只能看到汽车前后的灯,因此每辆车显示两个框。我只想跟踪其中一个。如果您知道现在是夜间,那么您可以调整OpenCV参数以检测较小的前灯并仍然计算出车速。你怎么知道天黑了?好吧,您有一台可以测量整体光照水平的相机,因此您可以根据该光照水平调整检测设置。还有两辆车同时从镜头前经过的问题。这种情况确实会发生,但并不经常发生,当它发生时,程序可能会超时等待汽车通过,或者您可以获得负速度并忽略它。这将导致交通量报告不足,但总比报告过多车辆和危及数据可信度要好。我很早就意识到我必须把相机放在外面。将摄像机安装在室内会导致窗户反射,从而导致错误检测。请记住,我的房子与道路不平行,相机必须与道路平行安装才能进行数学运算。因此,室内摄像机会受到反射的严重影响。这给了我两个额外的问题需要解决:1)如何为Pi提供电源和数据;2)当相机朝南时,如何保护Pi免受苏格兰冬天的雨、雪、风和夏日的酷热。为了解决第一个问题,我直接选择了以太网供电(PoE)。我已经有一个NetgearPoE以太网交换机,所以这是显而易见的解决方案,并且可以使用支持PoE的RaspberryPi帽子。这意味着我只需要将一根以太网电缆从交换机连接到Pi,就可以对数据和电源进行分类。我决定把它贴在我家门前的栅栏柱上。我可以轻松地将以太网电缆连接到它,它为防震图像提供了一个坚固的支架。至于防风雨,我找到了一家名为naturebytes.org的公司,该公司为Pi制作了一个案例。它针对野生动物项目,是向孩子们介绍整个Pi事物并对大自然产生兴趣的好方法。它看起来是理想的解决方案,并且已经证明可以胜任这项工作,尽管我用粗糙的木制围栏对其进行了补充,以保持最恶劣的天气并为相机提供额外的遮阳。该外壳可以单独购买,也可以作为套件的一部分购买,包括Pi、相机和其他部件,例如我不需要的电池和PIR传感器。说明可以下载,写的很好。即便如此,我也必须进行一些修改,我将在下一节中解释这些修改。老实说,我不相信Pi能存活那么久。我把电子产品放在外面一个不密封的盒子里,并试图在潮湿的冬天保持干燥,在夏天保持凉爽。然而,当我写这篇文章时,我已经16个月了,没有任何错误。由于房屋断电,导致程序无法自动重启,但这是一个软件问题。硬件工作顺利。对RaspberryPi、PoE帽子和NatureBytes外壳的质量赞不绝口。集会该案例需要进行一些修改。Naturebytes项目设计为由内部电池组供电并保持良好密封。显然,这对短期来说是可以的,但不符合我的要求。我担心设备在夏天过热。在一些测试中,当有大量通过的流量时,我会监测内部温度,并且内部温度变得非常高——这是一个忙碌的小CPU,正在执行所有计算机视觉智能操作。添加一些夏天的阳光,如果没有额外的冷却,Pi会关闭以停止它自己做饭。表壳背面有一个孔,橡胶垫圈朝向表壳顶部。这提供了一种让内部空间通风的好方法——毕竟热量会上升。我在洞上放了一些纱布,以减少可能爬进去的虫子的数量,然后在纱布上放了一个5伏的小风扇。稍后当我解释它是如何控制的时,会详细介绍风扇。外壳带有一个内部安装卡,相机和Pi安装在该卡上。相机在它的前面,而Pi在另一个。Naturebytes说明显示安装的Pi顶部面向机箱正面,但我想最大限度地增加PoE帽和PiCPU周围的气流,所以我将其翻转过来,使Pi的顶部面向机箱的背面你在照片中看到的情况。下一个问题是提供的用于将Pi连接到安装板的螺丝不够长,无法增加PoE帽子的额外高度。因此,我将提供的15毫米垫片缩短到5到8毫米之间,这样可以在pi相机螺母上提供足够的间隔,但允许固定PoE和Pi的螺钉工作。非常小心,相机螺母不要使Pi背面的任何电路短路!由于我使用了风扇孔的电缆入口,我不得不为LAN电缆钻一个新孔。通过使其与原始尺寸相同,我可以重复使用外壳随附的索环,以帮助减少任何水分/虫子进入。由于风扇设置为将热空气吹出机箱,因此我需要某个地方让空气进入机箱;我在箱子底部钻了四个小孔。如果有任何水进入,这些也将用作排水孔。我再次用纱布覆盖这些孔以尽量减少错误进入。纱布是用胶水粘在一起的。摄像机安装在现有的立柱上,立柱的正面与我家的正面平行,因此与道路不平行。我在机箱底部添加了一个从旧户外灯遗留下来的枢轴安装座,以便我可以调整相机的角度,使其垂直面对道路。箱子是亮绿色的,虽然在野生动物的情况下可能没问题,但在我家的前面看起来确实很明显。此外,我想改进外壳的防风雨和遮阳功能。所以我用一个前面有一个洞的木箱把箱子围起来,这样相机就不会被遮挡了。盒子没有帮助通风的底座,直接固定在柱子上而不是盒子上;因此盒子和外壳是独立安装的,这意味着来自鸟类、松鼠或好奇的孩子的振动甚至大雨都不会模糊相机图像。最后,我在盒子顶部钉了一些防潮层,以防止雨水渗入盒子区域,并将其涂成白色以反射夏日阳光的热量。后来我发现相机的自动曝光受到天空亮度的严重影响。这导致经过的车辆的图像非常暗。该解决方案与许多风景摄影师使用的解决方案相同。他们使用非常昂贵的分级过滤器;我用了一块鸭胶带。设置树莓派在运行一行代码之前,您需要在Pi上安装Raspbian。Greg在Jessie上记录了他的构建-我使用了Stretch(版本9),当前的最新版本是Buster,如果您运行的是Pi4,则需要它。Greg使用的是RaspberryPi2。我使用的是RaspberryPi3型号B+,它具有更快的处理器。网上有很多地方涉及安装Raspbian,所以我不会再创建另一个。OpenCV当我构建PI时,我使用OpenCV3进行Stretch并遵循AdrianRosebrock提供的出色说明。如果您想进入计算机视觉领域,这绝对是一个不错的起点。我专注于让我的测速相机工作,所以不会深入研究计算机视觉的细节——我只是想要一些有用的东西。OpenCV的安装和编译确实进行了多次尝试,但经过一些坚持,我让它工作了。现在有一个OpenCV4,安装过程更简单。所以总而言之,我在Pi3B+上使用Python3.5.3和OpenCV3.4.5和RaspbianStretch。计划概述正如我之前提到的,最好查看Greg的网页,他详细解释了他的代码。我会为我做同样的事情,并专注于我对Greg的原始代码进行更改的地方。但首先我认为在深入了解细节之前先概述一下程序的工作原理是个好主意。基本原理是程序将检测在定义的框架内移动的对象。我们不会检测整个图像的移动,而只会检测我们知道交通将通过的定义区域。我们希望这个区域在车辆的运动方向上尽可能长,即一个广阔的区域。高度不那么重要,但您要确保它能够照亮车辆的灯光。例如,通过限制检测运动的区域,我们可以让Pi免于做不必要的工作,并减少空中鸟类错误检测的机会。如果它检测到多个对象,则它选择最大的一个。在下图中,您可以看到两个绿色竖条,它们分别标记了监控区域的左右范围。使用Pi摄像头的视野角(Pi摄像头2为62.2度)以及道路与摄像头之间的距离以及一些三角函数,可以计算出道路与道路之间的距离处的每像素英尺数。相机。当车辆在图像上移动时,OpenCV会生成一系列帧,其中包含围绕它“看到”移动的对象的一组边界框。该代码计算出最大的框,并假设这是要跟踪的车辆。我们得到每个盒子左侧的x坐标。对于从右向左行驶的车辆,x坐标位于车辆前方;对于从左到右行驶的车辆,x坐标是边界框的后部,通常与车辆的后部重合,但如果车辆刚刚进入监控区域,则x坐标不是该区域,因为车辆的后部仍在该区域外.通过计算以像素为单位的框坐标中的运动,我们可以确定车辆在每一帧之间行驶的距离。该程序还记录了每一帧之间的时间,因此我们可以计算出车辆的速度。我修改了计算以允许两条车道的交通,每条车道与相机的距离都有自己的距离。当Greg编写他的程序时,他发现Pi2正在努力捕捉足够的帧来确定速度。他通过在车辆经过时关闭相机图像显示的刷新来减少Pi处理器的负载,从而解决了这个问题。这具有奇怪的效果,即汽车从一侧进入图像,消失,然后在离开图像之前重新出现。有时,当他们开得非常快时,您甚至看不到车辆进出,尽管图像和数据仍被记录下来。这在具有更快处理器的Pi3上可能不是必需的,但我没有改变它,因为它似乎是一种避免Pi过热的好方法,还提高了捕获更多帧的机会并导致更准确的速度.无法看到移动车辆的图像是'大问题;该单元大部分时间都没有受到人工监控,只是记录数据。Greg的程序保存了每辆车的图像以及屏幕上显示的速度,您也可以将数据保存到CSV文件中。我的道路每天大约有2500辆车通过。那是很多图像文件占用存储空间。所以我定义了一个速度限制,超过这个速度就会记录图像。我也有经过的行人,因此有一个最低速度,低于该速度不会记录数据。有时,如果两辆车同时在摄像头前交叉,程序会感到困惑。这通常会导致缓冲区中出现负速度或未检测到任何内容。因此,车辆必须完成转换或程序重置是有时间限制的。夜视的修改在夜间测量速度的技巧是跟踪车辆的前灯。由于这些物体比您白天要跟踪的物体小,因此您必须修改“最小面积”参数。这控制OpenCV将围绕对象放置的最小框的大小。白天,您希望它足够大,以避免捡到鸟等。但在晚上(假设您没有路灯),没有其他可见的东西,因此您可以将最小区域降低到前灯大小。另一个要试验的参数是“阈值”。这是OpenCV用来通过像素亮度差异检测对象的数字。因此,低阈值将检测到更多对象,而高阈值将检测到更少对象。对于夜晚,我们只想检测与黑色具有非常高对比度的汽车前灯的强光,因此我们想设置一个高阈值级别。理想情况下,我们想要一个检测前白光而不是红色尾灯的值,但我发现车灯和天气条件的变化太大而无法实现这一点。当车辆接近摄像头时,它会首先检测到前灯,然后在它经过时尾灯进入视野。对于任何帧,如果在前灯离开监控区域之前尾灯看起来比后退的前灯大,程序将切换到跟踪尾灯而不是前灯。当这种情况发生时,该帧的速度计算变为负数;就好像汽车在几分之一秒内突然停下并倒车。因此,如果我们得到一系列正常速度值,然后是负值,我们可以非常确定它是尾灯。当这种情况发生时,程序停止跟踪,忽略最后一个负速度并记录到该点已记录的任何内容。这并不总是发生;这取决于前后灯的相对亮度,Greg的代码在监控区域的两端都有细长的像素带-在上图中标记为缓冲区。当在这些条带中检测到移动框的正面(图中红色显示)时,程序停止跟踪并执行保存图像和记录数据的步骤。当天黑时,相机必须增加传感器为每张图像曝光的时间长度。这是为了捕捉足够的光线来制作图像。尽管Pi相机没有物理快门,但它实际上是一个电子快门,只能打开传感器一段时间。在光线不足的情况下,曝光时间会变长,这导致车辆经过时捕获的帧更少。在黑暗中,车灯周围的移动盒子有可能穿过帧之间的缓冲区;尤其是在车辆快速移动的情况下。因此,数据永远不会保存,我们会丢失这辆车的任何记录。解决方法是增加监控区域两端的条带宽度。但是,我们想要从窄到宽一步到多少,我们什么时候这样做?我采取的方法是每分钟读取一次光度计读数,然后将该读数映射到缓冲区宽度(我在程序中称之为“调整后的保存缓冲区”)、阈值和最小面积的值。在对各种算法和值进行大量测试后,我最终使用了保存缓冲区的倒数函数曲线、最小面积的平方根曲线和阈值的简单步进值。其他变化我决定计算每帧记录的所有速度的平均值,而不是只计算最后一帧的速度。但是,我看到了交通从左向右移动的一致问题。第一次速读总是比随后的读数高得多。这显然影响了正在计算的平均速度。我花了很长时间才找出原因。当车辆从左侧进入监控区域时,前面的车辆首先进入,但整个车辆通常不会完全进入监控区域;因此,边界框将不会围绕车辆的整个长度。该程序计算每帧x坐标的变化为:但问题是“initial_x”中的值是第一帧边界框的左手角。这不是车辆的前部,而是车辆前部和后部之间的某个点。所以我改变了如下:initial_w是第一帧边界框的宽度,通常比车辆的全长短。此更改解决了问题。用法将Picamera指向道路。确保它垂直于交通方向。在运行carspeed.py之前,将常量L2R_DISTANCE和R2L_DISTANCE修改为从Pi相机镜头前部到从左到右车道和从右到左车道中间的距离。将MIN_SPEED_IMAGE修改为以mph为单位的最小速度以捕获图像。我通常将这个设置得相当高,因为我不想用我永远不会看到的汽车图像填满Pi的存储空间。将MIN_SPEED_SAVE修改为以mph为单位的最小速度以捕获CSV文件中的数据并传递给MQTT代理。我通常将其设置为大约10英里/小时,这样我就不会记录行人。修改MAX_SPEED_SAVE为记录的最大速度。有时,当两辆车交叉时,它会导致疯狂的速度数字。您可能还需要根据相机传感器的方向调整vflip和hflip以匹配相机的方向。从终端运行:python3carspeed.py-ulx64-uly321-lrx960-lry444。Greg的代码要求用户绘制矩形监控区域,但我绕过了这一点,而是更喜欢传入监控区域的坐标。这种方法的优点是每次运行程序时都会生成相同的一致监视区域。这也意味着程序可以在没有人工干预的情况下通过脚本启动,如果您希望它自动启动,例如断电后,这很方便。当汽车通过监控区域时,图像将按照图像中的速度写入磁盘,并记录时间、平均速度、方向、帧数和速度标准偏差。编码从导入必要的包开始:CV2是OpenCV库。我正在使用MQTT将数据传递到另一个Pi,但您不需要这样做。numpy用于均值和标准差计算,argparse用于解析传入的参数。接下来,直接从Greg的代码中复制了一些方法和函数:prompt_on_image:简单地格式化并在图像上显示一条消息。get_speed:根据给定时间内遍历的像素数返回速度(如果您使用的是米和公里而不是英尺和英里,则用3.6代替0.681818值。)secs_diff:返回两次之间的秒数。record_speed:将一行写入CSV文件。接下来添加了一些新功能:my_map:是一个简单的映射函数,我用它来将值的输入范围映射到输出范围,例如0-256映射到1到10。测量光线:使用OpenCV直方图函数获取图像的曝光表读数。接下来的几个函数都是夜间跟踪所必需的:get_save_buffer:返回一个数字,由输入的光照水平决定,用于定义监控区域两端的保存缓冲区的宽度。get_min_area:返回我们希望允许的最小框大小,并基于输入光级别。get_threshold:返回基于输入光级别的阈值。store_image:将帧缓冲区中最后一张图像的副本保存为jpg文件。store_traffic_data:将时间、平均速度、车辆方向、捕获的数据帧数量和标准偏差写入本地csv文件。数据还会发送到在另一个Pi上运行的MQTT服务器-您不必这样做。一些有用的常量。您将需要更改L2R_DISTANCE和R2L_DISTANCE。如果您正在监控单个车道,它们可能是相同的值。THRESHOLD和MIN_AREA是初始值或默认值。枚举值使程序更易于阅读。前三个监控跟踪进程WAITING、TRACKING、SAVING的当前状态。接下来的两个定义了图像上的移动方向。分配的值并不重要。TOO_CLOSE定义了两辆跟随车辆之间的最短时间(以秒为单位)。如果我们在0.4秒内检测到另一辆车,我们将忽略它。MIN_SAVE_BUFFER定义缓冲区的最小像素宽度,其中检测到最后一帧并启动数据保存。如果您发现正在跟踪车辆但帧经常落在保存缓冲区的任一侧,则可以增加此值。现在捕获定义受监控区域的传入参数。接下来确定帧宽度和每像素英尺并在屏幕上显示接下来我们需要初始化一堆变量并初始化相机。我们希望看到程序正在处理,因此创建了一个窗口并将其移动到显示器的左上角。稍后,我会将捕获的数据传递给另一个运行MQTT服务器的Pi。这确保数据不仅仅存储在本地客户端上。服务器名称和密码显然已从附加代码中删除。如果需要,创建CSV文件并放入一些列标题根据输入参数计算被监控区域的尺寸,并全部打印到命令窗口。最后,我们到了程序的核心。使用capture_continuous,程序会重复抓取一帧并对其进行操作。使用Capture_continuous以便Pi相机在一次捕获一帧时不进行所需的初始化过程。图像被裁剪到监控区域。使用pyimagesearch站点上讨论的逻辑,图像被转换为灰度和模糊。第一次通过时,程序将图像保存为base_image。然后使用Base_image与当前图像进行比较并查看发生了什么变化。此时,捕获图像和base_image之间的任何差异都由阈值图像中的白色斑点表示。请注意,对于第一次迭代,我们会获得曝光读数并相应地设置最小面积、阈值和保存区域缓冲区。接下来,程序使用findContours在阈值图像中查找最大的白色斑点。我们忽略小的白色斑点,因为它们可能是随机发生的,也可能代表穿过受监控区域的树叶或其他小物体。抓取图像和寻找运动的过程会一直持续到检测到运动为止。第一次检测到运动时,状态从WAITING变为TRACKING,并记录运动区域的初始值。我想在捕获所有帧后计算平均速度,因此我将计算出的速度存储在数组中。我也在计算帧数。我们捕获的帧越多,我们对计算出的速度就越有信心,但如果我们只有一帧,那么我们就无法计算平均值。car_gap是当前被跟踪车辆与最后一辆车之间的时间差。我计算出两辆车之间的最小时间间隔,前车的尾灯和后车的前灯被顺序检测并在30英里/小时、40英里/小时和50英里/小时的速度下被视为单独的车辆;对于我的相机设置,它达到了0.76s、0.56s和0.44s。我推断0.4秒的差距(TOO_CLOSE)应该是错误读数(例如检测到尾灯)。如果摄像机受到撞击或监控区域的照明发生剧烈变化,摄像机会认为存在运动,但通常不会检测到保存区缓冲区中的运动。因此,如果在设定的时间段后没有保存任何内容,它会重置。Greg使用了15秒的值,但我已经走了3秒,因为我的交通行驶得更快而且更忙,我不想错过下一辆车,因为我正在数到15。三秒也有助于消除行人和慢速骑行者的数据。在TRACKING状态下,处理第二个和后续带有运动的图像以查看运动区域的变化程度。位置变化的计算取决于运动方向。从右到左,包围运动区域的框的x值代表汽车通过监控区域时的前方。但是对于从左到右的运动,在整辆车进入监控区域之前,x值不会改变。随着越来越多的汽车进入监控区域,边界框变得越来越宽,直到边界框最终包围了汽车的后部。因此,汽车的前部是x+w,其中w是包围运动区域的边界框的宽度。一旦我们获得了汽车前部的当前位置,我们就可以计算从初始x位置的像素绝对变化。当前帧和初始帧之间的时间间隔提供已经过去的秒数。根据时间和距离,计算速度。如果计算出的速度是负数,那么我们假设有问题(例如,我们捡到了一个尾灯),放弃当前帧并强制它保存我们目前得到的帧。这个过程一直持续到运动区域的边界框到达监控区域的另一端。然后我们计算速度数组的均值和标准差,只要我们有两个以上的值。那时,日期、时间被写入图像,速度显示在图像的中心,图像被写入磁盘。如果速度高于所需限制但低于最大限制,我们将存储数据。状态更改为SAVING。当汽车离开监控区域时,程序将继续观察运动,但由于状态不是WAITING或TRACKING,因此运动将被忽略。下一个“else”语句用于未检测到运动时。通常这很好,因为我们之前已经保存并记录了上一次迭代的所有数据。但是,如果当前状态仍为TRACKING,则车辆未通过SAVING状态,并且必须未在保存缓冲区中捕获任何帧。我偶尔会在光线不足的情况下非常快的车辆看到这种情况,因为运气不好确定没有帧落在保存缓冲区内。在这种情况下,只要我们有一个或多个数据项,我仍然可以捕获从以前的迭代中计算出的数据。无论我们是否错过了一辆车,我们都会重置状态并等待下一辆车。仅当未检测到运动时才更新图像窗口。如果状态为WAITING,则将日期、时间和状态添加到当前图像中。base_image会稍微调整以考虑监控区域的光照变化。这些变化是由云层经过、阴影角度的变化、树叶吹动等引起的。此外,每60秒我们获取一个新的曝光读数,并相应地调整MIN区域、阈值和保存区域缓冲区。检查键盘是否按下了“q”,表明程序应终止。风扇我不确定它会进入那个绿色的小塑料盒子里有多热。我在Pi的CPU上放了一个额外的散热器,但顶部有PoE帽子,这样会限制空气流动。我在底座上钻了一些额外的孔来让空气流入,而流出是由风扇控制的。结果每次检测到车辆并测量速度时,数据都会写入本地CSV文件。它还将其发送到运行在另一个Pi上的MQTT服务器。通过其他各种步骤,我最终将数据保存在网络共享上,我可以在其中在Excel中打开它。我一直在使用ThingSpeakWeb服务进行统计分析,但发现数据丢失了。所以我恢复使用备份在云中的本地文件。我不是统计专家,但我通常可以设法在Excel中完成我需要的操作。管理数千行数据有点麻烦,但使用相当厚实的桌面似乎可以应付。举例来说,我让相机从2019年3月到2020年3月运行,最终得到两个文件,总共包含超过840,000行。2019年仅查看2019年的数据,平均每天检测到2,557辆汽车,6月20日最多检测到3,855辆。最繁忙的一天通常是周二,最安静的通常是周日。下图显示了每周平均每天的车辆数量(由每周的车辆总数除以该周的天数计算)。两次下降是由于系统故障导致我断电但程序没有重新启动。有一个非常渐进的趋势线,显示流量略有下降,但幅度不大,这可能是由于中断。但最初的问题是关于超速,尤其是在高峰时间。我将记录的速度分为四个类别,并计算出每个速度类别有多少车辆英里/小时%11-303931-405141-509超过511因此,61%的车辆超过30英里每小时的速度限制,平均每天有275辆车超过30英里每小时的限制至少10英里每小时。但这是高峰时段的事情吗?我将速度划分为一小时的时间段,然后创建了一些图表。下图显示了每个小时时段中速度为40至50英里/小时和超过50英里/小时的平均车辆数量。所以高峰超速发生在早上7点到早上8点之间,第二个高峰出现在下午5点到6点之间。所以是的,大多数超速发生在高峰时间。如果我是一名配备了昂贵得多的测速摄像头的警官,那么我估计在一个工作日早上的早上7点到早上9点之间的几个小时里,大约有46辆车的速度超过了限速10英里/小时。2020年所以那是2019年,一个“正常”的年份。2020年呢,按照大多数人的标准,这已经很不正常了。我是在5月写这篇文章的,在苏格兰,我们仍然处于封锁状态,但交通量已经明显减少,尽管最近我注意到交通流量有所增加。它发生了多少变化,人们是否放慢了脚步?在2020年的第10周到第13周之间,我看到车辆数量下降了69%。此后每周增加约5%,现在约为正常交易量的50%。全年至今,车辆的平均数量为1,751辆,最大数量在1月14日降至3,079辆。不知道为什么那个约会很忙。在第13周,每天的平均车辆数量从通常的2,500辆下降到810辆的低点,并且自那以后每周都在持续攀升,现在在第21周达到1,184辆。所以略低于正常水平的50%。锁定期间一周中最繁忙的日子略有变化。虽然到目前为止,周二仍然是全年最繁忙的一天,但如果我只看封锁周,那么周三和周五现在是最忙的。他们是放慢了速度还是加快了速度?车辆减少了,但道路上的车辆仍在与以前相同的时间超速,但我没有看到超速的增加不成比例。结论和后续步骤所以我的第一个问题关于每年增加的流量的答案还没有得到证实,需要几年的记录才能证明。尽管冠状病毒已经填满了今年的数据,但我认为这是一个公平的声明,即C级次要乡村道路的车流量很大。在正常条件下,它的视野是典型乡村道路通常预期的2.5倍。交通部发布了英国的道路交通估计-请参阅下面的链接。在第20页上,它显示农村小路平均每天有1,000辆车。2019年,我的道路平均每天有2,500人次。虽然2020年的冠状病毒爆发对交通量产生了重大影响,但尚不清楚一旦爆发结束(可能需要很长时间),我们是否会看到恢复正常交通量。即便如此,人们会恢复正常的通勤方式还是许多人会在家工作?无论如何,人们仍然可以去那里工作吗?太多的未知数。肯定会导致交通量增加的一件事是在我的道路尽头开通一座新桥。由于结构故障,这座桥在几年前不得不关闭。它穿过通往爱丁堡的双车道主干道。因此,目前来自爱丁堡(西行)的交通不受影响,但想要进入爱丁堡(东行)的汽车必须经过长时间的改道。我认为这解释了为什么我们在早上看到一个狭窄的交通高峰(大部分交通进入爱丁堡)而在晚上同样的交通回家时看到一个更广泛的高峰。人们在早上使用替代路线,但不会在回家的路上。因此,一旦桥梁重新开放,我预计早上高峰时段的音量会增加,绿色条的高度与黄色条大致相同。这将意味着每周从大约17,000个增加到估计的20,000个。这座桥原定于几周前开放,但因冠状病毒爆发而推迟。超速怎么办?超过60%的交通都在超速行驶。10%超过速度限制10英里/小时或更多。图表清楚地表明问题在高峰时段最为严重。爱丁堡市议会打算将30英里/小时区域后的道路限速降至40英里/小时;目前限速为60英里/小时。所以也许我家前面的加速和制动会减少。尽管我怀疑在30英里/小时区域内以50英里/小时的速度行驶的人不会被40英里/小时的标志所困扰。我会继续记录和监控数据。如果您对此项目有任何想法、意见或问题,请在下方留言。原文链接丨以上内容来源网络,如涉及侵权可联系删除。
通常,我们需要在家中或办公室(可能是秘密灵巧的实验室)确保一个房间的安全,以便任何人未经我们的许可不得进入房间,并确保我们的重要配件和资产不会被盗或丢失。今天有很多现成的安全系统,但在幕后,为了进行身份验证,它们都依赖于指纹、视网膜扫描仪、虹膜扫描仪、面部识别码、舌头扫描仪、RFID阅读器、密码、PIN、图案等。在所有解决方案中,低成本的一种是使用密码或基于密码的系统。-尼兰詹·罗伊制造者自己制作东西总是很高兴的。在这个项目中,我将与您分享我如何制作RFID/NFC控制安全门锁的原型。通过遵循这个项目,您将能够很容易地自己制作一个安全的门锁。视频演示:补给品:RYRR10S_LiteUART接口评估板:这是一款支持UART协议的NFC/RFID阅读器,这意味着您可以仅使用2个引脚将其与任何微控制器连接。该板还能够与任何使用SPI协议的微控制器进行通信。它支持大多数近场通信(NFC)和RFID协议,如ISO/IEC18092、ISO/IEC15693、ISO/IEC14443A、ISO/IEC14443B。该评估板带有集成PCB天线。ArduinoUNO:ArduinoUNO微控制器板将用于连接NFC阅读器、LCD显示器和电磁锁。其他Arduino而不是UNO也可以工作。LCD显示:项目中使用了一个16x2字符的LCD来显示锁定和认证状态。电磁锁:这是一种基于电磁原理制作的锁。您可以通过向锁的输入端施加电压来操作这种类型的锁。可以锁定不同的电压范围。我们为我们的项目使用了12V类型。可调升压转换器:因为我们需要12V来驱动3.7V上提供的电磁锁和锂离子电池。因此,我们需要一个可以将3.7V转换为12V的DC-DC转换2X18650锂离子电池盒:锂离子电池为电路提供电源,我们可以为锂离子电池充电。为了放置电池,我们需要一个电池座。18650锂离子电池第1步:电路图和说明电路的主要部分是Arduino微控制器板。Reyax13.56MHzNFC阅读器使用软UART端口连接到Arduino以读取NFC或RFID卡。16x2LCD用于显示锁状态和卡授权信息。为了向系统提供电源,使用了3.7V锂离子电池,但单个锂离子电池只有3.7V输出,不足以驱动电路。此外,电磁锁需要12V才能操作。为此,使用DC-DC升压转换器模块将3.7V转换为12V。由于Arduino引脚无法直接打开或关闭电磁锁,因此使用电源BJT进行切换。您必须在BJT的底部使用1K电阻器以防止其燃烧。通用二极管以反并联方式连接,以保护电子设备免受开关过程中锁线圈产生的高压尖峰的影响。Arduino与ReyaxNFC读写器的连接如下:将NFC阅读器的TX引脚连接到ArduinoD4将NFC阅读器的RX引脚连接到ArduinoD5将Reyax阅读器的VDD引脚连接到Arduino5V将GND连接到ArduinoGNDLCD与Arduino的连接如下:将LCD的RS引脚连接到ArduinoD13将LCD的E引脚连接到ArduinoD12将LCD的D4引脚连接到ArduinoD11将LCD的D5引脚连接到ArduinoD10将LCD的D6引脚连接到ArduinoD9将LCD的D7引脚连接到ArduinoD8将LCD的LED-、R/W、GND引脚连接到ArduinoGND将LCD的VDD连接到Arduino5V通过220欧姆电阻将LED+连接到Arduino的5V通过1K电阻将Vo连接到GND通过10K电阻将Vo连接到5V1K和10K电阻决定了LCD的对比度。更改该值将更改LCD对比度。本项目可以使用单节或双节锂离子电池。如果您使用双电池,则它们应串联连接。连接串联会将电压增加到8V左右。某些升压转换器无法将3.7V正确转换为12V。在这种情况下,串联连接的两个电池将是一个很好的解决方案。如果您使用双节电池,您可以将电池输出直接连接到Arduino的Vin引脚,以便为Arduino供电。如果您使用单节电池,则必须从升压转换器输出中获取Arduino的电源。也可以通过Arduino的5V引脚给Arduino板供电。在这种情况下,您必须使用7805稳压器从升压转换器产生5V输出。RYRR10S_Lite.pdfRYRR10S_EN.pdf第2步:准备LCD本项目中使用的LCD是16X2字符LCD。这是一个并行LCD意味着来自微控制器的数据并行发送到LCD。它可以在4位和8位模式下工作。在这个项目中,我用它作为4位模式来节省Arduino的4个引脚。在4位模式下,我们需要将LCD的RS、EN、D4-D7(共6个)引脚连接到Arduino。为了将LCD与Arduino连接起来,我使用了8线跨接电缆。一个端子与Arduino焊接,另一个端子与8针公针头焊接,以便我们可以非常轻松地将其放置到Arduino的母针头上。上图说明了焊接和跳线。第3步:准备电磁阀驱动器Arduino引脚无法提供驱动电磁锁线圈所需的电流和电压。因此,我们需要使用晶体管或继电器来使用Arduino信号间接驱动线圈。为此,可以使用任何通用功率晶体管。我试过D880和2N2222。如果您使用单个2N2222晶体管,它会变得非常热。所以,我并联使用了两个2N2222晶体管,它也能正常工作。如果您使用BJT,则必须在晶体管的基极上放置一个限流电阻器。为了用这个晶体管连接螺线管,我使用了一个2针公头。第4步:连接升压转换器我们正在为我们的项目使用电池。我的项目使用了2节锂离子电池。如果您愿意,也可以使用4个1.5V原电池。在这两种情况下,您都必须使用升压转换器将电池电压转换为12V。驱动锁需要12V电源。但是对于您的Arduino,您只需要一个5V电源。虽然您可以通过Vin引脚为Arduino提供7-24V电压。如果您愿意,您可以使用7805稳压器将升压转换器或电池电压转换为5V,并通过5V引脚提供给Arduino。最好使用开/关开关,以便我们可以轻松打开或关闭设备。第5步:上传程序这是我们项目的程序。我们使用软件串行库通过软件定义的串行端口与NFC阅读器通信。硬件串口用于调试目的。该程序可以选择读取不同类型的NFC/RFID卡。根据您的卡类型启用或禁用语句。Rfid_door_lock.ino第6步:连接ReyaxRFID/NFC阅读器我们正在制作RFID控制锁。所以,要读取RFID卡,我们必须使用RFID阅读器。可以使用不同类型的RFID阅读器和卡。我使用的是Reyax制造的UARTRFID阅读器,它基于ST半导体流行的CR95HF芯片。我发现这款读卡器可以检测距离最远10厘米的卡片,这为基于RFID的系统设计提供了巨大的灵活性。第7步:组装和测试这是制作此演示项目的最后阶段。我们在项目中使用了几个模块和组件。所以,我们需要把所有的东西放在一起。为此,我选择了一块硬橡胶板并固定了所有模块,并使用双面胶带和热胶将其固定在板上。修复所有部件后,我为设备通电。我发现它完美地工作。上面添加了图像,以上就是本项目的全部内容啦,感谢阅读本文转载自网络,如涉及侵权,可联系删除。原作者:taifur
在嵌入式电路场景中,您发现人们构建气象站系统是很常见的。连接传感器、微控制器和Wi-Fi等网络协议的一种非常简单的方法是构建气象站。如今,IoT(物联网)领域发展非常迅速,并且越来越需要有关网络协议的新技术。本项目的主要思想首先是:搭建一个使用LPWAN网络协议的自动气象站。LPWAN(低功耗广域网)网络提供了通过长距离传输创建低功耗系统的可能性。特点:7项环境措施:温度、湿度、大气压力、紫外线辐射强度、降水量、风向和风速带有光伏板和电池的自治系统LoRaWAN基础设施(远程传输)防水补给品我已经把它作为构建这个项目的基本组件列表。有一些工具可以轻松构建:万用表。螺丝刀、钳子、绝缘胶带、公制植物。用于插入组件的防水盒。软件是可选工具。我正在使用VisualStudioCode的PlatformIO扩展进行代码开发(C++语言)。您也可以在ArduinoIDE上设置此代码。AutoDeskEagle软件用于设计电路原理图和电路板绘图。第1步:概述LoRaWAN让我们解释一下LoRaWAN网络是如何工作的:End-Device功能正在发送数据包;在这种情况下,它是一个气象站读取环境变量。该网关负责接收这个包被称为“有效载荷”,并在一个JSON格式转换这个包。网关使用TCP/IP协议将转换后的信息重新发送到网络服务器。然后,网络服务器能够存储此数据或发送到向用户显示所有数据流量的应用服务器。嵌入式系统该项目分为三个系统:传感器系统、通信系统和电力系统。传感器系统包括MCU(ESP32)之间的所有传感器集成。通信系统包括LoRaWAN收发器模块和ESP32。LoRaWAN网关设置也包含在通信系统中。电力系统包括光伏系统,其中包含电池、充电控制器和太阳能电池板。第2步:设计设计部分最重要的是设计,即使是您不期望的。我首先在原型板上构建了嵌入式系统。检查所有系统稳定性后,我开始设计PCB项目。在为系统设计PCB之前,我首先在原型板上构建。检查传感器的运行情况并检查ESP32之间的LoRaWAN模块连接。气象站.brdWeatherStation_Prototype.fzz第3步:集成软硬件集成对所有系统的运行和可靠性都很重要。我首先集成了微控制器和传感器,进行了测试,然后开始了收发器模块的集成。图表显示了我如何连接ESP32上的所有引脚。在连接之前检查组件数据表总是更好(您可能使用不同的模型)。DHT11–温度和湿度BMP280–大气压力ML8511–紫外线传感器PDB10U–雨量计WHSP-WD–风向标WH-SP-WS01–风速计第4步:测试该项目的主要目的是:降低能耗。LPWAN协议通过低操作频率帮助完成此任务,低成本传感器由于不那么准确而有所帮助,我已经进行了一些软件修改以减少更多。使用万用表进行功耗测试,因此我可以测量系统的总功耗并构建光伏系统。第5步:编码当您需要缩小并查看所有系统运行良好时,编码是一个艰难的步骤。我一直在使用带有PlatformIO扩展的VSCode来开发C++代码。您可以在我的Github上查看整个代码;)我将解释已实现代码中的主要思想,但会解释注释。解释:定义所有ESP32引脚、传感器设置、LoRaWAN设置和辅助变量。插入测量时间和发送时间。在设置时,我正在设置调制解调器睡眠(关闭WiFi和蓝牙)。LoRaWAN参数设置为:DEVEUI、APPEUI、DEVADR、APSKEY、NWSKEY、Region(巴西)、ADR(ON)和加入模式(ABP)。loop函数读取传感器数据并通过LoRaWAN发送到网关。第6步:光电供应我已经决定2天充满电,这意味着如果由于任何原因太阳没有出现,系统将运行2天。该计划需要一些数学运算来计算您需要多少电量来为您的系统供电。数据处理:首先,在读取和处理数据时,您应该使用万用表或电流表测试所有组件的安培数。我有48,24mA。当我将此值乘以3.3V(组件电源电压,ESP32除外,它是5V)时,我得到了192.1mW。所以,这就是我需要提供的价值。太阳能电池板通过太阳辐射提供能量。我买了2块太阳能电池板,每块2W(6V),并决定进行串联布置。因此,如果我将太阳能电池板提供的总功率乘以一天中的太阳能小时数(我猜是5小时),我将得到以下值:产生的能量=4Wx5小时=20Wh系统一天消耗的能量也是有价值的计算:消耗的能量=192.1mWx24小时=4.61Wh因此,通过这两个计算,我们可以选择电池安培数:充电容量=(4.61Whx2天)/(12Vx20%)=3.84Ah然后,您可以选择所需的电池。我选择了以下项目:1x7AHEstacionary电池,12V。1个充电控制器。2x2W6V太阳能电池板(串联排列)第7步:组装在测试所有系统都可以正常工作后,您可以尝试组装部分。结构/三脚架:我买了一个横幅三脚架。当你没有太多重量时它会起作用。电子元件盒:我买了一个防水的盒子,就像你在房子外面用来装断路器的盒子一样(至少我们在巴西有)。在里面你可以检查太阳能电池板的嵌入式系统、电池和充电控制器。所有传感器线都来自盒子外面。传感器放置:这是一个无聊的部分......我买了一根管子来放置几厘米长的传感器。左下角的防辐射罩和右下角的雨量计(都用一些拉链锁着)。风传感器很容易,只需用钉子放在最高处即可锁定它们。附言。辐射防护罩经过修改,上面放了一块透明的塑料。这是用于紫外线传感器的目的。第8步:网关LoRaWAN网关是LoRaWAN网络上的一个实体。所述网关porpuse正在接收终端设备的数据和用于processsing发送到网络服务器。在您的设备位置寻找LoRaWAN本地范围非常重要,在巴西有美国塔以合理的租金提供LoRaWAN网关。请求的LoRaWAN网关服务包括5000个上行链路、200个下行链路和100个向外部服务(例如GoogleFirebase、TheThingsNetwork)的发送。图像显示了气象站所在的位置。第9步:网络服务器LoRaWAN网络需要一个网关来接收数据和一个界面来显示给用户。我选择不构建LoRaWAN网关。我决定为我所在地区的网关使用支付租金,而不是花费金钱和更多的时间来构建一个。该ProIoT平台具有提供服务,提供5000个上行,200个下行,并有100个/月“重发”到外部服务。您可能有不同的视图/界面,但在所有LoRaWAN网络中,您有相同的步骤。设备EUI:可以通过LoRaWAN模块找到设备扩展唯一标识符。安全激活:我选择使用ABP,因为它的功耗更低,范围更广。(但不太安全)。您可以在此处查看ABP和OTAA之间的区别。密码学:NS。设备地址、应用程序EUI、应用程序会话密钥、网络会话加密密钥:这些是您的凭据,应与您的LoRaWAN模块匹配。您必须检查这些凭据,因为如果它们不匹配,则无法连接。频率操作:检查您所在地区的频率。巴西(南美洲)使用915~928MHz。设置凭据和其他选项后,您就可以测试连接。我一直在测试上行消息,因为我不需要网关确认,甚至不需要在我的LoRaWAN模块上接收任何东西。监控例如,您必须配置接收“有效载荷”。我以这样的JSON格式发送数据:{“T”:“23”,“H”:“78”,“P”:“1018”,“U”:“2”,“S”:“7”,“D”:“270”,“R":"4"}此有效负载为每个可读变量提供一个“别名”(例如,“T”表示“温度”)。我只使用整数数字,因为使用浮点值可能会溢出有效负载容量。ProIoT界面包括一个“仪表板”。您可以在“主页界面”中包含您收到的一些变量,并且可以附加绘图、仪表、时间线。第10步:应用服务器读取公共接口中的数据非常有用,因为它可以帮助每个人获得可信赖的数据。不幸的是,在这个应用程序中,我没有将网络服务器与公共应用程序服务器集成。这些数据不是发布数据,而是存储在ProIoT平台上,您可以私下查看请求权限的数据,也可以尝试从这里检查数据仪表板。第11步:完成我准备在结果中展示三个步骤。位置:正确放置气象站很重要,因为它会影响数据的准确性。矿山气象站位于建筑物顶部(至少12米高)和外部。确切位置是:26º55'08.5"S49º06'23.2"W(https://goo.gl/maps/pqnzKmH7BkNMj6yY6)。系统自主性:光伏系统应该24/7全天候运行,但有些阴天会使系统变得困难。我通过断开太阳能电池板的连接来模拟太阳能电池板上的阴影。系统在耗尽所有电池能量后继续发送数据超过50小时。然后不幸的是,系统在仅将太阳能电池板连接到电池上后才恢复(没有嵌入式系统消耗能量)。验证数据:气象站应该提供可信的数据。我已经向政府实体请求了一些附近气象站的气象数据。第12步:验证给定的气象变量验证来自DefesaCivildeBlumenau-AlertaBlu。比较时间在10/31/2021和11/09/2021之间。经验证的气象变量是:温度、湿度、大气压力和降水。在此期间,AlertaBlu提供了240个包裹(每小时1个)。使用这个数量,可以计算出比较我的气象站的接收率。第一张图片显示数据接收率为69%,并且仅验证了该数据。在第二张图片中,您可以检查每个变量的相对误差和标准偏差。所有比较数据的平均相对误差为14.37%。第13步:结论这项工作真的很难思考、设计、购买正确的组件和整个集成。当然有问题,所以我会列出我在写这篇文章时没有解决的问题:LoRaWAN模块看起来不足以进行长距离传输,因为数据接收速率还可以接受。气象站上的传感器位置并不完美,这一事实导致了一些准确性的偏差。我无法在用于数据监控的公共服务器之间进行应用程序服务器集成。我花费了更多更少的220美元来构建这个项目。(我认为这是第一次尝试的合理价格)。但是有一些方法可以改进这个项目:包括RTC模块,更好的控制时间可以更好地控制传输速率。最好找LoRaWAN模块。是的,有一个气象站可以远距离发送数据,而有一个无法实现的LoRaWAN模块,这是一种耻辱。开发人工智能算法来进行天气预报。你可以在我的Github上查看这项工作中的所有内容。我正在发表一篇文章,所以有一天它可能会有用。以上内容来源于网络,如涉及侵权请联系删除(原作者@Lucasgb7)
我做了一个带时钟的蓝牙音箱。它显示日期、时间、温度和湿度,并每隔15分钟从互联网上更新。它还具有一个32波段音频音乐频谱分析仪,可显示不同的音乐模式。时钟或频谱分析仪可以在播放音乐时显示。蓝牙关闭时也可以显示时钟。这是由ArduinoNano制成的,具有所有处理和显示功能。ESP01从互联网上获取时间和天气报告,并通过串行通信将数据发送到Arduino。蓝牙模块接收音频和放大器(5+5瓦)模块将其发送到(5+5瓦)扬声器。做了一个小电路使用ArduinoforSpectrumAnalyzer分析音频。电源由18650电池供电,可通过任何智能手机充电器充电。补给品ArduinoNanoESP-01MT3608升压模块TP5100充电器模块蓝牙音频模块音频放大器(6/10瓦)扬声器4欧姆3/5瓦最大7219LED点阵。电阻电容器104,10uf2*18650电池2000mAh开关SPDT2位置,开/关开关,触觉按钮第1步:制作条形音箱你可以用10/12mm的MDF板胶合板制作条形音箱。首先测量扬声器和LED矩阵7219切割它。然后使用fevicol粘合剂和螺钉组装它们。我使用6毫米的前/后面板和12毫米的前/后面板胶合板。第2步:覆盖条形音箱我用墙纸贴纸把盒子包起来。你需要慢慢地和耐心地做,否则气泡会进入。或者你可以很容易地用喷漆涂漆。第3步:设计PCB您需要将组件焊接在PCB板上并进行测试。按照电路图并查看视频了解详细信息。第4步:制作电池组首先按照电路图焊接电线。然后用胶带包裹末端以避免短路。最后用另一层胶带覆盖整个电池组并检查电压应该在4伏左右。虽然我使用了4节电池,但电压相同,因为所有电池都是并联的。第5步:对ArduinoNano和ESP-01进行编程您需要分别对Arduinonano和ESP-01进行编程。您可以从下面下载代码并上传到ArduinoNano。接下来使用FTDI或USB到UART/ESP8266适配器将代码上传到ESP-01。还要获取天气报告,即温度..你需要从openweathermap.org获取一个API密钥,它是免费的..最后在组装前测试它。检查视频以获取完整的详细信息。您可以使用触觉按钮从时钟切换到音频频谱分析仪。ESP01_Arduino_BTSpeaker_V6_FV1.inoBTWifi_Speaker_FV1.ino.inoArduino-32band-audio-spectrum-visualizer-analyzer.ino第6步:最后组装组件第7步:视频演示以上内容转载自网络,如有问题请留言评论处理
该项目使用带有ESP8266-12和ADS1115的NodeMCU模块创建了一个有功电能监控器。该项目使用带有ESP8266-12和ADS1115的NodeMCU模块创建了一个有功电能监控器。接线电路此基本版本仅适用于视在功率。为了保持较少的组件数量和尽可能简单的电路,ADS1115用于差分模式,无需偏置电阻器。困难的部分是让有执照的电工将电流传感器上的夹子连接到进入房屋的主电线上。由于我们只有1个通道,因此我们将监控整体功率而不是每个电路的功率。按照下面的弗里茨图在面包板上连接原型。为靠近配电盘的NodeMCU供电也可能是一个问题,所以我安装了一个DIN导轨电源插座,这将在以后的实际功率测量中派上用场。编程NodeMCU我选择使用ArduinoIDE来对NodeMCU进行编程,因为相关库很容易获得,而且我个人对这个平台很熟悉。您可以使用ArduinoIDE的最新版本和此处的说明轻松入门。可在此处获得在其上运行的基本视在功率代码。连接到Thingspeak连接到Thingspeak可以轻松绘制电流并保存连续收集的数据。创建一个帐户并在上面的Arduino草图中填写API密钥。只要校准负载功率因数问题,就可以使用12VDIN导轨变压器测量实际功率。下面的弗里茨图显示了如何实现这一点。在此设置中,可以使用如图所示的桥式整流器为NodeMCU供电。在采样AC电压时必须小心避免ADC过载。ADC可以在比例因子1下处理的最大峰峰值电压约为8V,RMS交流电压约为2.8V。在此模式下接线时,还会测量各种其他变量,包括功率因数、真实和视在功率以及线路电压。可以在此处找到将真正力量上传到Thingspeak的草图。把它放在PCB上在面包板上制作原型并确保一切正常后,我们可以将设计转移到PCB上。我在此处提供了原理图和PCB。我将迭代设计并随着我的进展更新它们。可以通过直接替换7805(例如Murata)并添加50-60Hz低通或带通滤波器来抑制测量中的任何噪声来进行改进。最终组装的系统现已完成并可在Tindie上使用本方案所用到的一些代码如果您对此项目有任何想法、意见或问题,请在下方留言。
物联网连接IoTConnect是一个建立在esp8266之上的开源物联网平台,它允许用户以最有效的方式远程连接和控制他们的家用电器。该项目主要分为3个主要部分,即硬件、固件和WebUI。硬件:硬件建立在ESP8266和74HC595N移位寄存器之上,仅使用3个GPIO即可控制8个设备。因此,我们留下了额外的GPIO,可用于其他目的,例如连接传感器。该设备还包括诸如DHT11之类的传感器,它使我们能够测量房间当前的室温和湿度,以及一个LDR(光敏电阻器),它帮助我们测量房间亮度。借助这些传感器,我们可以使用IFTTT或AdafruitIO等3rd方服务使设备自动化。该硬件包括板载5v电源,因此用户无需安装额外的电源适配器来为设备供电。我们必须提供的唯一输入是110v-220v交流电源。该设备还包括2个轻触开关,一个用于重置ESP,另一个连接到GPIO,可以对其进行编程以获取用户输入或重置设备。固件:IoTConnect固件使用Arduino框架构建,可以独立运行或与IoTConnectWeb应用程序同步运行。它的设计方式还可以将其闪存到任何其他可用的物联网智能开关,例如Sonoff设备或Tuya设备。刷固件:要刷新固件,您可以先从这里下载。这将为您提供2个文件:firmware.bin(包含功能的主文件)spiffs.bin(UI文件,包括HTML、JS和CSS文件)只需在FTDI编程器的帮助下,通过暴露的编程引脚将固件.bin文件刷入ESP8266。您可以使用固件存储库中包含的Tasmotizer将firmware.bin刷入esp8266。闪烁完成后,我们就可以打开设备了。该固件为我们提供了以下多种功能:打开设备后刷新固件后,ESP将托管自己的接入点,名为“IoTConnect”,该接入点可用于执行其初始设置。您可以将笔记本电脑或android/ios手机连接到此AP。连接Wi-Fi后,会弹出一个网页(或从网络浏览器浏览192.168.4.1),显示如下设置屏幕。在这里,您可以通过OTA更新firmware.bin,也可以通过上传第二个文件(即spiffs.bin)继续下一步。一旦SPIFFS闪烁,设备将重新启动并托管其网页。这是您必须提供设备配置的页面。第一个设置是MQTT代理。如果您想连接到IoTConnectWebUI,请保持所选选项不变,或者如果您想连接到任何其他MQTT服务器,例如Adafruit.io或HiveHQ等,则选择第二个选项,即自定义。您可以在此处提供MQTT服务器的MQTT详细信息。如果您想让设备与任何云服务隔离,您也可以选择N/A。在第二个下拉列表中,选择您刷入此固件的设备类型。如果使用本项目中提到的相同设备,则选择“IoTConnectBoardRev2”并单击保存。此设备将再次重新启动后,网页将刷新。无线上网:现在第二步是连接到家庭Wi-Fi。转到WiFi选项卡并单击扫描,选择要连接的AP,输入WiFi密码并单击更新Wifi。提示将要求您确保输入了正确的详细信息。单击“确定”,设备将重新启动。如果您输入了错误的详细信息,ESPspiffs将被删除,您必须再次上传spiffs.bin并重新开始。验证:保存Wi-Fi设置并成功重启设备后,网页将重定向到ESP的本地网址,并会出现身份验证提示。默认用户名和密码是“admin/admin”。输入相同然后您将看到可以控制相应继电器的拨动开关列表。如果您想从轻触开关切换继电器,您可以从下拉列表中选择继电器。IoTConnect固件还显示了通过MQTT来回流动的每个命令,以让用户了解云服务器上正在发生的信息。您可以单击“打开调试控制台”按钮来检查数据流。这里的“ESP_SENSOR”和“ESP_ATTENDENCE”是推送对应JSON数据的主题。您还可以从“安全”选项卡修改身份验证用户名和密码。Alexa:IoTConnect固件内置有Alexa支持。只需转到Alexa选项卡,您就可以配置3个不同的中继,这些中继可以由连接到同一网络的Alexa设备发现和控制。设备状态:要获取设备状态,您可以查看“状态”选项卡,该选项卡将提供一些有用的信息,例如本地URL、Wi-FiSSID、MQTT状态、Wi-Fi强度以及来自传感器的温度+湿度+照度读数。IoTConnect固件的最佳部分是UI通过WebSockets连接到模块,因此您在WebUI上看到的信号强度和传感器读数等数据将异步更新,而无需刷新页面。这有助于减少ESP网络服务器的负载。设备配置:最后一个选项卡是设备选项卡,您可以在该选项卡中对设备执行重置、重启、更新或重新配置设置(例如MQTT服务器或更改设备类型)等基本操作。此选项卡还允许您将IoTConnect固件连接到IoTConnectWebUI。只需单击重新配置设备按钮->与IoTConnect配对这会将您重定向到一个网页,您必须在其中提供IoTConnect帐户的凭据,然后单击添加设备。在下一页上,为您的设备命名并选择要添加此设备的房间,然后单击添加设备。(房间将在IoTConnectWebApp的以下部分进行说明)在下一页,您必须按下并松开设备上的轻触开关一次或两次才能完成同步过程。物联网连接Web应用程序:IoTConnectWeb应用程序的设计非常简单且信息丰富。您可以从此URL(https://iot-connect.in)访问Web应用程序。首先,您需要创建一个帐户,然后登录。登录后,您必须转到控制面板并创建一个房间。如上所述,可以向这些房间添加设备。添加设备后,您可以在设备名称旁边看到一个绿色地球符号,这表示该设备在线并已连接。如果设备离线,当设备离线时,地球符号将变为红色,并显示时间。单击设备选项卡时,将打开并最大化控制面板,您可以在其中看到与板上继电器相同数量的开关。您可以切换这些开关来切换板上的继电器。这里唯一的区别是这种连接是通过MQTT进行的,并且可以从世界任何地方控制中继。您可以从任何地方访问IoTConnect网站并控制继电器。除此之外,该网页还将以图表和仪表的形式显示传感器读数。这些读数可以通过单击记录下的开始按钮记录在此处。录音只能运行1小时。最大限度。此外,这些录音可以以csv的形式下载,也可以以图表的形式查看。您可以通过单击NC并在弹出窗口中提供新名称来重命名继电器名称。激活IoTConnect智能家居技能后,Alexa设备也会发现相同的名称。这个Web应用程序最好的部分是多个用户可以共享一个设备,第一次添加设备的用户将成为设备的所有者。如果其他用户将添加相同的设备,则会向所有者发送请求以批准访问。可以从帐户部分的共享用户收回此访问权限。IoTConnect还支持推送通知,因此如果任何用户切换继电器,则通知将发送给共享该设备的每个用户。您可以从“帐户”部分禁用此通知。您还可以在AlexaSkill商店中找到IoTConnectSmartHomeSkill。此Skill将允许您控制来自与IoTConnect板不在同一网络中的Alexa设备的继电器。本方案所用到的一些代码如果您对此项目有任何想法、意见或问题,请在下方留言。
该设备允许我检测线轴是否用完灯丝或打印头是否堵塞!设计初衷:因为我一台Creality3D打印机,我很担心一个巨大的打印件因为问题而停在中间。这台打印机已经配备了灯丝检测器,但它只是一个小型微动开关,仅用于检测此池何时为空。问题是,如果头部被堵塞,那么我无法检测是否是这种情况,这让我很紧张。我打算为我未来的R2-D2打印巨大的部件,我不想在打印失败并破坏我的打印件之前打印几天,因为打印头被堵塞了。视频演示:解决方案我带来的解决方案是设计一个电路来检测线轴何时转动,这样,我将能够看到灯丝是否在移动。预期功能在考虑这个项目时,我想出了一个在创建这个设计时我想要的功能列表。这是清单:最重要的功能是将打印状态发布到云端,作为物联网设备,我可以远程监控打印状态一个用于查看打印状态的网络界面……对我来说,一个不断增长的图表就足够了一个或多个LED显示检测到的活动1个LED显示Wifi连接状态有问题时发出警报的蜂鸣器如果出现任何问题,可以暂停打印机该设备应在小型USB电源上工作电路对于那个电路,我想使用我已经拥有的组件组件以下是我决定使用的组件列表以及一些解释和注意事项光传感器:我手头的那些是可变的10k电阻器使用的微控制器是WemosD1MiniPro-这个控制器的问题是只有1个模拟引脚因为光传感器是“模拟设备”,而且因为Wemos只有一个模拟引脚,所以我必须找到一种方法将模拟信号转换为数字信号并使用数字引脚。-为此我使用了MCP602A双运放目的电路细节该电路使用手工制作的“旋转编码器”:我的目标是,最初,不仅要检测灯丝正在移动,还要检测方向。我注意到打印机的回缩动作将灯丝向上推,但是,因为我将打印机转换为直接驱动,我不再有鲍登管,并且这种回缩动作不再将灯丝推回线轴。无论如何,我保留了旋转编码器的想法,并使用了2个LED和2个光电阻器来评估旋转。此处显示的电路显示了2个“通道”;每个LED光敏电阻对一个架构正如我们在电路中看到的那样,两个通道由MCP602A芯片中包含的两个运算放大器驱动。这些通道的目标是翻转一点,以便我可以从数字引脚读取它。电路说明当光线照射到其中一个光电阻器时,运算放大器会将光电阻器和10K电阻器创建的分压器与10k和4.5k电阻器创建的另一个分压器进行比较,当它超过阈值时,它翻转位,然后通过Wemos的引脚D5和D6读取值。然后,在内部,只要D5或D6发生变化,计数器就会被重置,并且一旦它大于预定义的值(由网页控制)(50秒左右),就会触发蜂鸣器并触发继电器在打印机上触发PAUSE操作。外壳我喜欢“老派”或“复古”的设计,所以我设计了一个让我想起这个时代的外壳。探测器小电路是用我的数控切割的。它们是不同的:其中之一包括2个LED和2根连接到电路板的电线(5v和地)另一块板包括2个光电阻器,需要3根电线:1个接地,第一个光电阻器的1个引脚和第二个光敏电阻器的另一个引脚电路图板子由三部分组成:最大的部分包含主电路其他2个部分用于旋转编码器的2个部分网络活动打印时,我可以通过检查图表来查看打印件。打印时,图形上的值会增加。上一张图片显示了打印开始而不是崩溃,因为我停止了线轴转动。我更换了线轴,重置了Wemos并重新启动了打印,这就是图表看起来像这样的原因。Web界面允许我更改蜂鸣器和继电器反应延迟。我还添加了一个“原始”部分,在那里我可以看到数据条目和每个条目的相关日期时间,这让我随时了解情况。
本方案是一个基于Bolt物联网的汽车防盗系统,该项目旨在为用户提供一种解决方案,以便在有人试图偷窃或闯入时实时跟踪他们的车辆。由于全球流行的大流行情况,现在汽车正逐渐成为必需品。对于汽车所有者来说,能够保护他们的汽车免遭盗窃变得非常重要。有些人根本就没有车库来存放他们的汽车。其他人在将汽车停在未知地点时需要安全解决方案。这些问题需要一种解决方案,以便在汽车被盗时能够实时追踪他们的汽车。该项目旨在为用户提供一种解决方案,以便在有人试图闯入车辆并窃取车辆时实时跟踪他们的车辆。系统每10秒通过Telegram向车主发送警报,并在谷歌地图链接上提供汽车的GPS坐标。除此之外,蜂鸣器还会响起,提醒靠近汽车的人车辆被盗。那么,让我们详细了解一下该系统。硬件设置要创建汽车防盗系统,我们需要通过以下步骤来为系统进行适当的连接。步骤1:在面包板上,将面包板最末端的一列连接到Arduino的3.3V电源。这一侧的下一列连接到Arduino的5V电源。第2步:在面包板另一端的点列上,将其从Arduino连接到GND。第3步:将蓝色LED的正极与面包板上的330欧姆电阻连接。从电阻器的另一条腿,将一根电线连接到Arduino的引脚D5。LED的负极连接到面包板上的GND电源。第4步:将蜂鸣器放置在面包板上,其负极连接到面包板的GND电源,正极连接到Arduino的引脚D4。步骤5:将LM393LDR模块放置在面包板上。它的Vcc和GND端子分别连接到面包板上的3.3V和GND电源。LDR模块的A0引脚连接到Arduino的A0引脚。步骤6:将激光模块放置在面包板上,使激光面对LDR模块的光敏电阻。负极端子从面包板的GND电源接地。激光模块的信号引脚连接到面包板上的5V电源。步骤7:将BoltWiFi模块的D0引脚连接到Arduino的D2引脚。这将用于通知系统用户是否已启用或禁用系统。步骤8:BoltWiFi模块的Tx引脚连接Arduino的D0引脚,BoltWiFi模块的Rx引脚连接Arduino的D1引脚。步骤9:GPS模块上的Vcc和GND连接连接到BoltWiFi模块上的3.3V和GND引脚。GPS模块的Tx引脚连接到Arduino的D7引脚,GPS模块的Rx引脚连接到Arduino的D8引脚。步骤10:分别使用miniUSB和TypeBUSB线将BoltWiFi模块和ArduinoUNO连接到电源。整个电路如下图:软件编程电报频道创建:我们需要先在Telegram上创建一个频道。Telegram上的频道类似于Whatsapp中的组。我们将在此频道上收到来自系统的所有通知。在您的手机上,打开Telegram应用程序。单击应用程序屏幕右下角的铅笔形图标。出现新消息屏幕。在此屏幕上,单击“新频道”。在“新频道”屏幕上,输入频道名称。还有一个选项可以上传图像作为频道的图标。输入有关频道服务目的的适当描述。然后,单击屏幕右上角的“对勾”标记。出现“频道设置”屏幕。在此屏幕上,将频道设置为“公共频道”。键入充当频道公共链接的永久链接。机器人的链接名称中不应有任何空格。单击此屏幕右上角的“对勾”标记。出现“添加订阅者”屏幕。不要添加任何订阅者。只需单击此屏幕右下角的箭头图标即可。通道现已创建。电报机器人创建:在Telegram应用程序的主屏幕上,单击屏幕右上角的搜索图标。搜索“BotFather”并等待搜索结果出现。从搜索结果列表中,单击旁边带有蓝色勾号的BotFather。BotFather聊天屏幕现在出现。BotFather就像可以用来创建新机器人的主人。机器人将帮助向我们在上一个区块中创建的频道发送通知。在此BotFather屏幕上,键入“/start”并单击“发送”。这将显示可用于控制BotFather的命令列表。接下来,输入“/newbot”并点击发送。BotFather要求提供一个机器人名称,该名称将用于指代我们正在创建的新机器人。为机器人输入一个合适的名称,然后单击发送。BotFather要求提供机器人的用户名。用户名的末尾必须包含“bot”一词。输入您喜欢的用户名,然后单击发送。如果用户名被其他人使用,则此聊天屏幕上将显示相同的内容。这要求用户选择其他用户名,然后单击发送按钮。成功创建机器人后,BotFather将显示一条消息,说明新机器人已成功创建。此消息还将提供机器人的链接和机器人的HTTPAPI令牌,这些令牌必须保存以备后用。在创建机器人时,必须将此机器人作为管理员添加到您的频道。这是按如下方式完成的:在Telegram应用程序的主屏幕上,单击刚刚创建的频道的名称。这将打开频道的聊天屏幕。在此屏幕上,单击屏幕顶部的频道名称。这显示了有关频道的几种信息。从“成员”选项卡中,单击“订阅者”。在“订阅者”屏幕上,可以看到用户的姓名。除此之外,还有一个“添加订阅者”按钮。点击它。在“添加订阅者”屏幕中,搜索刚刚创建的机器人的用户名。从搜索结果中单击相应的一项。会弹出一条消息,提示只能以管理员身份添加机器人。在此消息上,单击“MAKEADMIN”。从下一个屏幕是“管理员权限”屏幕,如果尚未选中“发布消息”选项,请选中它,然后单击屏幕右上角的“勾号”图标。因此,该机器人已成功添加为您的频道的管理员。编程Bolt模块的Cloud端要让机器人向通道发送通知,您需要通过程序向机器人发出HTTP请求。该程序需要存在于Bolt模块的云端。这是在OracleVMVirtualBox上使用UbuntuServer完成的。第1步:在VirtualBox上启动Ubuntu服务器。为新项目创建一个目录。目录创建如下——sudomkdirtest第2步:使用cd命令切换到新创建的目录-cdtest第3步:创建一个配置文件,该文件将包含与Bolt模块和Telegrambot通信所需的所有数据。这是使用以下命令在python文件中完成的-nanocarconf.py'.py'类似于python文件。'nano'命令打开一个文件编辑器。在这个文件中,输入以下几行——bolt_api_key=”xxxxxxxxxx”//EnteryourAPIkeyforBoltmoduleheredevice_id=”BOLTXXXXXXX”//TheuniqueIDforyourBoltmoduletelegram_chat_id=”@XXXX”//Channelpermanentlinkforyourchanneltelegram_bot_id=”botXXXXXXXXXXXX”//BotHTTPAPItokenforaccessingthebotviaHTTPrequestsmapurl=”http://maps.google.com/maps?q=”//PartofthegooglemapslinktobesentasnotificationontheTelegramChannel按“Ctrl+X”,然后按“Y”和“Enter”保存文件。该文件如下所示:第4步:现在必须创建云的主要代码。这部分代码将扫描通过串行端口(RX、TX)从Arduino发送到Bolt模块的任何字符串。如果它接收到任何字符串,它会通过一组验证检查来传递该字符串。通过验证检查后,该字符串将被视为某个位置的纬度或经度。纬度和经度以1秒的间隔从Arduino发送到Bolt模块。因此,以奇数间隔接收的每个字符串都是纬度,以偶数间隔接收的每个字符串都是经度。收到纬度和经度值后,程序会向您的电报机器人发送HTTP请求,其中包含适当的消息和谷歌地图链接,以使用接收到的纬度和经度值对跟踪车辆。nanogps.py代码编辑器打开后,输入以下内容-第5步:按“Ctrl+X”,然后按“Y”和“Enter”,保存文件。至此,Bolt模块的云端编程成功。为手机编写BoltDevice页面的用户界面下一步是对防盗系统的用户端进行编程。防盗系统的用户端看起来是这样的——屏幕显示两个按钮,“启用”和“禁用”。这些按钮用于根据用户的选择分别启用或禁用防盗系统。第1步:为了创建这样的页面,请使用以下链接转到BoltCloud页面并使用您的凭据登录-https://cloud.boltiot.com/第2步:出现Bolt'Devices'的云页面。此页面显示Bolt模块的ID及其可用性。单击此屏幕左侧菜单中的“产品”。第3步:出现产品页面。在此页面上,单击“添加产品”,然后单击“创建新产品”。将出现“构建产品”页面。这看起来像这样-第4步:在此页面上,为产品起一个合适的名称,选择“输出设备”作为其类型,并将数据收集方式设置为“GPIO”。或者,也可以上传设备的图片。最后,单击“完成”。该系统的产品页面看起来像这样-第5步:从左侧的产品列表中选择新创建的产品,点击页面右上角的配置图标。该图标看起来像下图中标记为红色的那个-这将打开此产品的“产品:设置”页面,如下所示。第6步:在此页面上,从水平顶部菜单中选择“硬件”,并在Bolt模块的硬件布局中标记“0”旁边的单选按钮。在此页面的右侧,将“0Digital”引脚命名为“启用”。然后按“Ctrl+S”或单击此页面右上角的“保存”图标以保存详细信息。第7步:接下来,从顶部的水平菜单中选择“代码”。这将打开此产品的编码页面。输入文件名并选择Javascript或“.js”作为扩展名。在编码窗口中输入以下代码-该页面将如下所示-最后,单击此页面右上角的“保存”图标和“关闭”图标以关闭设置页面。第8步:在“产品”页面上,从左侧的产品列表中选择新创建的产品,然后从该页面的右上角单击“将设备链接到此产品”图标,看起来像下图中红色标记的图标-这将出现一个页面,用于选择要链接产品的设备。该页面将显示您的螺栓设备的名称。第9步:单击Bolt设备的名称,最后单击“完成”。至此,手机产品页面创建成功。要从手机查看页面,请从手机打开Bolt应用程序,单击您的Bolt设备的名称,将出现包含“启用”和“禁用”按钮的页面。对Arduino进行编程剩下的下一个也是最后一个任务是对Arduino进行编程。按照“硬件设置”部分所述进行必要的电路连接。打开ArduinoIDE并在代码编辑器中键入以下代码-使用了两个头文件,即“BoltDeviceCredentials.h”和“BoltIoT-Arduino-Helper.h”。'BoltDeviceCredentials.h'已编辑为包含必要Bolt设备的设备ID和API密钥。该库已重命名为“BoltDevCredentials.h”。编辑了“BoltIoT-Arduino-Helper.h”库,将SoftwareSerial库的所有实例更改为NeoSWSerial。SoftwareSerial与主代码中的NeoSWSerial库发生冲突。因此,SoftwareSerial的实例必须替换为NeoSWSerial。然后将头文件重命名为“BoltIoT-Renew-Helper.h”。除了这两个库之外,还使用了“NMEAGPS.h”库、“string.h”库和“NeoSWSerial.h”库。工作与示范可以看到硬件设置有一个LED。此LED是状态LED,用于描述系统是启用还是禁用。可以使用手机上的Bolt应用程序页面启用或禁用该系统。激光模块和LDR模块的放置方式使它们彼此面对。在现实生活中,LDR模块安装在车门内,激光模块安装在车体内,两个模块相对。很容易看出,当车门打开时,LDR模块随车门移动。激光模块连续发射一束激光,落在LDR模块上。当系统处于禁用状态时,通过打开门来移动LDR模块不会产生任何影响。一旦通过按下Bolt移动页面上的“启用”按钮启用系统,状态LED会发光,表明系统处于启用状态。在这种状态下,如果有人试图通过打开车门闯入汽车,LDR模块会随着车门移动。这会导致落在LDR模块上的光量下降。此操作会触发蜂鸣器作为警报,可以提醒附近的人汽车被盗。与此同时,与硬件相连的GPS模块每10秒向Bolt模块发送汽车位置坐标。Bolt模块依次调用API向车主的Telegram帐户发送Telegram警报。电报消息指出汽车被盗,并包含一个谷歌地图链接,用于跟踪汽车和消息。因此,每10秒,就可以跟踪汽车的实时位置。电报信息看起来像这样——通过按Bolt移动页面上的“禁用”按钮,可以再次禁用整个系统。结论传统的汽车警报系统通过振动检测来提醒附近的人。这些系统往往会产生误报。而且,一旦汽车被盗,就没有办法追踪它。这个“基于Bolt物联网平台的汽车防盗系统”为我们解决了这个问题。一旦有人企图盗窃汽车,该系统就会向路人发出警报。这也消除了误报的问题。此外,一旦汽车被盗,有一种方法可以知道其位置,以便可以轻松找回车辆。这可能是解决拥有车辆但没有车库的人的担忧的潜在好方法。因此,他们可以在晚上安全地睡觉,而不必担心车辆的安全。本方案所用到的一些代码如果您对此项目有任何想法、意见或问题,请在下方留言。
本方案是一个基于ArduinoUNO的IC测试仪,项目的主要目的是检查逻辑门IC,IC是否正常工作。IC的检查将使用ArduinoUNO完成。要检查的主要IC是OR(7432)、AND(7408)、NAND(7400)、EXOR(7486)和EXNOR(747266)工作准则在这个项目Arduino中,使用了LED灯、电阻器等。ArduinoArduino是一种单板微控制器,旨在使交互式对象及其周围环境的应用程序更易于访问。硬件具有围绕8位AtmelAVR微控制器或32位AtmelARM设计的开源硬件板。当前型号包括一个USB接口、6个模拟输入引脚和14个数字I/O引脚,允许用户连接各种扩展板。ArduinoUno板是基于ATmega328的微控制器。它有14个数字输入/输出引脚,其中6个可用作PWM输出、一个16MHz陶瓷谐振器、一个ICSP接头、一个USB连接、6个模拟输入、一个电源插孔和一个复位按钮。该项目的代码安装在Arduino中。arduino会在必要时向LED灯发送信号并传递信号。连接是根据上图完成的。LED灯:发光二极管是一种双引线半导体光源。它是ap-n结二极管,在激活时会发光。当对引线施加合适的电压时,电子能够与器件内的电子空穴复合,以光子的形式释放能量。在我们的项目中,我们使用了4个LED来检查逻辑门。如果根据相应的真值表灯亮,则IC正在工作。但是,如果IC损坏或不在我们IC列表中的不同IC,则单个输出LED将亮起。连接是根据连接图完成的。电阻器电阻器是一种无源的两端电气元件,将电阻作为电路元件来实现。在电子电路中,电阻器用于减少电流、调整信号电平、分压、偏置有源元件和端接传输线等。在IC测试仪中,电阻是保护LED。连接是根据连接图完成的。性能分析在构建项目后,我们通过一些IC测试项目。这些IC是项目中提到的特定IC,一个损坏的IC(7400)和一个7404IC。当我们将IC7432、7408、7400、7486和747266一一连接到项目中时,我们发现LED灯正在按照各自的真值表工作。在这种情况下,单输出LED灯将保持关闭状态。因此该项目正在运行。当我们将损坏的IC7400连接到项目时,我们发现单个LED输出灯亮。这意味着IC损坏了。因此,该项目正在运行。当我们连接IC7404时,我们发现单个LED输出灯亮。这意味着IC损坏了。由于该IC不在我们的项目IC列表中,因此该IC似乎已损坏。因此,该项目正在运行。错误分析•项目可以处理五种特定模型。使用任何其他IC时会发生错误。因此,如果使用其他型号的任何IC,则项目会将其视为损坏的IC。•项目只能检查一个门。通常,如果门工作,那么IC工作。但是,在某些情况下可能不会发生。结论在这个项目中,我们只能测试74**系列的5个逻辑门IC,因为我们在小范围内尝试了这个项目。为了测试更多的IC,我们可以使用ArduinoMEGA或RaspberryPi,因为需要更多数量的引脚并且项目将变得更加昂贵。逻辑门电路图:如果您对此项目有任何想法、意见或问题,请在下方留言。
你有没有想过开发一个项目并能够将机械、电子、传感器和编程结合起来?在本文中,我们将教您如何使用Arduino创建电梯项目以及如何使用屏蔽板连接和控制项目中的所有设备。您想知道如何创建上述所有结构并开发自己的电梯制造商吗?看过这篇文章,相信你可以学习到如何使用Arduino完成完整的电梯时间表。为什么要使用Arduino开发电梯?在许多地方,电梯用于允许建筑物的用户在不同楼层之间移动。电梯是通过在其结构中使用多个传感器而具有高度安全性的设备。除了用于运送人员之外,一些地方还使用电梯作为建筑工地、餐厅、接收产品交付等的货物处理平台。学习如何建造自己的电梯将帮助您了解:电梯是如何工作的电梯中使用的传感元件有哪些?电梯的工作机制。传感器工作原理;用于连接电梯设备的控制板有很多经验可以帮助您构建自己的电梯结构。此外,您将开发编程逻辑,这是任何电子和自动化专业人士的基本点。Arduino电梯结构下图显示了项目的完整结构。电梯由4层楼和一个控制接口组成。控制界面由4个按钮和一个20x4的LCD组成。用户将能够通过每个按钮控制电梯位置,并在结构的显示屏上接收系统信息。控制箱连接到电梯的后部。见下图。电线进入这个背面区域并与负责处理编程逻辑的Arduino连接。此外,电梯结构的创建是为了方便其编程,并允许用户在编程过程中不要移除Arduino。下面是电梯结构中Arduino的图像。如您所见,可以访问Arduino的USB端口和用于电源的插孔连接器。所有电子设备都通过使用此扩展板连接到Arduino。如下图所示。为什么在ArduinoUNO上使用Shield如果您在项目中不使用屏蔽,将会出现两个大问题:焊料连接错误以及缺少传感器和其他设备的电源端子。让我们了解如何解决这两个问题?例如,看看项目的传感器。我们有4个传感器来检测电梯的位置。见下图。总共有4个GND和4根电线用于+5V连接。不幸的是,我们知道Arduino只有2个GND端子和1个+5V的连接引脚。这迫使我们将这些电线焊接在一起并连接到这些端子。但是,在某些情况下,会出现焊接连接问题,并且项目中的设备无法正常工作。这需要时间并阻止您继续前进。为了防止出现此问题并扩展电源引脚以更轻松地连接所有设备,我们为ArduinoUNO创建了Shield。您可以使用ArduinoUNO将其应用于任何项目。接下来,我们将找出项目中的哪些电子设备将连接到Arduino的Shield电路板。项目电子设备与ShieldArduino的连接该项目由几个电子设备组成。其中,我们重点介绍了L293D驱动器和直流电机。L293D驱动器和直流电机Arduino将发送命令来激活L293D驱动器并转动直流电机以移动电梯箱。我们将在电机轴和电梯箱上放置一条尼龙线以进行牵引。在旋转过程中,线会缠绕在电机轴架上。见下图。这样我们就可以上下移动电梯。但是,我们有一个问题:我们怎么知道电梯是否到达了4层的每个位置?这就是为什么我们应该使用簧片开关传感器。它们将使我们能够在电梯移动时检测到它的位置。用于检测电梯位置的簧片开关传感器在下图中,我们展示了4个簧片开关传感器。它们在检测到附近存在磁场时触发,并将向Arduino的数字引脚发送高逻辑电平信号。我们将使用连接到电梯井后部的磁铁在每个传感器移动时触发它。在下图中,我们有一层电梯井的结构。可以看出,在电梯结构中实现了直线导轨。它们旨在提高电梯运动的稳定性并防止其运动过程中的振动。因此,这改进了传感器对电梯位置的检测。下面我们有另一个线性导轨结构的图像。电梯位置由项目控制界面上的按钮选择。接下来,我们将介绍控制界面的结构。Arduino电梯控制接口这种结构是为了方便电梯控制而开发的。它由一个20x4的LCD和4个按钮组成。按钮用于请求电梯到所需位置。LCD旨在允许系统和用户之间交换数据。通过它,我们将能够呈现各种信息:电梯的运动方向电梯在什么位置用户要求发言项目的电池电量所使用的LCD具有SERIAL-I2C转换器,以减少导线数量和与屏蔽板电气连接的复杂性。现在,我们将看看如何创建编程逻辑来控制我们的JLCPCBArduino电梯的运动。Arduino电梯控制逻辑现在您了解了电梯结构是如何构建的,让我们了解如何使用编程逻辑来控制它。有多种方法可以创建编程逻辑来控制电梯的运动。我们的逻辑将如下所示工作。#include#include//Inicializaodisplaynoendereco0x27LiquidCrystal_I2Clcd(0x27,20,4);//Variavelparacontrolaraentradanoloopboolcontrole=0;boolnot_pos=0;//Variaveisdecontroleparaiteracaonoslacosforinti=0,j=0;//Variaveisutilizadasparaarmazenaraatualposicaodoelevadoreaposicaodesejadapelousuariointactual_pos=0,des_pos=0;//Vetoresparaarmazenarasposicoesdoelevador(sensor)eaposicaodesejadapelousuario(pedido)intsensor[4];intpedido[4];//Iniciodafuncaovoidsetupvoidsetup(){//Initializationof20x4LCDlcd.begin(20,4);//InicializaoDisplaydeLCD//Initializingthe20x4LCDlcd.init();//LCDBacklightActivationlcd.backlight();//Activatingthecursortothe0.0positionofthe20x4LCDlcd.setCursor(0,0);//Configurandoospinosdosbotoescomoentradaepullupfor(inti=2;i{pinMode(i,INPUT_PULLUP);}//Configurandoospinosdosbotoescomoentradaepullupfor(inti=6;i{pinMode(i,INPUT);}for(inti=0;i{pedido[i]=1;}//ConfiguracaodospinosdecontroledosmotorescomosaidasdigitaispinMode(10,OUTPUT);pinMode(11,OUTPUT);//ComandosparaqueomotorfiqueparadodigitalWrite(10,LOW);digitalWrite(11,LOW);}voidloop(){//Leituradosbotoesselecionadospelousuariodoelevadorfor(intbotao=2;botao{//Armazenaoestadodecadabotaonovetorpedidopedido[botao-2]=digitalRead(botao);//Verificaqualoandardesejadoparaoelevadorsubirif(pedido[botao-2]==0){des_pos=botao-1;controle=0;}}//Verificaseumdosbotoesfoipressionadoeseavariaveldecontrolepossuivaloriguala0if((pedido[0]==0||pedido[1]==0||pedido[2]==0||pedido[3]==0)&&controle==0){//Setavalueof1tothecontrolvariabletoallowthecodestreamtoentertheconditiononlyoncecontrole=1;//Executetheloopcommandswhilethecontrolvariableisequalto1//Readingofallsensorstodeterminethecurrentpositionoftheelevatorfor(intsens=6;sens{sensor[sens-6]=digitalRead(sens);}//Comparingthecurrentelevatorpositionwiththedesiredpositionfor(i=0;i{if(sensor[i]==1){break;}}for(j=0;j{if(pedido[j]==0){break;}}if(j==i){digitalWrite(10,HIGH);digitalWrite(11,HIGH);}if(j{digitalWrite(10,LOW);digitalWrite(11,HIGH);}if(j>i)//2>0{digitalWrite(10,HIGH);digitalWrite(11,LOW);}controle=0;not_pos=0;while(not_pos!=1){//Determinandoaposicaoatualdoelevadorfor(intsens=6;sens{bools=digitalRead(sens);if(s==1){actual_pos=sens-5;}}if(actual_pos==des_pos){digitalWrite(10,HIGH);digitalWrite(11,HIGH);not_pos=1;for(inti=0;i{pedido[i]=1;sensor[i]=0;}break;}}}}接下来,我们将解释该项目的编程逻辑。最初,我们插入了库来处理LCD功能、I2C通信,并创建了LCD对象。LCD已配置为20x4,I2C通信地址为0x27。声明项目中使用的所有变量和向量。之后,我们有设置功能。执行设置功能以初始化LCD并将数字引脚配置为输入和输出以控制项目的设备。例如,在这些设备中,我们有直流电机、簧片开关传感器和控制按钮。//Startofvoidsetupfunctionvoidsetup(){//Initializationof20x4LCDlcd.begin(20,4);//InicializaoDisplaydeLCD//Initializingthe20x4LCDlcd.init();//LCDBacklightActivationlcd.backlight();//Activatingthecursortothe0.0positionofthe20x4LCDlcd.setCursor(0,0);//Configuringbuttonpinsasinputandpullupforthebuttonsfor(inti=2;i{pinMode(i,INPUT_PULLUP);}//Configuringbuttonpinsasinputforthesensorsfor(inti=6;i{pinMode(i,INPUT);}for(inti=0;i{pedido[i]=1;}//ConfigurationofmotorcontrolpinsasdigitaloutputspinMode(10,OUTPUT);pinMode(11,OUTPUT);//CommandsfortheenginetostopdigitalWrite(10,LOW);digitalWrite(11,LOW);}现在让我们讨论循环函数。我们实现了电梯控制的完整逻辑。voidloop(){//Leituradosbotoesselecionadospelousuariodoelevadorfor(intbotao=2;botao{//Armazenaoestadodecadabotaonovetorpedidopedido[botao-2]=digitalRead(botao);//Verificaqualoandardesejadoparaoelevadorsubirif(pedido[botao-2]==0){des_pos=botao-1;controle=0;}}//Verificaseumdosbotoesfoipressionadoeseavariaveldecontrolepossuivaloriguala0if((pedido[0]==0||pedido[1]==0||pedido[2]==0||pedido[3]==0)&&controle==0){//Setavalueof1tothecontrolvariabletoallowthecodestreamtoentertheconditiononlyoncecontrole=1;//Readingofallsensorstodeterminethecurrentpositionoftheelevatorfor(intsens=6;sens{sensor[sens-6]=digitalRead(sens);}//Comparingthecurrentelevatorpositionwiththedesiredpositionfor(i=0;i{if(sensor[i]==1){break;}}for(j=0;j{if(pedido[j]==0){break;}}if(j==i){digitalWrite(10,HIGH);digitalWrite(11,HIGH);}if(j{digitalWrite(10,LOW);digitalWrite(11,HIGH);}if(j>i)//2>0{digitalWrite(10,HIGH);digitalWrite(11,LOW);}controle=0;not_pos=0;while(not_pos!=1){//Determinandoaposicaoatualdoelevadorfor(intsens=6;sens{bools=digitalRead(sens);if(s==1){actual_pos=sens-5;}}if(actual_pos==des_pos){digitalWrite(10,HIGH);digitalWrite(11,HIGH);not_pos=1;for(inti=0;i{pedido[i]=1;sensor[i]=0;}break;}}}}第一个活动是读取4个按钮并将它们的状态存储在“pedido”向量中。在循环内部,我们通过按下的按钮检查需要哪个楼层。以下条件检查是否按下了其中一个按钮以及控制变量是否等于1。“controle”变量用于允许在按下其中一个按钮时执行一次条件代码。当电梯到达用户选择的位置时,码流会重新进入该状态。以下循环用于读取当前的电梯位置和用户所需的楼层。这两条信息将用于确定电机向上或向下到所需楼层的旋转方向。我们有3个条件。请参阅下面的代码块。它们将在下面解释。当j等于i时,表示电梯已经在用户请求的楼层上。在这种情况下,发动机必须保持停止状态。当j小于I时,表示电梯位于用户请求的上方位置。在这种情况下,电机必须旋转才能降低电梯。最后,我们有最后一个条件,即j大于i。在这种情况下,电梯位于用户请求的位置下方。因此,电机必须转动才能使电梯上升。下一步是监控电梯的位置,并在到达用户选择的楼层时停止电机。这个过程是通过读取传感器来完成的。请参阅下面的代码块。只要not_pos变量不等于1,代码就会执行。当电梯到达所需位置时,该变量的值将从0变为1。下面的条件用于读取电梯的当前位置。如果为真,则直流电机必须进入和退出回路。之后,它会退出while,返回到voidloop函数的开头,等待用户选择一个新的位置。这是设计用于控制Arduino电梯的整个结构。您可以测试其他逻辑编程并在您的项目中实现新功能。如果您对此项目有任何想法、意见或问题,请在下方留言。
本方案是一个智能家居设备来直观地向您显示/发出您所在城市的空气质量状态和天气预报的信号。好吧,天气总是让你猜测,但很高兴这样的设备可以更好地可视化天气或空气质量,这样你就会知道你是否需要口罩、雨伞、外套、雪铲、一些纸巾(用于高花粉)或出门时穿凉鞋和短裤。印度的一些地区,如德里,污染严重,容易出现极端气候,因为它受靠近喜马拉雅山和塔尔沙漠的影响很大,导致它经历了两种极端天气,气压变化很大。所以最好检查这个项目并为天气紧急情况做好准备。使用的技术:基于涂鸦智能物联网和云平台,可以简单快速地开发此类解决方案。本方案将介绍如何使用涂鸦云API和物联网平台快速完成一个智能气象灯原型。您不需要有任何Arduino编程经验或本教程的任何焊接经验,它纯粹是使用简单的Python语言。涂鸦物联网和云是什么?涂鸦是全球领先的物联网云平台,连接品牌、OEM、开发商和零售连锁店的智能需求。该平台为开发者提供一站式的物联网PaaS级解决方案,包含硬件开发工具、全球云服务、智慧商业平台开发,涂鸦提供从技术到营销渠道的全方位生态赋能,打造全球领先的物联网云平台。甚至您可以使用涂鸦云平台将硬件连接到云端,然后使用他们的API来控制和监控这些对象。我们先搭建一下,先从涂鸦平台开始,然后跳过硬件。第一步:涂鸦云和物联网平台搭建i)在涂鸦平台上创建一个帐户ii)点击左侧导航栏中的产品>开发>创建,你会看到一长串设备类别会出现(我们将选择环境检测器)iii)在此之后填写产品的详细信息并选择Wifi连接这样做的主要原因是你有一个可以用涂鸦云API更新其值的应用程序(意味着这只是一个移动应用程序的虚拟设备,但会被云API控制,不要害怕,您无需购买任何此类传感器)iv)将所有这些标准DP添加到我们创建的设备中(请注意,您可以添加自己的自定义DP但CloudAPI无法识别它,它仅适用于标准DP)v)您可以使设备面板具有交互性和美观性,我们将修改默认的应用面板以满足我们的需要(此步骤完全可选/可以轻松完成)vi)接下来单击左侧导航栏中的Cloud>Development,然后选择TRIALEDITION选项:vii)在下一页选择试用版并点击立即购买。别担心,您不必添加信用卡,整个过程是完全免费的。viii)创建一个云开发项目现在我们需要创建一个云项目。单击页面右侧的创建云项目。在对话框中,填写表格并点击创建。对于行业选择智能家居,为发展方法选择自定义,并可用区域选择与您所在地区的服务器地址。在授权API服务页面,您可以看到默认选择了一些API服务(在右侧),但我们还需要添加其他API。我们正在寻找的是DeviceStatusNotification、IndustryProjectClientService、WeatherService和LBSAPI。选择它们并点击授权。事实上,您可以选择所有相关的以供将来进行自定义。之后,您将看到用于创建资产和用户的项目配置页面,请记住我们将使用相同的电子邮件和密码进行CloudSDK和API身份验证,即使在移动应用程序上也是如此。ix)在CloudApp控制台中,转到设备>添加设备和我的产品,然后选择我们在前面步骤中制作的IoT设备,在您安装的涂鸦设备管理应用程序上,您可以在您的资产中检查您的设备,并且将能够看到如前面步骤所示的移动应用程序面板。第二步:涂鸦云设备控制SDK硬件:我们将使用RaspberryPi3B+,您也可以使用高于它的任何版本,对于LED阵列,我将使用MatrixCreatorBoard,该板是我最喜欢的所有板,具有许多板载传感器和35RGBw发光二极管。推荐5V3AMicroUSB电源,现在使用安装了最新版本RaspberryPiOS的MicroSD卡。使用Etcher.io刷写和烧录树莓操作系统,方便刷写。刷入操作系统后,第一次尝试连接显示器,然后您可以通过VNC或SSH远程访问设备。为了通过代码与Matrix设备接口,让我们安装MatrixLitepython3包以下是该项目令人兴奋的部分,您编写一些简单的基于Python的代码并通过云连接到您的设备并控制并了解其状态,我们还需要安装Tuya-iot-python-sdk包。打开一个新的终端窗口并运行以下命令:脚本非常简单易懂,我们先做涂鸦授权我们将需要我们的位置数据才能使用涂鸦天气API,所以我们将首先获取我们的IP地址,然后使用涂鸦LBS服务API找出我们的坐标,现在我们将使用天气API获取我们所在位置的天气和空气质量数据根据结果,这里的天气条件编号,我们将更改设备颜色,全天候条件编号在101-146之间,从多云到大雪条件#Matrixdevicepythonwrappersalreadyhaveallcolourdefinedwhichareused#heredefweatherColorStatus(condition_num):ifcondition_num==120:led.set(color.SUNNY_120)returnTrueifcondition_num==146:led.set(color.CLEAR_146)returnTrueifcondition_num==139:led.set(color.LIGHT_RAIN_139)returnTrueifcondition_num==132:led.set(color.OVERCAST_132)returnTrueifcondition_num==141:led.set(color.MODERATE_RAIN_141)returnTrueifcondition_num==101:led.set(color.HEAVY_RAIN_101)returnTrueifcondition_num==129:led.set(color.PARTLY_CLOUDY_129)returnTrueifcondition_num==140:led.set(color.HAZE_140)returnTrueifcondition_num==121:led.set(color.FOG_121)returnTrueifcondition_num==109:led.set(color.DUST_109)returnTrueifcondition_num==103:led.set(color.SANDSTORM_103)returnTrueifcondition_num==105:led.set(color.SNOW_105)returnTrueelse:led.set('black')returnFalse好了,当您在设备上运行脚本时,它应该会使用CloudAPI自动获取数据并更新灯的状态。您现在也可以尝试组合空气质量数据API,但我觉得如果我们分别运行两个API脚本会更有用,否则颜色会让人难以理解。结果:该方案中所用到的代码如果您对此项目有任何想法、意见或问题,请在下方留言。
这个小型电路板通过显示臭氧、二氧化碳、温度和湿度数据的交互式仪表板帮助AQI监测。背景近年来,由于大规模的工业化和车辆运输的增加,导致全球变暖的二氧化碳等气体浓度的增加严重影响了空气,这是目前国际社会的一个主要关注点。第二个主要因素是臭氧层的消耗,这也是导致全球变暖和疾病的原因,因为它在阻挡危险的阳光方面非常有用。这就是为什么我们听到太多关于冰川融化、不断变化的天气模式和烟雾的原因。许多国家正试图通过各种方法来降低全球变暖参数,例如植树和防止大量使用纸张。导致全球变暖的因素有很多。大量使用CFC(氯氟烃)生成设备、运输负荷过重和森林砍伐是一些最大的原因。作为一名工程师,我就如何为提供有助于减少全球变暖的解决方案做出贡献进行了很多集思广益,然后在我脑海中闪现了一个想法,那就是我为什么不做一个物联网项目,让设备可以在其中监测气体air并将数据发送到云服务器!一种可以部署到无人机上的设备,该无人机将在特定区域飞行,以从传感器获取空气质量参数。它将有助于了解哪些领域需要采取行动来减少全球变暖。制造设备在某种程度上很容易,但将其部署到云服务器并设计显示传感器值的交互式仪表板是一项繁琐的任务,实际上是一件令人头疼的事情。但是非常感谢Grandeur和他们惊人的云服务,这确实节省了我的时间。我不必担心存储、传感器数据发送/接收或部署程序。它变成了小菜一碟。第一步:设置硬件我们的硬件由三个传感器组成。臭氧传感器、二氧化碳传感器和温湿度传感器。您也可以使用其他传感器。但是,对于这个项目,我们使用了三个传感器。原理图和印刷电路板(PCB)是在EasyEDA-在线PCB设计和电路模拟器上设计的。这是一个开源软件,可以让你的设计很棒。项目示意图如下所示DHT22和MQ131可以工作在3.3V电压,可以通过NodeMCU提供,其中MG811工作在5-6V。因此,您可以使用7805或7806。请记住,MG811和MQ131等气体传感器需要一些时间才能正常工作,因为它们利用时间进行加热。因此,如果您在开始时没有获取传感器数据,请不要担心。您必须等待5-10分钟才能进行预热程序(这取决于环境温度)。为了印刷印刷电路板(PCB),下面给出了顶层丝和底层图像:如此漂亮和干净的设计,你甚至见过。在向供应商下达PCB订单时,请尽可能使您的PCB为绿色,因为大部分PCB区域是接地的,因此这将有助于您快速焊接组件。不要忘记在板上焊接母接头,然后将元件放入这些接头中。它有助于调试,还有助于在设备和组件损坏时轻松更换它们。这是下面给出的设计PCB的3D模型:最终效果:第二步:硬件的固件现在您已经设置了Grandeur,是时候设置我们项目的固件了。固件包括从传感器获取数据并将其发布到仪表板应用程序获取数据的云端。Grandeur为ESP8266编码提供SDK。如需固件编码和设置,请下载并安装最新版本的软件|Arduino根据您的操作系统。在此之后,打开ArduinoIDE并将您的NodeMCU与您的计算机系统连接。转到工具→端口并选择出现在那里的端口,例如COM3。之后,转到Tools→Board→ESP8266Boards并选择NodeMCU1.0。您可以根据您的电路板型号和版本选择任何其他。现在打开工具→管理库并为DHT22传感器安装以下库:对于MG811,我建议您通过CO2SensorGitHubRepo获得令人惊叹且易于使用的二氧化碳传感器库。下载并解压缩文件后,请将CO2传感器文件夹放入ArduinoLibraries文件夹中,在我的情况下如下所示:现在在编码部分,我假设您已经设置了HelloWorldwithGrandeur–Hackster.io中提供的initial.ino代码。现在我们要修改.ino文件。请记住,此存储库中提供了所有代码文件和原理图,因此您只需获取文件并快速开始,因为所有更改都已完成。但是,我真的希望您了解我们在这段代码中所做的事情。在下面给出的代码中,我们正在设置我们的计时器来生成时间戳。因为我住在巴基斯坦,偏移量为(UTC+5或GMT+5)。因此,我添加了18000秒,即,您可以在此处根据您所在的地区设置偏移量。当您在设备上运行代码时,您会注意到CO2传感器值的波动。为了消除这些跳跃,移动平均算法在这方面非常有效。它在一个窗口中取值,取它们的平均值,然后给出一个非常平滑的图形。我们取了窗口大小=5,因为您可以看到数组中有5个值co2_values。这种惊人的信号处理技术基于这种方法:下面的函数用于以特定格式获取当前时间戳。它通过给出我们已经在上面的代码中设置的偏移量来提取本地时间。获取时间是一个经典的C++函数。不要忘记添加delay(1000)in获取时间戳。否则,您每次都会得到1stJanuary1970。传感器需要在空设置功能中定义的校准和预热。完成此操作后,下一部分变得非常简单,因为我们只需读取值、获取时间戳并将数据发布到Grandeur上的数据存储。温度以摄氏度(°C)提取,湿度以百分比(%)提取,二氧化碳数据以百万分之一(PPM)提取,臭氧数据以四个单位提取,如下所示:百万分率(PPM)十亿分之一(PPB)毫克每米立方(mg/m3)每米立方微克(μg/m3)从传感器读取所有数据后,insert调用该函数将数据推送到云数据存储中的传感器集合中。这就是Grandeur的神奇作用所在,您无需担心数据库设计、数据存储、检索、插入、更新或删除等。现在我们可以安全地上传代码了。只需单击ArduinoIDE左上角显示为右箭头按钮的上传按钮。现在您的代码将在几分钟内上传。成功上传代码后,转到工具→串行监视器,您将能够看到校准过程。记住一件事!!!在实验过程中,我观察到如果打开CO2传感器,臭氧传感器将无法校准。所以在校准和预热臭氧传感器的过程中,一定要关闭或拔出CO2传感器。完成后,您可以安全地插入MG811传感器。还要确保记住将代码中的API密钥、身份验证令牌、WiFiSSID和密码替换为您的代码,以确保硬件正常运行。现在一旦过程成功,这就是您将如何在串行监视器上看到您的成功!第三步:准备好我们的JS仪表板应用程序我们的设备端现在像摇滚明星一样工作。现在是设置应用程序端的时候了,其主要目的是从GrandeurDatastore获取传感器数据并向我们显示有关设备周围环境的关键信息。我们在main.js中所做的重要更改是添加了getAllData方法,该方法将为我们提供所有传感器数据点。它需要两个参数,即集合名称和我们必须执行的过程类型,这可能是获取最新数据、所有数据或特定传感器的数据。完整的方法见底下蓝字。到目前为止,我们已经设置了main.js文件。在index.html中,我们必须在仪表板上显示以下信息:最近的传感器数据温度和湿度与时间图臭氧浓度(PPB和每米立方微克)与时间图CO2浓度(PPM)与时间图对于图形绘制和数据表示,drawTableAndGraphs添加了以下加载图表和表格的方法。我们使用相同的getAllData方法从Grandeur数据存储中获取数据,然后绘制图形。所有的图表和表格都是异步加载的。第四步:测试应用程序并将其部署到云端最后!现在,我们距离登顶点仅几步之遥。剩下的事情是超级容易做的。我们必须首先从本地主机运行和测试应用程序,然后我们将在Grandeur上部署我们的应用程序。要在localhost上配置应用程序和测试,请提供以下命令:我们将通过GitHubPages完成项目部署这一步,这使得您项目的网站部署变得如此简单。因此,让我们按照部署步骤进行操作。如果您还没有完成这一步,请打开GitHub然后注册/登录。单击绿色按钮中的新建以及左上角的存储库。将存储库名称写入aqimonitoringsystem.github.io。添加readme.md、Javatemplate.gitignore和MIT许可证。在此之后单击创建存储库。制作好版本库后,请将Web文件夹中的所有文件上传到新制作的版本库中。之后,单击设置按钮并选择页面底部的GithubPages。选择主分支并保存。大约4-5分钟后,打开链接。您将能够看到您部署的网站。到此本方案就结束了。该项目所用到的一些代码如果您对此项目有任何想法、意见或问题,请在下方留言。
本方案使用AWSIoT-EduKit的可穿戴温度测量设备,它将数据上传到AWS云并根据温度指示LED条。背景在大流行的情况下老年人面临许多问题,通过这个项目我将分享解决的问题之一,即使用AWSIoTEduKit进行温度监控。更重要的是,我们可以连接脉搏血氧仪、心率传感器,因此我们将获得患者所需的所有数据以进行监控。covid-19的症状之一是发烧。所以他们必须不断检查温度。该项目将帮助他们指示温度并将值上传到AWS云中。当温度高于正常温度时显示红色,否则显示绿色。该项目是使用AWS云进行温度监控的示例模型。该项目使用AWSIoTEduKit、LM35和AWS服务器。lm35传感器可能不准确。命令行界面首先,我们必须安装AWSCLI和一个编程IDE(如vscode、arduino)。安装AWSCLI后打开终端(我正在使用ubuntu),并通过以下方式配置AWS然后,它会像这样显示并提供适当的数据要获取端点日期,请使用以下命令然后,在您的设备中使用凭据配置要配置AWSIoTEduKit,请打开ide(我正在使用platformio扩展名visualstudiocode),打开新窗口和新平台io终端,然后打开aws注册文件夹并使用此命令注册(在pio终端上)现在,我们必须配置AWSIoTEduKit,然后选择Componentconfig–>AmazonWebServicesIoTPlatformandopenAWSIoTEndpointHostname,输入您的端点地址并保存,现在我们必须AWSIoTEduKitConfiguration从菜单中设置wifi。设置您的WiFiSSID和WiFiPassword,提供适当的数据并保存。然后我们必须启用AWSIoTEduKitI/O端口。componentconfig->Core2forAWSHardwareenable并启用ExpansionportA,B,C编码要读取传感器,请添加这一行在这个函数中读取模拟值在这个函数中staticvoidpublisher(AWS_IoT_Client*client,char*base_topic,uint16_tbase_topic_len){charcPayload[100];int32_ti=0;IoT_Publish_Message_ParamsparamsQOS0;IoT_Publish_Message_ParamsparamsQOS1;paramsQOS0.qos=QOS0;paramsQOS0.payload=(void*)cPayload;paramsQOS0.isRetained=0;//temperaturesensorfloatsensor=Core2ForAWS_Port_B_ADC_ReadMilliVolts();inttemperature=sensor/10;if(temperature>37){Core2ForAWS_Sk6812_SetSideColor(SK6812_SIDE_LEFT,0xff0000);Core2ForAWS_Sk6812_SetSideColor(SK6812_SIDE_RIGHT,0xff0000);Core2ForAWS_Sk6812_Show();}else{Core2ForAWS_Sk6812_SetSideColor(SK6812_SIDE_LEFT,0x00ff00);Core2ForAWS_Sk6812_SetSideColor(SK6812_SIDE_RIGHT,0x00ff00);Core2ForAWS_Sk6812_Show();}cJSON*payload=cJSON_CreateObject();cJSON*Temp_level=cJSON_CreateNumber(temperature);cJSON_AddItemToObject(payload,"T-valueC",Temp_level);constchar*JSONPayload=cJSON_Print(payload);paramsQOS0.payload=(void*)JSONPayload;paramsQOS0.payloadLen=strlen(JSONPayload);//Publishandignoreif"ack"wasreceivedorfromAWSIoTCoresprintf(cPayload,"%s:%d","HellofromAWSIoTEduKit(QOS0)",i++);paramsQOS0.payloadLen=strlen(cPayload);IoT_Error_trc=aws_iot_mqtt_publish(client,base_topic,base_topic_len,¶msQOS0);if(rc!=SUCCESS){ESP_LOGE(TAG,"PublishQOS0error%i",rc);rc=SUCCESS;}ui_textarea_add("%s",(char*)JSONPayload,paramsQOS0.payloadLen);cJSON_Delete(payload);paramsQOS1.qos=QOS1;paramsQOS1.payload=(void*)cPayload;paramsQOS1.isRetained=0;//Publishandcheckif"ack"wassentfromAWSIoTCoresprintf(cPayload,"%s:%d","HellofromAWSIoTEduKit(QOS1)",i++);//sprintf(cPayload,Temp_level);paramsQOS1.payloadLen=strlen(cPayload);rc=aws_iot_mqtt_publish(client,base_topic,base_topic_len,¶msQOS1);if(rc==MQTT_REQUEST_TIMEOUT_ERROR){ESP_LOGW(TAG,"QOS1publishacknotreceived.");rc=SUCCESS;}}所以,我们将得到温度值。现在我们可以将代码上传到AWSIoTEduKit上传要编译固件,请在平台io终端上使用此命令上传固件现在准备连接温度传感器。连接AWSIoTEduKit具有ADC引脚,我们使用的是端口B。将传感器连接在其中。通过AWSIoTMQTT客户端订阅打开AWSIoTMQTTclient>Test>MQTT测试客户端,然后subscribe使用clientid。然后就可以看到AWSIoTEduKit发送的数据了可穿戴设备结论我们可以添加更多的传感器,通过云端监控患者的健康状况。所以我们可以及早采取预防措施。该方案所用到的代码如果您对此项目有任何想法、意见或问题,请在下方留言。
背景我的院子受到攻击。啄木鸟在我的甲板上钻孔,有什么东西住在(并摧毁)我的棚子下面,鼹鼠挖了一系列可以与大多数城市地铁系统相媲美的隧道。这就是为什么我使用RaspberryPi、Pi相机和一些机器学习来试图抓住我院子里的攻击者。更具体地说,这是我所做工作的高级概述。我在院子里放了一个树莓派。我将运动检测器连接到Pi。我将Pi相机连接到RaspberryPi。当探测器检测到运动时,检测系统会用Pi相机拍照。使用机器学习算法分析照片。如果照片包含动物,检测系统会存储照片并向自己发送通知。如果照片确实不含有动物,删除照片。第1步:连接让我们先谈谈如何将所有东西连接起来。对于这个项目,我使用了RaspberryPi4、PIR运动传感器(用于检测运动)、RaspberryPi相机(用于拍照)和BluesWirelessRaspberryPiStarterKit(用于无线蜂窝连接)。这是当它们全部连接在一起时的样子。如果您想为自己进行设置,您需要先将PiCamera连接到Pi上的PiCamera插槽。接下来,您需要通过排列直通接头将BluesWirelessNotecarrier连接到RaspberryPi的顶部。最后,您需要将您选择的运动传感器连接到Pi。一切就绪后,您就可以开始编码了。第2步:检测运动检测运动是我想要解决的第一个问题,因为我将其用作接下来发生的所有事情的触发器。另外,我使用的机器学习算法(我们将在第4步中讨论)是相当密集的处理器,所以我想确保我只在动物可能真的出现在图片中时才运行该过程。这是我最终使用的Python代码。这里的想法是通过每5秒检查一次它所连接的PiGPIO引脚的状态来检查运动传感器的状态。如果引脚被拉高,则意味着传感器检测到运动。当这种情况发生时,上面的代码只是打印一个用于调试的字符串,但在后面的部分中,我们将使用检测运动作为触发器来做更有趣的事情。如果您自己设置,请继续将此代码保存在您的Pi上的新Python文件中,例如pest.py,并使用python3pest.py.如果一切正常,您应该能够在传感器前挥手并查看Motiondetected终端输出。现在我们有了感知运动的代码,让我们继续下一个逻辑步骤,看看如何使用Pi相机。第3步:拍照为了使用机器学习分析图像,您需要一张图片。幸运的是,树莓派有一个通用的摄像头,效果很好,并且有很好的文档记录。注意:如果您不熟悉Pi相机,请确保在继续之前启用Pi上的相机。这是我用来拍照的代码。有几件事需要解释一下。首先,当我将图像保存到磁盘时,该get_image_name函数会执行一些逻辑来确定图像的名称。这里的代码以当前目录中的图像数量命名图像images,最终会创建一个如下所示的文件结构。其余代码是相当标准的Pi相机逻辑,但我将添加一些有关此部分的注释。camera.rotation=180翻转图像。我将相机倒置安装在我的院子里,所以如果你安装得当,你可以移除那条线。time.sleep(2)在拍照之前,让相机两秒钟来感知光线水平,这是PiCamera的文档所推荐的。camera.close()如果您在一个程序中拍摄多张照片,则需要。如果你忘记了这一点,你会得到一个错误,它没有为你指明正确的方向。最后,结束take_picture返回一个图像名称,这将有助于我们下一步访问照片以查看它是否包含动物。如果我们将调用添加take_picture到我们的函数中,这看起来会是什么样子main。第4步:使用机器学习分析图片机器学习最常见的应用之一是图像分类——或者说能够拍摄图像并找出其中的内容。图像分类过程依赖于一个模型,该模型是一个经过训练可以识别特定类型模式的文件。您可以使用EdgeImpulse等平台自行构建此文件,也可以在TensorFlow等平台上查找预训练模型。接下来,您需要使用以下代码来运行检测器本身。我将其设置得很低(60%),因为我很乐意接受任何类似动物的东西,尤其是在试验时。该load_and_run_detector_batch函数返回一个图像数组(您可以一次处理多个图像),每个图像包含一个由MegaDetector检测到的事物的数组。这意味着我们需要一些代码来解析JSON并确定MegaDetector是否检测到动物。这段代码看起来有点像这样。把所有东西放在一起,如果我们缩小到我们的main函数,我们更新后的代码现在看起来像这样。有了这个,我们现在有了一种算法,可以检测运动、拍照并分析这些照片以确定它们是否包含动物。第5步:放置在户外RaspberryPi不防水,它的相机也不防水,所以我想构建一些可以为我的硬件提供一点保护的东西——即使它有点笨重。大块塑料是AwclubABS塑料接线盒,它在固定Pi本身方面做得非常好。我确实必须在顶部钻一个孔才能将电源线连接到Pi。然后我用胶带将Pi相机和我的传感器连接到我的甲板(最终是我院子周围的各种其他表面),效果出奇地好。从长远来看,我很想提出一种解决方案,既能保护相机,又能拍出好照片,但就我的简单目的而言,这种设置效果很好。我使用标准USB-C电缆和一系列延长线为Pi供电。我可以用电池为所有东西供电,但当前的ML算法对处理器来说相当沉重,所以我决定确保Pi不断充满电,并且暂时忍受笨重的电源线。潜在的改进更好的运动传感器我从亚马逊购买的廉价运动传感器可以工作,但它非常敏感——即使在其最低灵敏度配置下也是如此。当我的院子里没有任何事情发生时,这件事每隔几秒钟就会触发一次,因此传感器要么正在接收超自然活动,要么太敏感而无法在户外使用。更高效的机器学习模型微软的MegaDetector很棒,但它显然不是为在RaspberryPi上运行而设计的。理想情况下,我会自定义训练一个模型来寻找小型啮齿动物——如果我从当前设置中获得足够多的图像,我可能会尝试这样做。更好的防风雨需要找到一种方法将传感器和相机包含在一个案例中,同时确保它们继续按预期工作。更注重电池如果我能找到或构建一个更高效的ML模型,那么我可以轻松地完全依靠电池或太阳能来运行这个项目。该方案中用到的一些代码如果您对此项目有任何想法、意见或问题,请在下方留言。
在这个项目中,我们将使用在线天气服务在图形LCDPhidget(LCD1100)上显示当地天气和时间。此项目的代码可用C#和Python编写。补给品使用以下硬件:VINT集线器Phidget(HUB0000_0)图形LCD小工具(LCD1100_0)第1步:设置将您的图形LCDPhidget连接到任何端口上的VINT集线器。第2步:概述如上图,这个项目主要有两个部分:访问天气数据显示天气数据让我们先来看看访问数据。第3步:访问天气数据我们将使用OpenWeather访问我们当地的天气预报。他们提供免费访问超过200,000个城市的天气预报。支持以下格式:JSONXMLHTML对于这个项目,我们将使用XML格式。为了访问天气数据,您必须创建一个免费帐户并获得一个API密钥。第4步:创建您的帐户按照此链接创建一个免费帐户并获取API密钥。获取API密钥后,您将可以通过此URL访问数据:api.openweathermap.org/data/2.5/weather?q={cityname}&appid={APIkey}将{cityname}替换为您的城市,将{APIkey}替换为您的API密钥。例如,这就是我们的样子:http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml尝试在任何网络浏览器中输入您的URL。您将看到如上所示的XML格式的天气数据。下一步是创建一个程序,该程序可以解析数据以便显示。第5步:读取/解析天气数据-C#对于C#,您可以使用XMLTextReader类来快速解析XML数据:staticstringreadXML(stringarg1,stringarg2){StringURLString="http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml";XmlTextReaderreader=newXmlTextReader(URLString);reader.ReadToFollowing(arg1);reader.MoveToAttribute(arg2);returnreader.Value;}您可以像这样使用上面的函数:staticvoidupdateWeather(LCDlcd){stringcity=readXML("city","name");stringtemperature=readXML("temperature","value");stringhumidity=readXML("humidity","value");stringwindspeed=readXML("speed","value");stringdescript=readXML("weather","value");stringiconID=readXML("weather","icon");}还有其他可用的值(日出时间、日落时间、压力等),但对于这个项目,我们将只显示值的一个子集。第6步:读取/解析天气数据-Python对于Python,您可以使用ElementTreeXMLAPI来快速解析数据:importxml.etree.ElementTreeasETfromurllib.requestimporturlopenurl=urlopen('http://api.openweathermap.org/data/2.5/weather?q=Calgary&APPID=fakeid111111111111111111111111111&units=metric&mode=xml')tree=ET.parse(url)root=tree.getroot()defreadXML(arg1,arg2):foriteminroot.iter(arg1):returnitem.get(arg2)print(readXML('city','name'))print(readXML('temperature','value'))print(readXML('humidity','value'))print(readXML('speed','value'))print(readXML('weather','value'))print(readXML('weather','icon'))还有其他可用的值(日出时间、日落时间、压力等),但对于这个项目,我们将只显示值的一个子集。第7步:OpenWeather图标您可能已经注意到我们存储了上面的iconID。该值表示描述当前天气的图像。您可以在此处查看图标。GraphicLCDPhidget能够显示位图,我们可以在我们的程序中轻松实现这些图标。如果您还没有在GraphicLCDPhidget上探索位图,请查看此项目。网上有很多像素艺术程序,我们使用了Piskel。由于简单的导出到C文件选项,重新创建OpenWeatherMap图标很容易。位图的结果在下面的github存储库中提供。第8步:显示数据-C#现在我们已经收集了天气数据,最后一步是将其显示在GraphicLCDPhidget上:staticvoidupdateWeather(LCDlcd){stringcity=readXML("city","name");stringtemperature=readXML("temperature","value");stringhumidity=readXML("humidity","value");stringwindspeed=readXML("speed","value");stringdescript=readXML("weather","value");stringiconID=readXML("weather","icon");if(temperature.Length>5){temperature=temperature.Remove(5);}//Temperatureboxintx=(44-((temperature.Length*6)+12))/2;lcd.WriteText(LCDFont.Dimensions_6x12,x,15,temperature);lcd.WriteText(LCDFont.User1,x+temperature.Length*6,15,"0");lcd.WriteText(LCDFont.Dimensions_6x12,x+temperature.Length*6+6,15,"C");//Weatherimage+descriptboxbyte[]temp;if(iconID=="01d")temp=_01d;elseif(iconID=="02d")temp=_02d;elseif(iconID=="03d")temp=_03d;elseif(iconID=="04d")temp=_04d;elseif(iconID=="09d")temp=_09d;elseif(iconID=="10d")temp=_10d;elseif(iconID=="11d")temp=_11d;elseif(iconID=="13d")temp=_13d;elseif(iconID=="50d")temp=_50d;elseif(iconID=="01n")temp=_01n;elseif(iconID=="02n")temp=_02n;elseif(iconID=="10n")temp=_10n;elsetemp=unknown;lcd.WriteBitmap(2,31,32,32,temp);lcd.WriteText(LCDFont.Dimensions_5x8,40,42,descript);//Extrainfoboxlcd.WriteText(LCDFont.Dimensions_5x8,50,11,"Humidity:"+humidity+"%");lcd.WriteText(LCDFont.Dimensions_5x8,50,20,"Wind:"+windspeed+"km/h");}staticvoidredraw(LCDlcd){lcd.Clear();//drawbordersaroundoutsidelcd.DrawLine(0,0,127,0);lcd.DrawLine(0,0,0,63);lcd.DrawLine(127,0,127,63);lcd.DrawLine(0,63,127,63);//drawbordersinsidelcd.DrawLine(0,10,128,10);lcd.DrawLine(43,10,43,30);lcd.DrawLine(1,30,127,30);lcd.WriteText(LCDFont.Dimensions_5x8,1,1,DateTime.Now.ToString("ddd,MMMdhh:mm:sstt"));updateWeather(lcd);lcd.Flush();}下面是对上面代码的快速回顾:重绘此函数在图形LCD上绘制主要边界。它还打印当前时间并调用updateWeather程序。更新天气此函数将来自OpenWeather服务的数据排列到图形LCD上。第9步:显示数据-Python现在我们已经收集了天气数据,最后一步是将其显示在GraphicLCDPhidget上:defupdateWeather():city=readXML('city','name')temperature=readXML('temperature','value')humidity=readXML('humidity','value')windspeed=readXML('speed','value')descript=readXML('weather','value')iconID=readXML('weather','icon')if(len(temperature)>5):temperature=temperature[:-1:]#removelastcharsoitfits#temperatureboxx=(44-((len(temperature)*6)+12))/2x=int(x)#forcetointlcd.writeText(LCDFont.FONT_6x12,x,15,temperature)lcd.writeText(LCDFont.FONT_User1,x+len(temperature)*6,15,"0")lcd.writeText(LCDFont.FONT_6x12,x+len(temperature)*6+6,15,"C")#Weathericon+descriptboxtemp=[]if(iconID=="01d"):temp=_01delif(iconID=="02d"):temp=_02delif(iconID=="03d"):temp=_03delif(iconID=="04d"):temp=_04delif(iconID=="09d"):temp=_09delif(iconID=="10d"):temp=_10delif(iconID=="11d"):temp=_11delif(iconID=="13d"):temp=_13delif(iconID=="50d"):temp=_50delif(iconID=="01n"):temp=_01nelif(iconID=="02n"):temp=_02nelif(iconID=="10n"):temp=_10nelse:temp=unknownlcd.writeBitmap(2,31,32,32,temp)lcd.writeText(LCDFont.FONT_5x8,40,42,descript)#Extrainfoboxlcd.writeText(LCDFont.FONT_5x8,50,11,"Humidity:"+humidity+"%")lcd.writeText(LCDFont.FONT_5x8,50,20,"Wind:"+windspeed+"km/h")defredraw():lcd.clear()#Drawbordersaroundoutsidelcd.drawLine(0,0,127,0)lcd.drawLine(0,0,0,63)lcd.drawLine(127,0,127,63)lcd.drawLine(0,63,127,63)#drawbordersinsidelcd.drawLine(0,10,128,10)lcd.drawLine(43,10,43,30)lcd.drawLine(1,30,127,30)timeStr=datetime.now().strftime("%a,%b%d%I:%M:%S%p")lcd.writeText(LCDFont.FONT_5x8,1,1,timeStr)updateWeather()lcd.flush()下面是对上面代码的快速回顾:重绘此函数在图形LCD上绘制主要边界。它还打印当前时间并调用updateWeather程序。更新天气此函数将来自OpenWeather服务的数据排列到图形LCD上。第10步:主循环最后要做的是创建一个主循环,按设定的时间表更新LCD。以下是我们的建议:每秒:更新LCD上的时间每15分钟:更新LCD上的天气状态创建一个每秒循环一次的无限循环。创建一个计数器来跟踪循环,当计数器达到900(900秒是15分钟)时更新天气。第11步:完成该项目的完整代码可在此处获得:https://github.com/phidgeteer/LCDWeather.git如果您有任何问题,请在下面发表评论!
在这个项目中,我们将创建一个无线风扇,您可以通过WiFi使用手机完全控制它。您可以左右旋转,上下倾斜,选择风扇转速和转速。我们将使用带有台式PC风扇和几个电机的ESP32来轻松实现这一目标。我制作了一个视频,其中介绍了整个项目,并非常清楚地解释了每个步骤。因此,如果您想要视频版本,我强烈建议您观看视频,因为它更容易理解。让我们开始吧!项目演示:补给品以下是此项目所需的所有组件的列表:140mm风扇,我使用的是NoctuaNF-A14。我建议使用尽可能高的RPM。此处使用的风扇转速为3000RPM。Nema17步进电机,用于风扇的旋转。A4988步进电机驱动器,用于驱动和控制步进电机。DS04-NFC伺服电机,用于倾斜运动。ESP32作为微控制器,它内置了无线连接所需的WiFi。可提供5安培电流的12伏电源。我使用了带有电源插孔DC电缆的电源线。LM2596降压转换器,将12v降压到5v,因为伺服和微控制器在5v上运行。风扇和步进电机需要12v。100uF电容,用于过滤任何电压尖峰的电源。2个开关。第1步:面包板接线第一步是在面包板上将所有东西连接在一起。按照接线图小心地将所有东西连接在一起。第2步:电话设置(Blynk)为了使用手机控制风扇,我们将使用Blynk。这是一个非常易于使用的平台,允许您使用WiFi从手机控制Arduino板。首先,您需要在手机上安装Blynk应用程序。第3步:创建一个新的Blynk项目在您的手机上安装Blynk应用程序后。创建一个新项目。选择一个项目名称。选择“ESP32DevBoard”作为设备。选择Wi-Fi作为连接类型。第4步:添加所有小部件插入您在图像中看到的相同小部件,并确保所有虚拟引脚与图像匹配。您将需要两个按钮用于向上和向下倾斜。风扇速度滑块。确保滑块范围从0到4095。用于打开和关闭自动模式的按钮。确保它是一个开关而不是一个按钮。另一个用于旋转速度的滑块。确保滑块范围在50到300之间。左右转动风扇的两个按钮。两个最终按钮用于设置旋转的开始和结束位置。请记住,所有虚拟引脚都需要与您在图像中看到的内容相匹配。添加所有这些小部件后,转到项目设置并确保“连接应用程序时通知设备”已打开。第5步:Arduino草图需要的代码库所有这些库都可以使用ArduinoIDE库管理器轻松安装。Blynk由弗拉基米尔Shymanskyy。ESP32Servo由KevinHarrington和JohnK.Bennett编写。从这个存储库中获取Arduino草图。您只需要在草图中更改3个变量:auth这是您在手机上的Blynk应用程序上创建项目时通过电子邮件收到的Blynk身份验证代码。ssid你的WiFi名称。传递您的WiFi密码。完成这些更改后,将草图上传到ESP32。第6步:面包板演示/测试一旦代码被上传并且所有东西都连接到面包板上。连接电源并使用开关打开它。您现在可以打开您创建的Blynk应用程序并连接到ESP32。连接后,您将能够使用所有小部件并控制风扇!第7步:条板版一旦您确认在面包板版本上一切正常。您可以创建一个条板版本。这将使它具有更小的占地面积并且非常易于使用,因为您只需将组件连接到条形板,而不必担心到处都有电线。第8步:3D打印!如果你有一台3D打印机。您可以在此处下载所有3D模型。打印所有部分。对于电机轴连接器、顶部和左侧风扇附件,在孔中使用3毫米螺纹插入螺母以增加稳定性。从照片中可以看到,组装风扇。第9步:完成!您现在已经创建了自己的无线风扇!您可以使用手机轻松控制。如果有任何不清楚的地方,我强烈建议您观看视频,如果您有任何问题,欢迎留言评论交流。
1.准备使用带有“内置”Attiny85的设备如果已经安装了带有micro的设备并将其用于我们的项目,我们将需要以下内容:-下载ArduinoIDE:https://www.arduino.cc/en/software我们下载所需的版本,然后我们需要进行初始配置。-添加对ATTINY85的支持打开下载的程序,将打开一个带有空白项目的窗口。我们继续在文件选项卡中选择首选项选项。打开窗口后,复制并粘贴以下URL:https://drazzy.com/package_drazzy.com_index.json如果我们已经输入了一个URL,则不必删除它,我们只需在下面添加新的URL。我们对所有窗口给予OK以保存更改。然后我们必须去工具-板-卡管理器。当卡管理器打开时,我们需要寻找AttinyCore并安装它以支持我们的ATTiny85。完成此操作后,我们将支持对集成到卡中的微控制器进行编程。现在我们需要安装NeoPixels库才能轻松使用它们。这是通过程序-包含库-管理库完成的。我们搜索NeoPixel并安装了如下所示的库。我们还需要安装RTClib库以获得卡集成的实时时钟支持。完成此操作后,我们就可以开始对卡进行编程了。ArduinoIDE的好处是有许多库可用于以非常简单的方式执行功能或集成外围设备,您可以根据需要安装任意数量的库,因为这些已安装在PC上,但是在将它们集成到项目中时,您必须小心,因为这些会消耗微控制器的资源,我们很容易用完空间。2.创建一个程序,编译并上传到微控制器运行。要创建Arduino程序,我们必须首先集成我们为其下载的库,您可以在草图的开头复制以下文本而不删除任何内容。#include#include#defineNUM_LEDS54#定义按钮4RTC_DS3231实时时钟;Adafruit_NeoPixel条=Adafruit_NeoPixel(NUM_LEDS,1,NEO_GRB+NEO_KHZ800);现在您已准备好编写程序并利用所有功能对ATtiny85微控制器进行编程,您可以按照本教程将Arduino用作程序员。用作另一个微控制器的显示器:您可以通过将与NeoPixels数据对应的引脚焊接到“显示器”焊盘来使用任何微控制器的显示器,您也可以通过焊接到按钮引脚来获取卡上按钮的输入。请勿安装ATTINY85以使用外部显示输入图一图二-要打开卡,只需将USB电缆连接到卡的微型USB端口,另一端连接到任何可用的USB端口。-您将看到欢迎消息,然后将显示由于缺陷或用户在最后一次配置中保存的颜色和亮度设置的最后一小时。-要将卡垂直放置,请按照图1中的说明卸下支架。然后在连接USB电缆的情况下,如图2所示从底部向上滑动支架的凹槽。-要调整时间,只需按下卡片顶部的OPTIONS/ENTER按钮,如图1所示。输入选项后,您可以松开按钮更改选项,只需按下按钮,该选项将更改为间隔直到其最大选项,然后再次重新启动到初始选项,一旦您选择了所需的选项,松开按钮,然后4秒.它将自动前进到下一个选项。-选项如下:“CO01”在可用的四种颜色中选择所需的颜色;红、绿、蓝、白。"BR01"表示LED亮度的强度选项从2到25,后者是最强烈的。“HR00”选项以24小时格式设置时间。“MI00”选项设置分钟。“DION”控制是否显示时间如果选择不显示时间按下按钮显示时间重新显示时间无限期按下按钮5秒,直到显示“DION”屏幕。-一旦选择了所需的选项,它们将被保存在卡的内存中,时间是唯一取决于卡的二次电池的变量。一旦结束,每次卡失去主电源时都会丢失小时。-连接卡时二次电池电量耗尽会显示:BATT0%表示需要更换电池,如果是第一次开机也会显示。-要按照图1中的箭头方向更换相同的电池。带有塑料或木质元素;它可以是笔盖或牙签。-要放置新电池,这必须是CR1220型号,并且您必须确保电池的+与卡上的符号一致。-要激活DS1307PSTN的SQW引脚为1hz,请在欢迎消息期间按下按钮,屏幕上将显示文本“SQ1H”,SQW引脚将大约每60秒发出一个脉冲,重复该过程以停用它。-不要直接暴露在阳光或水下-电源不得超过5V如果您对此项目有任何想法、意见或问题,请在下方留言。
在控制您的PC(甚至手机和平板电脑)按键的时候,拥有一个矩阵键盘非常地方便。只需按一下按钮即可启动宏,从而加快您的工作流程。这些键盘随处可见。但是,如果您可以自己构建一个呢?在本教程中,我将使用RaspberryPiPico和带触摸屏的TFT制作一个属于自己地矩阵键盘。零件清单:用品:RaspberryPiPico带触摸屏的ILI9488TFT工具:烙铁和焊锡剥线钳冲洗刀具第1步:观看视频在开始这个项目开始之前,我的建议是先观看一下我的视频,可以让你更加直观的了解到制作的流程。第2步:获取您需要的零件该项目包含两个主要部分,RaspberryPiPico和带触摸屏的ILI9488TFT。您可以从各种经销商处购买这些产品。您还需要找到将屏幕连接到Pico的方法。您可以使用面包板和面包板电线,使用原型板并将所有东西焊接在一起。第3步:将TFT屏幕连接到Pico接线看起来可能让人望而却步,但是相信我,当你真正操作起来,很多问题就会迎刃而解。当您将TFT+触摸屏连接到PiPico时,希望上面的图片可以帮助到您。您可以使用面包板,也可以使用原型板,也可以专门订购PCB来将ILI9488+touch连接到PiPico。我想说明的是,面包板选项只是用于测试连接和屏幕的选项。放在办公桌上不太实用,连接松动可能会导致一些电路问题。重要的是要知道这些屏幕只能在3.3V下运行,将它们连接到5V会造成电路损坏!这些是从PiPico到TFT的连接:3.3V->VCCandLEDGND->GNDGP20->CSGP21->RESETGP22->DC/RSGP3->SDI(MOSI)andT_DINGP2->SCKandT_CLKGP14->T_CSGP0->T_DOGP15->T_IRQSDO(MISO)不用于TFT屏幕,因此可以在TFT模块上留下一个未连接的引脚。如果您使用的是Pico+TFT组合器,则只有一种适合它的方式。我建议它使用头针,这样你就可以拔掉你的Pico和屏幕,以便在不同的项目中使用它,或者如果由于某种原因屏幕或Pico不工作,你可以更换它们。第4步:软件:安装ArduinoIDE库安装ArduinoIDE'arduino-pico'内核。此版本使用EarlePhilhower的“arduino-pico”核心。要安装此核心,请转到Arduino->Preferences并单击AdditionalBoardManagersURLs输入字段后面的图标。接下来,将以下链接(不带引号)复制并粘贴到弹出框中:https://github.com/earlephilhower/arduinopico/releases/download/global/package_rp2040_index.json单击确定和确定。接下来,转到Tools->Board:->BoardManager并搜索“pico”。安装最新版本的“RaspberryPiPico/RP2040”。并单击“关闭”。安装TFT_eSPI库。在编写此Instructable时,TFT_eSPI中的PiPico支持无法通过库管理器获得。但是安装非常简单。前往https://github.com/Bodmer/TFT_eSPI,点击“代码”和“下载.ZIP”。在ArduinoIDE中,转到Sketch->IncludeLibrary->Add.ZIPlibrary。找到刚刚下载的库,点击“选择”,等待安装完成!第5步:下载代码并准备TFT_eSPI简单的代码可以从Github下载:https://github.com/DustinWatts/Pico-Matrix-Touch-K...为了让这个草图与PiPico一起工作,我们必须配置TFT_eSPI库。为此,请在您喜欢的文本编辑器中打开以下文件:/Documents/Arduino/libraries/TFT_eSPI/User_Setup.h选择所有内容(CTRL+A)并点击删除。您现在有一个空的User_Setup.h。复制下面的代码并将其粘贴到User_Setup.h文件中://StrippeddownUser_Setup.hversionforthePico-Matrix-Touch-Keyboard//#defineILI9488_DRIVER//WARNING:DonotconnectILI9488displaySDOtoMISOifotherdevicessharetheSPIbus(TFTSDOdoesNOTtristatewhenCSishigh)#defineTFT_MISO0#defineTFT_MOSI3#defineTFT_SCLK2#defineTFT_CS20//Chipselectcontrolpin#defineTFT_DC22//DataCommandcontrolpin#defineTFT_RST21//Resetpin(couldconnecttoArduinoRESETpin)#defineTOUCH_CS14//Chipselectpin(T_CS)oftouchscreen#defineLOAD_GLCD//Font1.OriginalAdafruit8pixelfontneeds~1820bytesinFLASH#defineLOAD_FONT2//Font2.Small16pixelhighfont,needs~3534bytesinFLASH,96characters#defineLOAD_FONT4//Font4.Medium26pixelhighfont,needs~5848bytesinFLASH,96characters#defineLOAD_FONT6//Font6.Large48pixelfont,needs~2666bytesinFLASH,onlycharacters1234567890:-.apm#defineLOAD_FONT7//Font7.7segment48pixelfont,needs~2438bytesinFLASH,onlycharacters1234567890:-.#defineLOAD_FONT8//Font8.Large75pixelfontneeds~3256bytesinFLASH,onlycharacters1234567890:-.//#defineLOAD_FONT8N//Font8.AlternativetoFont8above,slightlynarrower,so3digitsfita160pixelTFT#defineLOAD_GFXFF//FreeFonts.Includeaccesstothe48Adafruit_GFXfreefontsFF1toFF48andcustomfonts//Commentoutthe#definebelowtostoptheSPIFFSfilingsystemandsmoothfontcodebeingloaded//thiswillsave~20kbytesofFLASH#defineSMOOTH_FONT#defineSPI_FREQUENCY70000000//OptionalreducedSPIfrequencyforreadingTFT#defineSPI_READ_FREQUENCY20000000//TheXPT2046requiresalowerSPIclockrateof2.5MHzsowedefinethathere:#defineSPI_TOUCH_FREQUENCY2500000不要忘记保存文件!这也是您可以在Github存储库中找到的文件(https://github.com/DustinWatts/Pico-Matrix-Touch-Keyboard/tree/main/User_Setup)第6步:调试代码打开“Pico-Martix-Touch-Keyboard.ino”后,转到“工具”->“板”并选择“RaspberryPiPico”。您可以将所有设置保留为默认值,“Flash大小”除外。代码需要一小部分文件系统存储空间来,存储代码第一次运行时创建的触摸校准数据。因此,在“FlashSize”下选择“2MB(Sketch:1984KB,FS:64KB)”接下来,在刷写代码之前,屏幕上的每个按钮都可以有它自己的一组击键,在您按下它后将发送到您的PC。您可以使用其他一些有意思的小功能(您可以在此处找到详细文档:https://www.arduino.cc/reference/en/language/functions/usb/keyboard/)第7步:设计打印一个精致的外壳因为在物体四周放置屏幕会显得产品不好看,而且使用起来也有点困难,所以需要给屏幕单独打印一个外壳。因为尺寸与FreeTouchDeck(https://www.instructables.com/A-Bluetooth-ESP32-TFT-Touch-Macro-Keypad/)完全相同,所以您可以使用相同的外壳。如果您使用接头引脚,请选择名为“Top_for_TFT_with_Headers.stl”的前端版本。(https://www.thingiverse.com/thing:4661069)由于尺寸相同,您可以使用任何专为FreeTouchDeck设计的外壳,但是需要注意的是必须与它有接头针脚配合使用的空间。组装完成之后,您就可以使用这款产品了,希望您能喜欢这个项目!
下面的教程我想给大家展示由喷气涡轮机提供动力的3D打印的迷你空气冷却器。所以这里的目标是制造一个小而强大的空气冷却器,它利用水来冷却由喷气涡轮机输送的空气。在这个项目中,我将通过几个简单的步骤向你们展示我如何准备这个空气-水冷却器。零件清单:Arduino无刷电机12V锂离子电池组电位器面包板3D打印零件盖子主体涡轮接头第1步:序言、基础知识和内容我想创造一个便携式迷你冷却器,它利用水来冷却,由直流风扇输送的空气。该项目利用蒸发冷却的概念,其中水的蒸发用于冷却空气。水从暖空气中提取热量并开始蒸发,留下凉爽、新鲜和潮湿的空气,这些空气通过风扇吹入房间。对于这个项目,我可以使用普通的电脑风扇,但它们很转速不高,不适合快速吹气,因此,我有一个想法,可以在几个月前制作的这个项目中使用我的3D打印喷气涡轮机。我首先在fusion360中设计了一个以方形为模型的基体,我将涡轮以一定角度放置在主体的一侧,这样空气就会直接吹入其中。在正面,我做了烤架让空气通过。基体将容纳水,涡轮机将从外部向其吹送热空气。我使用了15%填充的PLA,但您可以使用任何材料,因为我们不处理热量或可能使塑料翘曲或变形的东西。此外,这个项目需要一个防水和水密封的底座来保持水,所以层高是这里的一个重要因素。为了使这个模型水密封,我只是将层高从0.2毫米减少到0.16毫米。3D打印底座后,我通过将水倒入其中来测试其保水能力,并确定没有泄漏。此外,这里有一个防水3D打印件的快速技巧,只需用金属或塑料涂料喷涂即可!第2步:3D打印喷气涡轮机结构以下是您需要3D打印的JetTurbine部件。喷嘴压缩机电机座涡轮机这个JetTurbine由通用BLDC电机(橙色电机)提供动力,我首先在fusion360中建模了一个风扇叶片,然后我在它周围准备了一个电机。*以下源文件仅供参考。3d_printed_turbine_v2_v11.f3d基体LID.stl基体MainBody.stl基体涡轮连接器.stl第3步:总体设计和预组装至于这个项目的设计部分,我在Fusion360中建模了全部内容。我之前已经对JetTurbine进行了建模,所以我只是将它导入到我的设置中,并根据涡轮机的角度设计了主体。空气将通过涡轮机吹入主体内部,内部的水将使其冷却。第4步:组装过程这个项目的组装过程非常简单,我首先从基体的Grill中移除了支撑材料我在四颗2.2毫米螺丝的帮助下将涡轮机盖与基体连接到指定的位置/位置LID到水轮机顶盖使用两个2.2毫米X10毫米的螺钉举行LID在它的地方最后,我将之前准备的3DPrintedTurbine添加到此设置中该涡轮机将直接在水轮机顶盖部分。为了增加整个涡轮接头的强度,我在涡轮和它的固定部分之间添加了热胶现在我们将微控制器和ESC添加到此设置中以运行它。第5步:使用BLDC电机连接Arduino和ESC对于电子设置,我使用了一个与通用ESC连接的ArduinoNano来控制BLDC电机。我使用12V锂离子电池组为该设置供电根据以下引脚排列连接所有东西VCCofESCtoBattery+veGNDofESCtoBattery-veSignalwireofESCtoD6(useanyGPIOwithPWMoutforthisPin)5VofESCto5VofArduinoorVCCGNDofESCtoGNDofNANOPOTVCCto5VofArduinoPOTSignaltoA0POTGNDtoGNDofArduino接线后,将附加的代码上传到Arduino第6步:测试冷却器至于测试冷却器,我在基体中倒入了一些冷水和几块冰块,几乎将其填满了架子下方。我设置了一个恒温器来测量架子前面和冷却器背面的温度。首先我以最低速度为电机供电,然后慢慢增加涡轮机的速度。涡轮加速,这大大增加了气流。这会导致水从架子喷到基体外部。为了减少这种情况,我们可以减少基体内的水量但无论如何,在让冷却器运行2-3分钟后,我读取了温度读数。背面温度读数-19-20°C正面温度读数-17-18°C如果我们连续运行冷却器超过5分钟,前面的温度读数会少得多,但我想最终结果还可以。第7步:结果、结论和改进希望您能喜欢我的项目
各位好,最近我发现了一些不错的软件,可以使用RaspberryPi、制作短视频和2路音频门铃,而且找到了一种将所有组件装入一个小盒子的方法。接下来我教你如何制作这个项目,包括如何在您按下按钮时能发出推送的通知。需要组件:树莓派3MicroSD存储卡电源塑料外壳摄像头模组内置放大器的扬声器迷你USB麦克风按钮跳线海捷SDK第1步:在塑料外壳上喷漆、钻孔拿好塑料盒,并按照图上标记的位置钻孔然后在扬声器所在的位置钻三个小孔,这样的目的是将声音释放出来。接下来在右上角钻一个更大的孔来放置按钮。检查您的按钮直径以选择合适的钻头尺寸。钻孔后,孔周围的边缘往往有一点不平整,所以需用您自己用美工刀在孔附近磨平,使其全部平整。第2步:准备并连接扬声器和按钮的电线现在我们准备扬声器电缆。因为线缆很长所以可能很难把他们都放进装置中。因此,将它们切短并重新焊接在一起。接下来,剥去一些额外的跳线并将它们连接并焊接到按钮上。第3步:将按钮、扬声器和摄像头模块连接到外壳盖此时,所有组件都已准备好连接到外壳盖上。首先安装按钮。然后是扬声器:连接其电线,取下胶带,然后将其压入到位。然后连接相机模块,它可以很好地卡入特殊的外壳配件中。第4步:准备和焊接音频输出线现在要输出音频,剪断并剥去另一根跳线,然后将其拉过音频附近的孔。然后将其焊接到3.5毫米音频插孔的音频输出引脚。查看带有红色箭头的Pi背面的图像,以查看引脚的确切位置。第5步:连接所有电线现在是将RaspberryPi推入机箱底部并连接所有电线的时候了。请参阅RaspberryPi引脚编号的图表图像。将扬声器电源连接到引脚#1。扬声器接地到#6。将电线连接到引脚#7和#9。当然,将白色扬声器线连接到我们焊接到Pi背面的线。然后关闭机箱。第6步:在RaspberryPi上安装全新操作系统为了驱动RaspberryPi3(或3+),您需要下载并解压缩RaspbianStretch。下载并安装RaspberryPiImager。连接并格式化您的microSD卡。然后启动RaspberryPiImager。选择您的microSD卡,然后单击“写入”。完成后,将microSD卡插入RaspberryPi。使用HDMI电缆连接显示器,并连接USB鼠标和键盘。然后启动树莓派。第7步:配置Pi并连接到WiFi并使相机正常工作一旦它启动并运行,通过初始对话框并连接到WiFi。然后单击左上角的Raspberry图标,然后单击“首选项”,然后单击“RaspberryPi配置”。然后点击“接口”。启用相机。单击“确定”。要检查摄像头是否正常工作,请单击左上角的黑色控制台图标打开控制台。写入以下内容。raspistill-ocam.jpg然后单击左上角的黄色文件夹图标打开文件管理器。并双击cam.jpg检查图像是否正确。第8步:检查扬声器右键单击右上角的音量图标,然后选择“模拟”。现在左键单击相同的音量图标并设置音量。我建议将其设置为80%左右。接下来,让我们再次打开控制台,并运行以下命令:aplay/usr/share/sounds/alsa/Front_Center.wav现在你应该听到一个人的声音。第9步:配置麦克风再次右键单击音量图标,然后单击“USB设备设置”。然后点击“声卡”下拉菜单,选择“USBPnP声音设备”。单击“选择控件...”,同时选择“麦克风”和“自动增益控制”,然后单击“关闭”。现在将麦克风滑块也设置为大约80%,然后单击确定。您可能会发现麦克风很差,会产生相当多的白噪声。您可以随时返回此设置并减小滑块,但是这样您将很难听到门铃发出的声音。第10步:下载SeajeiSDK并运行RaspberryPi打开树莓派浏览器,输入seajei.com。向下滚动一点,然后单击“免费SDK”。在下一页向下滚动一点,然后单击“下载SDK”。它将被下载到您的下载文件夹。打开文件管理器,然后转到您的下载文件夹。右键单击SeajeiSDKzip文件,然后单击此处提取。然后将SeajeiSDK文件夹移动到桌面。接下来,打开一个控制台,并使用以下命令导航到门铃演示(调整您有不同的SDK版本):cdDesktop/Seajei-3.1.8/SamplePrograms/RaspberryPi/Doorbell通过键入以下内容查看README中的内容:catREADME然后如那里所述运行sudoaptupdate命令,并复制粘贴另一个sudoapt命令并运行它。您可以像这样在一行中运行整个命令:sudoaptupdate;sudoaptinstalllibopus-devlibssl-devportaudio19-dev全部完成后,运行Pi3的构建脚本,即以下命令:./build_pi_3_4.sh然后键入以下命令运行门铃可执行文件:./doorbell记下设备ID,因为您需要它来从iOS应用程序连接。就我而言,它是“vmy9dj”。这是检查pi按钮是否正常工作的好时候。单击它几次并检查您是否收到“按钮触发”消息。第11步:运行IOS我们开始运行iOS应用程序。在Mac上访问同一个seajei.com站点,然后下载SDK。解压并转到SamplePrograms/iOS/SeajeiDemoApp。双击SeajeiDemoApp.xcodeproj项目文件,使其在XCode中打开。您必须在签名和功能中设置您的团队才能进行编译。然后选择你的目标。它可以是模拟器或iOS设备。编译并运行应用程序。应用程序首次运行后,您需要设置我们在RaspberryPi示例程序中看到的设备ID。对我来说是“vmy9dj”。把适合你的东西放进去。然后单击“连接”,它应该可以工作。视频在模拟器上看起来有点时髦,所以最好是在实际设备上运行该应用程序。第12步:让IOS推送通知工作快速说明:要使通知生效,您需要一台iOS设备。如果您在模拟器中运行演示应用程序,它们将无法工作。回到SeajeiSDK,打开SeajeiDeveloperGuideIOS.pdf文件。按照所有步骤操作,最后您将拥有一个.p12文件。将其发送
[email protected],他们将通过令牌回复您以供使用。对我来说,它花了不到一天的时间。收到新令牌后,它只是一个字符串,返回到您的RaspberryPi,打开控制台,然后转到Doorbell示例程序:cd桌面/Seajei-3.1.8/SamplePrograms/RaspberryPi/Doorbell使用您最喜欢的编辑器编辑doorbell.c。geany是一种很好用且简单易用的工具。只需输入:geanydoorbell.c然后向下滚动到公司令牌,并用您的新令牌替换免费试用令牌。保存退出,再次运行build_pi_3_4.sh脚本。然后再次运行门铃程序。接下来,返回到您的iOS演示应用程序以替换那里的令牌。它位于PhoneAppViewController.m文件中。向下滚动一点即可找到它。重新编译并启动应用程序。现在按下Pi按钮,您应该会看到通知。第13步:使RaspberryPi上的门铃样本在通电时自动启动返回到您的RaspberryPi和门铃示例:cdDesktop/Seajei-3.1.8/SamplePrograms/RaspberryPi/Doorbell再次使用catREADME命令查看README内部。你会在最后看到4个命令来运行以使其工作。所以只需复制粘贴并运行它们。或者只运行这个长命令:cpdoorbell/home/pi/Desktop;sudocpraspidoorbell.service/lib/systemd/system;sudosystemctlstartraspidoorbell.service;sudosystemctlenableraspidoorbell.service就是这样!重启你的树莓派,你应该会看到摄像头模块的红灯自动亮起,这表明门铃程序正在运行。现在有一个小问题,当门铃程序作为服务自动启动时,你想编辑doorbell.c并编译运行它时,它会失败,因为它一次只能运行一个。在这种情况下,您首先需要通过运行以下命令来停止服务:sudosystemctlstopraspidoorbell.service
自从疫情开始,我和我的室友买了一张乒乓球桌,开始打很多乒乓球。我制作了这个项目,以便我可以根据设备告诉我的信息来监控和测试我的投篮表现如何,以便我可以改进我的比赛。我将ArduinoNano33BLESense和TensorFlowMicro与GoogleCreativeLabs为该项目开发的TinyMotionTrainer“Experiment”一起使用。请观看下方视频,观看我构建项目并在乒乓球游戏中进行测试!视频演示:补给品项目部分:ArduinoNano33BLE感应SparkFunLiPo充电器/助推器-5V/1A电池(LiPo)3.7V400mAh绞合线26AWGTPU长丝设备:3D打印机烙铁+焊锡丝钢丝钳Mac/Windows/Linux个人电脑步骤1:使用TPU3D打印.stl文件并将两个部分粘合在一起此版本的3D模型是在Fusion360中设计的。此当前模型仅适用于PenholdGrip乒乓球拍。使用填充25%和6个墙壁进行打印设置。如果外壳太紧或太松,根据松紧程度在97%-104%之间调整打印尺寸。bc_case.stlarduino_case.stl步骤2:安装电子元件将双面胶带贴在Arduino和Boost转换器上,并将其安装到外壳上,如图所示。将锂电池滑入电池仓。第3步:焊接您可以使用JST连接器将电池连接到升压转换器或将其直接焊接到电路板上。我选择焊接使电线更短,项目更整洁。将电池线(请单独切割!)剪成3-4厘米长。电池的正极连接到升压转换器的Vinput。电池的GND引线连接到升压转换器的GND。来自升压转换器的5V进入Arduino的Vin。升压转换器的GND连接到Arduino的GND。如果一切都正确焊接,那么当您切换升压转换器上的电源开关时,您应该能够看到闪烁的LED。第4步:将Arduino插入您的PC使用Micro-USB电缆将您的Arduino连接到您的PC并按照此Github页面中的步骤操作该页面将指导您下载ArduinoIDE并安装此项目所需的驱动程序和库。第5步:使用TinyMotionTrainer将代码上传到Arduino后:启动TinyMotionTrainer>开始新项目>通过蓝牙将您的Arduino与您的PC配对。调整捕获阈值(您希望这个数字足够高,以便在您挥回球棒时不会触发,但也不要太高,以便您可以在执行击球时激活它)将样本数保留为默认值。将捕获之间的延迟保留为默认值。转到左侧的“捕获您的数据”选项卡。列出您希望设备分类的所有镜头类型。为每种类型的镜头捕获20-100个样本。训练你的模型。测试您的模型。第6步:测试您的模型并打乒乓球一旦您对训练模型的结果感到满意,您就可以保存它,以便您可以随时打开模型。现在你可以把你的蝙蝠带到桌子上玩得开心!以上就是关于这个项目的全部分享了,有问题欢迎评论留言交流。
在这个项目中,我将向您展示如何使用电子纸显示器和RaspberryPiZeroW来构建自己的Youtube订阅者计数器,以查询YouTubeAPI并更新显示。电子纸显示器非常适合此类项目,因为即使在明亮的阳光下,它们也具有出色的可读性,并且几乎可以像纸张一样从任何角度观看。显示器应至少每天更新一次,这样可以防止显示器老化,我将我的显示器设置为每三个小时更新一次。该计数器消耗的电量非常少,因为显示器仅在更新时才通电,其余时间基本上是关闭的。RaspberryPiZeroW在框架背面连续运行,空闲时使用大约消耗0.6W。需要设备:此项目所需的只是RaspberryPiZeroW、SD卡和WaveshareE-Ink显示器,确保您订购的显示器包括用于RaspberryPi的显示控制器。您还需要一个框架或阴影框来构建显示器。RaspberryPiZeroWMicroSD卡Waveshare7.5"高清电子纸显示器(B)带帽子控制器6x8"ShadowBox框架用于设置的键盘、鼠标和显示器(或通过SSH连接)第1步:准备您的电子产品如果您在购买时尚未安装您的RaspberryPiZeroW插头,请先将您的插头引脚焊接到其上,并安装散热器。我使用的显示器是Waveshare7.5"HD3ColorE-Paper(B型)。他们还制作了一个两色版本和另一个三色版本,黄色而不是红色,但红色更适合YouTube播放按钮.显示器非常薄,非常适合安装到相框内,而无需对后面板进行重大修改。在盒子里,你会得到一个SPI显示控制器,它被设计成一顶帽子,可以直接插入Pi的GPIO引脚,所以你不必再进行焊接了。通过提起黑色卡舌,将带状电缆推入连接器,然后再次向下推黑色卡舌以将其锁定到位,将显示器的带状电缆插入控制器连接器。如果您的SD卡预装了RaspberryPiOS,则可以将其插入您的Pi,否则将其放在一边,直到您加载了软件。最后,将帽子插到Pi上。您现在可以测试您的显示器了。一个很好的起点是Waveshare7.5"E-PaperWiki,他们有一些很好的入门说明和一些示例代码。如果您不想玩弄这些示例,我们将在接下来的步骤中查看编程和设置。第2步:修改显示框接下来,您需要将显示器构建到相框或阴影盒中。我花了几美元从当地商店买了这个6x8英寸的框架。取下后面板以到达白色框架面板。您可能需要将此面板切得更大一些,以适应电子纸显示器上的显示区域。测量显示区域,然后使用尺子和锋利的工艺刀标记并切割成正确的尺寸。如果您不想剪切它,您还可以调整显示布局和元素大小以适应您的白框面板。接下来,为带状电缆划出一个槽口,让其穿过后面板,然后使用工艺刀或旋转工具将其切掉。我使用激光切割机将矩形部分切出并打了一些孔以将RaspberryPi安装到支架上。第3步:安装电子设备撕下保护膜,然后将显示器粘在白框上,确保它居中且笔直。我只是在角落里用了一小滴热胶来固定它。它也会被背面轻轻夹住,所以你不需要很多胶水。重新组装框架层,在关闭前轻轻拉动带状电缆穿过后面板。将带状电缆插入连接器,然后将连接器粘合到位,以防止对电缆施加任何拉力或拉力,这可能会撕裂电缆。最后,将RaspberryPi和帽子安装到框架的支架上。最好为此使用一些塑料或黄铜支架。如果您没有支架安装座,您可以使用热胶将Pi的背面粘到支架上。就是这样,您的显示器现在已准备好进行编程。第4步:编程和设置RaspberryPi显示器的编程非常简单,但可能是一个漫长的过程。你需要:准备RaspberryPiOS安装安装库和更新获取您的YouTubeAPI密钥和频道ID修改Python脚本并将其保存到您的Pi测试运行脚本使用crontab自动运行脚本我不会在这个项目中一步一步地详细介绍,因为我已经在我的博客上写了一个详细而有条理的指南,其中包含Python脚本的下载-YoutubeSubscriberCounterPython脚本基本上导入所需的库和函数,然后查询YouTubeAPI,重新格式化数字以包含逗号,然后更新显示以反映最新值。它还更新右下角的一个小日期字段,以便您可以轻松判断Pi是否由于错误而有一段时间没有更新显示。当您运行脚本时,显示器将在几秒钟后开始刷新过程。完全刷新大约需要30-40秒。在此期间,显示屏会先黑白闪烁,然后变为空白,然后生成黑白版本的显示屏,最后通过替换部分黑色区域填充红色。闪烁属于正常现象,由控制器完成以循环显示元素并防止烧屏。第5步:使用您的订阅者计数器一旦您使用crontab运行并自动化了您的脚本,您的计数器就可以使用了。只需将其插入USB电源并将其放在您的桌子或架子上。我想使用RaspberryPi零W构建这个特殊的YouTube订阅者计数器,但您也可以使用ESP32通过让控制器在显示器更新之间休眠来使用更少的功率,这在RaspberryPi上很难做到。在评论部分告诉我您的想法,如果您尝试构建你自己的,请告诉我!
这项工程旨在帮助任何想要红外相机或真正酷炫的便携式相机或便携式RaspberryPi相机或只是想要找乐子的人。这是我用过的最实惠和可配置的相机。使用的软件支持您调整RaspberryPi相机提供的每一个功能。请注意,这款相机是“相机手机”风格的相机,因此它有一个小型传感器,不具备现代数码单反相机或无反光镜相机的所有功能。构建这个项目的总成本低于60美元,但如果你愿意,也可以花更多预算。第1步:硬件RaspberryPi-10美元RaspberryPiNoIR相机-25美元RaspberryPi官方保护套-5美元-对于随附的相机电缆而言,此保护套物有所值MicroSD卡-16GB$832GB$14电源或电池-5至20美元-取决于电源类型或电池尺寸重要说明:在我的构建视频中,我错误地安装了RaspberryPi相机电缆,因此在我启动时相机无法正常工作。我当然在放入电缆时反转了电缆,您可以在视频中看到我收到错误。如果电缆在安装后滑出或松动,也会出现此错误。超级重要提示:我不止一次弄坏了相机电缆连接器上的夹子。它们是脆弱的,需要温和的力量和压力,确保使用耐心和温和的触摸来使它们正常工作。第2步:操作系统和软件概述操作系统上我选择FullBlownRaspbian。软件上我选择RPi-Cam-Web-Interface。下载RasPI操作系统链接https://www.raspberrypi.org/downloads/。安装软件安装操作系统后RPi-Cam-Web-Interface-https://elinux.org/RPi-Cam-Web-Interface#Multiview...概述说明-我使用RaspberryPi3来连线到网络。我设置了我的WiFi,然后将存储芯片移到PiZero上并用它完成安装。我只使用PI3来设置我的无线网络,而且我确信我需要学习另一种方法来让整个项目变得简单。第3步:操作系统安装和WiFiRasPi操作系统安装1.在Windows上使用SDFormatter清空SD卡-对于Mac和Linux我以前没有使用过它们,所以我没有推荐(在Mac或Linux上搜索格式和图像)-https://www.sdcard.org/downloads/formatter_4/eula...2.在Windows上使用Win32DiskImager安装Raspbian操作系统-https://sourceforge.net/projects/win32diskimager/...3.设置WiFi-这有点棘手,因为这款相机的主要用途是通过手机或电脑连接到浏览器的WiFi。不幸的是,您需要设置您的WiFi或热点或两者兼而有之才能以这种方式使用它。要设置WiFi,您需要使用OTG电缆+用于鼠标和键盘的HUB或USB到键盘和鼠标电缆将您的RasPiZero连接到您的PC解决方法-我使用RaspberryPi3设置WiFi,并通过网络连接使用SSH/VNC。我认为Raspi-Config现在允许您设置WiFi,以便使这个过程更快更容易。第4步:安装RPiCamWeb界面安装操作系统并启用WiFi后,您就可以安装RPiCamWeb界面软件。我建议您在使用PiZero之前不要进行任何更新,以确保您不会因硬件而犯任何错误不要忘记确保您的5mpV1摄像机或8mpV2摄像机具有正确的摄像机预设。第1步:在您的RPi上安装Raspbian第2步:将摄像头连接到RPi并启用摄像头支持(http://www.raspberrypi.org/camera)第3步:使用以下命令更新您的RPi:sudoapt-getupdatesudoapt-getdist-upgrade有时,如果已完成相机核心软件更新,则可使用sudorpi-update在它们作为标准可用之前从中受益。第4步:对于JessieLite运行sudoapt-getinstallgit从github克隆代码并使用以下命令启用并运行安装脚本:gitclonehttps://github.com/silvanmelchior/RPi_Cam_Web_Int...cdRPi_Cam_Web_Interface./安装文件第5步:使用它在网络中的任何计算机上打开任何浏览器并输入URL以访问摄像机网站。这将是http://ipAddress:port/subfolder。如果在安装过程中端口被保留为默认80,那么这可能会被忽略。同样,如果在安装过程中清除了子文件夹(默认html),则可以省略。因此,对于端口80,没有子文件夹安装url变为http://ipAddress:port/subfolder。重要说明:如果您需要更改任何文件,那么您需要在运行时版本中进行这些操作(例如,在/var/www/html文件夹或/etc/raspimjpeg中)。更改RPi_Cam_Web_Interface文件夹中的文件不会立即生效。这些只是安装期间使用的副本。第5步:故障排除如果您安装了操作系统并按照RPiCamWeb界面说明进行操作,您现在应该拥有一个可以直接启动到相机的RaspberryPi。在您的网络上找到RasPi的URL。这对每个人来说都是不同的。加载页面,不要忘记端口号默认值为80,但我将我的设置为不同的内容。http://IP_Address:YouPort#(80default)-http://IP_Address:YouPort#(80default)IP地址)一旦你输入,你会得到一个页面,上面写着HTML并且是可点击的,点击它。应显示预览窗口。如果没有,那么“我们有休斯顿问题”-您可能还没有完全安装RPiCamWeb界面软件。如果您看到NOPREVIEW并且不断弹出错误怎么办-很可能是您从Camera到Pi的电缆安装不正确或根本没有安装。第6步:RPiCamWeb界面-提示和技巧这个软件已经存在了很长一段时间,因此它可以做很多事情。我已经使用它一段时间了,而且还有更多要学习的地方。您可以完全控制所有功能,我强烈建议您使用软件中的所有“旋钮和刻度盘”。我现在最喜欢的附加功能是MultiView。你也可以做PanTilt等等我通过网络和vMix软件LIVE将我的RasPi用作OldSkool风格的网络摄像头。如果需要,我可以在将更高质量录制到Pi的同时将“流”直播到我的PC。这允许我为RasPi无音频视频创建同步轨道。我以后可以在时间线上放置任意数量的摄像机。请记住要对帧速率进行标准化。大小可以更改,因为您可以根据需要使用编辑器移入或移出素材。我现在使用24fps,因为这似乎可以使系统运行顺畅。我很高兴在以24fps录制的同时捕捉到8mp的静止图像。我想知道它是否会为同步而抛弃它。过去,当录制丢帧或我使用与时间轴不同的帧速率时,我曾遇到过同步问题。我用于流媒体的特定调整-来自https://elinux.org/RPi-Cam-Web-Interface#Configura...调整实时预览带宽使用部分-我喜欢使用384X288来降低带宽。我使用的质量水平也很低,大约22是我会去的最高水平。我尚未对此进行测试,但该站点讨论了大小增加的速度,并且10是一个很好的数字。我走得更高,但我也将512降低到384之类的东西,并将384降低到288(我认为)。我还使用FX来创建有趣的外观。特别是如果我只使用红外光谱。它变得非常捕食者,还有其他几种外观和感觉。这就像Instagram过滤器,我知道我的手机有这些,我只是从来没有真正使用过它们,在我使用的Pi上.在延时摄影期间拍摄的图像,在它的位置捕捉到了一个飞行的生物(蝴蝶或飞蛾?)由于RasPiZeroW非常小,因此您可以轻松地将其制作成可穿戴相机。我附上了一张我的RingCam创意的图片,我在Unicorn相机之前使用了它。我已经使用手机相机镜头附件来制作鱼眼和特写图像和视频-来自亚马逊的类似内容。第7步:成果我已经使用RaspberryPi相机有一段时间了。我附上了一张我在洛杉矶动漫大会上拍摄的照片,并在Adafruit摄影大赛中获奖-https://www.adafruit.com/galleries/winners-of-rasp...对于我为比赛拍摄的图像,我使用RaspberryPiDeadNinjaTwinCam拍摄这张照片,获胜的相机是NoIRVersion15MP相机。我用我的新8MPNoIRRasPi相机拍了一张自拍照,你可以在上面看到。我希望你们都会喜欢这个小而有用的项目。
天文摄影是对天文物体、天体事件和夜空区域的摄影。除了记录月球、太阳和其他行星的细节外,天文摄影还能够捕捉人眼看不见的物体,如暗淡的恒星、星云和星系。这让我们非常痴迷,因为获得的结果令人叹为观止,并且可以通过长时间曝光来实现。为了扩展普通相机的多功能性,我们决定设计和构建一个可以连接到单反相机的树莓派供电模块。这允许摄影师预设某些变量,从而在长时间内自动执行拍摄过程。除了天文摄影剧照外,该模块还可以借助内置程序生成星迹,还可以创建延时摄影。步骤1:模块概述我们制作的程序处理三个不同的过程:应用程序的前端,或图形用户界面——这是用户用来交互和控制模块的东西控制相机-这是程序的一部分,负责在正确的时间在正确的时间触发相机处理图像-这是程序的一部分,负责将拍摄的照片组合并合并为美丽的星迹图像或延时视频GUI从用户那里收集诸如图片之间的间隔和相机的曝光时间等参数。然后它会根据这些因素指示相机捕捉图像。拍摄完所有图像后,就会进行后期处理。并将最终结果存储在树莓派的内部存储器中,供用户通过云端或本地访问。第2步:所需材料该项目的硬件非常简单,以下列表包含所需的所有材料。电子和硬件:树莓派液晶触摸屏M3螺栓x8M3加热刀片x8以下列表中存在的相机(http://www.gphoto.org/proj/libgphoto2/support.php)标准移动电源,可在插头不易触及的区域为系统供电编程和配置树莓派需要一些外围设备:一个鼠标和键盘外接HDMI显示器第3步:3D打印零件我们3D打印出一个外壳来容纳所有组件,并设计了一个夹子,将模块安装在普通三脚架上。这些零件需要大约20个小时的打印时间,我们已为以下STL文件链接了一个文件。RaspberryPiCasex1,20%填充物覆盖rx1,20%填充三脚架座x1,40%填充物三脚架夹x1,40%填充物一旦打印的部件准备好,就可以小心地取出支撑物。第4步:嵌入散热片为了加强塑料安装孔,我们嵌入了热嵌件。使用烙铁轻轻推入插件,直到它们与顶面齐平。对八个安装孔重复此过程,同时确保螺栓螺纹轻松且垂直。第5步:安装树莓派和屏幕使用M3螺栓通过相应的安装孔将树莓派固定到位。然后通过对齐连接器引脚插入显示器。最后,将盖子放在屏幕上并拧紧螺栓。该模块现在已准备好上传软件。第6步:连接到三脚架为了使相机易于访问该模块,我们决定将其放置在三脚架上。我们设计了一个适合标准三脚架的定制安装支架。只需使用两个螺钉将底座夹在三脚架的腿上。这允许人们轻松地连接和移除模块。第7步:设置RaspberryPi的操作系统模块上的raspberrypi运行基于Debian的操作系统,称为Raspbian。在Instructable发布时,最新版本的操作系统是RaspbianBuster,这是我们决定使用的。可以使用以下链接下载操作系统。(RaspbianBusterOS)确保下载“带有桌面和推荐软件的RaspbianBuster”选项,因为一些推荐的软件对这个项目很有用。下载压缩文件夹后,您将需要一张内存约为16至32GB的微型SD卡。要将操作系统刷入SD卡,我们建议使用BalenaEtcher软件,因为它易于使用。它可以从以下链接下载。(BalenaEtcher)打开软件后,系统会提示您选择刚刚下载的压缩文件夹,然后将SD卡插入计算机,软件应该会自动检测,最后点击flash图标。该过程应该需要2到3分钟。完成后,拔下存储卡并将其插入树莓派。使用HDMI电缆将树莓派连接到外部显示器,并通过USB端口连接鼠标和键盘。最后,使用微型USB端口和5v适配器为pi供电,pi应开始启动过程。然后操作系统将引导您完成必要的更新和各种其他设置,例如连接到无线网络并设置日期和时间,只需按照操作即可。该过程完成后,您已经在pi上设置了操作系统,现在可以将其用作普通计算机。第8步:其他库和要求为了确保程序运行,树莓派需要安装一些库和依赖项。这是所有这些的列表(注意:我们在这个项目中使用了python3,我们建议你也这样做):在安装任何软件包之前,我们建议使用命令sudoapt-getupdate更新raspberrypi的操作系统。可以通过打开终端并使用以下命令来下载和安装sh库。第9步:板载触摸屏显示器的附加驱动程序板载触摸屏需要一些简单的配置才能运行。启动树莓派并打开终端并使用以下命令:输入最后一条命令后,您的外接显示器应该会变成空白,并且pi应该会启动并在板载触摸屏上显示桌面。要恢复到外部显示器,请在板载屏幕上打开一个终端窗口并使用以下命令。第10步:运行Timelapse模块程序首先使用电源端口将树莓派连接到外部移动电源。要运行该程序,请下载并解压缩下面所附的压缩文件夹。将整个文件夹复制到树莓派的桌面上。要运行程序和GUI,打开名为UI.py的文件,GUI应该会出现在树莓派的触摸屏上。接下来,使用USB电缆将相机连接到树莓派。保留GUI上的默认值,然后单击开始按钮。这应该以2秒的间隔触发相机5次。完成后,您可以在“图像”文件夹中看到相机拍摄的照片。故障排除:如果相机没有触发,请确保您的相机型号出现在以下列表中。http://www.gphoto.org/proj/libgphoto2/support.php如果您的相机在此列表中,请确保连接安全且您的相机已打开。第11步:天文摄影的推荐相机设置以下是我们在进行天文摄影时推荐的一些相机设置。您的相机应处于手动对焦状态并将焦点设置为无限远将相机安装在三脚架上相机设置应为手动模式快门速度:15-30秒光圈:镜头的最低可能,f-2.8是理想的ISO:1600-6400除了相机设置外,请确保天空晴朗。理想情况下,一个人也应该在远离城市灯光的乡村,以获得理想的效果。第12步:了解GUIGUI包含三个用户可以调整的值:曝光时间决定了相机的快门速度。例如,当您在夜空中拍摄星星时,建议快门速度为15到30秒,在这种情况下,请将此值设置为30秒。如果曝光时间低于1秒,则可以将该值保留为0。间隔时间决定了两次曝光之间所需的时间量。在延时的情况下,我们建议间隔时间在1到5分钟之间。曝光次数决定了您想要为延时摄影拍摄的照片数量。标准视频以大约30fps的速度播放,这意味着如果您单击30张图片,您将获得一秒钟的视频。基于此,用户可以决定所需的图片数量。UI具有不言自明的界面。的箭头按钮用于递增或递减值和开始时的参数被最后确定按钮。这会触发本应通过pi的USB端口之一连接的相机。然后将图像保存在树莓派的内存中,以便进行进一步修改。第13步:调试设备在频繁使用此模块后,我们对获得的结果感到满意。只要有一点天文摄影经验,就可以捕捉到美丽的剧照。我们希望这个项目对您有所帮助,如果您喜欢它,请通过投票支持我们。以上就是关于这个项目的全部分享了,欢迎留言交流。
项目演示:第一步:硬件组件R305指纹模块PL2303USB转TTLRC522RFID模块20x4液晶显示器树莓派以太网电缆按钮(8)蜂鸣器跳线SD卡(16GB)电位器(10k)第2步:软件组件PC/笔记本电脑在您的笔记本电脑/PC中安装Xampp应用程序。将您的PC/笔记本电脑连接到具有DHCP服务器的以太网网络。然后,打开CMD并运行以下命令:ipconfig。查看您的IP地址(我的是172.37.40.40)并记住它。运行Xampp,在ModuleApacheklikConfig中,选择Apache(httpd.conf)。查找并编辑此命令:#Listen172.37.40.40:80。删除“#”,然后保存httpd.conf文件。RaspberryPi我假设在SD卡上有一个RaspbianStretch操作系统。将SD卡插入树莓派并打开树莓派电源。将指纹库安装到您的RaspberryPi将RC522RFID库安装到您的RaspberryPi20x4LCD模块控制使用Python第3步:硬件集成RaspberryPi和R305指纹模块RaspberryPi和RC522RFID模块RaspberryPi和20x4LCD模块RaspberryPi和PushButton—使用Eagle软件设计您的PCB布局,您可以查看所附图片并遵循引脚图。RaspberryPi和蜂鸣器—您可以在RaspberryPi中使用另一个可用的I/O,但对于这个项目,我选择引脚40作为蜂鸣器。第4步:软件集成个人电脑/笔记本电脑确保您的笔记本电脑/PC连接到具有DHCP服务器的以太网网络。所以你可以检查你的笔记本电脑/PCIP地址还是和以前一样(我的是172.37.40.40)。运行XamppSoftware,然后点击StartonApacheandMySQLModule。运行浏览器(例如MozillaFirefox),然后在地址栏中输入以下命令:172.37.40.40/phpmyadmin,然后输入。您将被定向到phpmyadmin以创建数据库。创建与所附图片相同的数据库。第5步:运行系统启动您的RaspberryPi并将其连接到与PC/笔记本电脑相同的以太网网络。通过在终端中运行以下命令,确保您的RaspberryPi已连接到同一网络:ifconfig。如果已连接,您的RaspberryPi将具有IP地址,例如172.37.40.45或其他。要执行此散文,您应该有键盘和鼠标,然后将其插入RaspberryPiUSB端口。在笔记本电脑/PC上运行Xampp应用程序。然后点击启动Apache和MySQL模块。运行代码:如果要注册新用户,请通过以下命令在终端上运行Register.py:sudopythonRegister.py。如果要搜索用户,请通过以下命令在终端上运行Searching.py:sudopythonSearching.py。
我们都至少认识一位老人。也许是家人或朋友。随着年龄的增长,他们中的一些人认为我们不在乎他们,而我们真的很爱他们。一个真正的大问题是,数以百万计的人开始忘记一些事情,比如吃药。我们可以整天告诉他们做一些事情,但相反,我们可以委派和自动化这项任务。介绍Remind-Ino!它的目的是提醒人们在您无法完成的特定时间完成任务。它还可以讲故事、阅读书籍、教授烹饪食谱,甚至可以再现歌曲。它有一种复古的收音机风格,可以记住过去的美好时光。它有一个简单的界面,1个扬声器作为输出,1个按钮作为输入告诉它停止。如果用户没有听到,Remindino会重复,直到他按下按钮或5分钟过去。您只需要记录警报、保存警报、对arduino进行编程、连接电缆、制作一个案例,您就可以开始了!视频展示补给品准备-1xArduinoNano-1xRTC模块-1xMP3模块(DFrobot或TF-16P)-1x按钮-1x8[ohm]0.5[W]扬声器或类似设备-4x1[Kohm]电阻-1x迷你面包板-各种公母跳线-1xSD卡(32GB,取决于大小)-烙铁-FoamBoard和工具或3D打印机和灯丝或任何你想制作外壳的东西。第1步:设置警报对于警报,我们只有2个限制:SD卡存储容量,它们必须是mp3文件。该mp3文件将随着警报的编程而复制。它们可以是您自己、家人、朋友、音乐、书籍、播客或您希望闹钟响起的任何内容的录音。需要注意的一件事是必须为整个月设置警报。接下来要考虑的是:
每天在指定的时间会有相同数量的闹钟,但根据日期的不同,闹钟的mp3文件可能相同或不同。例如:
我们定义将有4个警报:9:00的警报1、10:30的警报2、14:00的警报3和17:25的警报4。但是我们可以根据一天播放不同的音频:本月1日:警报1是芝士蛋糕食谱(例如:解释如何制作芝士蛋糕的mp3文件)警报2是服用药物(例如:告诉他们必须服用什么药物的mp3文件)本月2:警报1是占星术之书(例如:mp3文件,该文件为初学者阅读占星术第1章)警报2是服用药物(例如:告诉他们必须服用什么药物的mp3文件)上面的例子您懂了吗?因此,完成警报的步骤如下:定义整个月需要的时间和警报记录并拥有所有
mp3文件
在SD卡的目录中创建所有日期的文件夹(01,02,...,30,31)根据日期将mp3文件保存在每个文件夹中,如下所示:对于
文件夹01
Cheesecakealarm必须保存为001.mp3,TakeMedicinesalarm必须保存为002.mp3。对于
文件夹02
Astrologyalarm必须保存为001.mp3,TakeMedicinesalarm必须保存为002.mp3等等。第2步:电路电路就是这么简单。连接的时候要小心。我在寻找有关如何使用MP3模块的好教程时遇到了麻烦,如果某些东西不起作用,则可能是您颠倒了它的顺序。我也在努力寻找如何将mp3文件保存在SD卡中,但我已经在警报步骤中解释了如何做到这一点。MP3模块也不支持5V的通信,这就是为什么我使用带有电阻的分压器并且它工作得很好。第3步:Arduino代码代码在Arduino平台上实现:首先,我们需要安装库以使用不同的模块。您可以从arduino管理面板安装它们。点击查看如何操作。下面是可以详细代码#include"Arduino.h"#include"SoftwareSerial.h"#include"DFRobotDFPlayerMini.h"#include#include然后我们需要声明将需要的通用变量。RTC_DS3231rtc;SoftwareSerialmySoftwareSerial(10,11);//RX,TXDFRobotDFPlayerMinimyDFPlayer;对于报警变量,我们稍微解释一下://Hereyouneedtoputatwhattimethealarmswillstarttoplay.WARNING:Putmore>=10minutesinbetweenalarms!//Forexample://9:00Alarm1//11:25Alarm2//15:00Alarm3//19:30Alarm4//Hours[]={9,11,15,19};//Minutes[]={0,25,0,30};//Sono[4];//hour_reset=5;Earlierthanthefirstalarm(9:00)intHours[]={21,21,21,21,21,21};//HereyouneedtoputthehoursofthealarmsinconsecutiveorderintMinutes[]={4,5,6,8,10,11};//HereyouneedtoputtheminutesofthealarmsinconsecutiveorderintSono[6];//Hereyouneedtoputhowmanyalarmsyouchoseinthour_reset=4;//Itsthetimewhereallthealarmswillresetandstartanewday.Itmustbeearlierthanyourfirstalarm.以及其他一些变量。booleansonando=false;booleanpresionado=false;intnumero_alarma=0;intDay=1;然后我们有一些函数,比如一个在按下按钮时处理中断的函数,另一个使mp3模块播放音频。voidtocar_alarma(intnumero_alarma,intDay){myDFPlayer.playFolder(Day,(numero_alarma+1));}voidButton_Pressed(){if(sonando=true){presionado=true;}}然后我们进行了设置,我们设置了mp3模块、外部中断和RTC模块。这个很重要。首先,您需要将RTC模块设置为实时。您可以按照本教程进行操作。在设置中,我们还根据时间告诉arduino下一个警报。voidsetup(){mySoftwareSerial.begin(9600);Serial.begin(9600);pinMode(3,INPUT);attachInterrupt(1,Button_Pressed,RISING);Serial.println();Serial.println(F("DFRobotDFPlayerMiniDemo"));if(!myDFPlayer.begin(mySoftwareSerial)){Serial.println(F("Unabletobegin:"));Serial.println(F("1.Pleaserechecktheconnection!"));Serial.println(F("2.PleaseinserttheSDcard!"));while(true);}Serial.println(F("DFPlayerMinionline."));myDFPlayer.setTimeOut(500);myDFPlayer.volume(15);//Hereyoucansetthevolumofthespeaker!(0-30)myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);delay(3000);if(!rtc.begin()){Serial.println("NohayunmóduloRTC");while(1);}//***********CheckWhenWeAre?DateTimenow=rtc.now();intc=0;while(Hours[c]!=0){if(Hours[c]c++;}elseif(Hours[c]==now.hour()){if(Minutes[c]c++;}elseif(Minutes[c]==now.minute()){c++;}else{numero_alarma=c;break;}}else{numero_alarma=c;break;}}}接下来,我们有一个循环,其中进行时间检查和播放警报:voidloop(){//GetrealtimefromRTCDateTimenow=rtc.now();delay(1000);Day=now.day();Serial.println(now.minute());Serial.println(now.second());Serial.println(numero_alarma);//Resetbeforethefirstalarmif(now.hour()==hour_reset&&now.minute()==0){numero_alarma=0;sonando=false;presionado=false;intSono[5];}//Ifitstimeofalarm,playthealarmif(now.hour()==Hours[numero_alarma]&&now.minute()==Minutes[numero_alarma]&&Sono[numero_alarma]==0){tocar_alarma(numero_alarma,Day);Sono[numero_alarma]=1;sonando=true;}//Checkifin5minutesnobodypressedthebuttonintmin_test=0;inttime_reset=5;//Timethatbuttonisn'tpressedif(Minutes[numero_alarma]>=(60-time_reset)){min_test=time_reset-(60-Minutes[numero_alarma]);}else{min_test=Minutes[numero_alarma]+time_reset;}if(sonando==true&&min_testSerial.println("ENTRO!");Serial.println(Minutes[numero_alarma]+5);presionado=true;//***********CheckWhenWeAre?DateTimenow=rtc.now();intc=0;while(Hours[c]!=0){if(Hours[c]c++;}elseif(Hours[c]==now.hour()){if(Minutes[c]c++;}elseif(Minutes[c]==now.minute()){c++;}else{numero_alarma=c;break;}}else{numero_alarma=c;break;}}}就是这样。检查文档很棒,您可以访问模块制造商的页面。完整代码://**********************//***********Libraries***********//**********************#include"Arduino.h"#include"SoftwareSerial.h"#include"DFRobotDFPlayerMini.h"#include#include//**********************//***********Variables***********//**********************RTC_DS3231rtc;SoftwareSerialmySoftwareSerial(10,11);//RX,TXDFRobotDFPlayerMinimyDFPlayer;//********************//**********Alarms**********//********************//Hereyouneedtoputatwhattimethealarmswillstarttoplay.WARNING:Putmore>=10minutesinbetweenalarms!//Forexample://9:00Alarm1//11:25Alarm2//15:00Alarm3//19:30Alarm4//Hours[]={9,11,15,19};//Minutes[]={0,25,0,30};//Sono[4];//hour_reset=5;Earlierthanthefirstalarm(9:00)intHours[]={21,21,21,21,21,21};//HereyouneedtoputthehoursofthealarmsinconsecutiveorderintMinutes[]={4,5,6,8,10,11};//HereyouneedtoputtheminutesofthealarmsinconsecutiveorderintSono[6];//Hereyouneedtoputhowmanyalarmsyouchoseinthour_reset=4;//Itsthetimewhereallthealarmswillresetandstartanewday.Itmustbeearlierthanyourfirstalarm.booleansonando=false;booleanpresionado=false;intnumero_alarma=0;intDay=1;//**********************//***********Functions***********//**********************voidtocar_alarma(intnumero_alarma,intDay){myDFPlayer.playFolder(Day,(numero_alarma+1));}voidButton_Pressed(){if(sonando=true){presionado=true;}}//**********************//***********VoidSetup***********//**********************voidsetup(){mySoftwareSerial.begin(9600);Serial.begin(9600);pinMode(3,INPUT);attachInterrupt(1,Button_Pressed,RISING);Serial.println();Serial.println(F("DFRobotDFPlayerMiniDemo"));if(!myDFPlayer.begin(mySoftwareSerial)){Serial.println(F("Unabletobegin:"));Serial.println(F("1.Pleaserechecktheconnection!"));Serial.println(F("2.PleaseinserttheSDcard!"));while(true);}Serial.println(F("DFPlayerMinionline."));myDFPlayer.setTimeOut(500);myDFPlayer.volume(15);//Hereyoucansetthevolumofthespeaker!(0-30)myDFPlayer.EQ(DFPLAYER_EQ_NORMAL);myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);第4步:制作案例(老式收音机)该案例考虑了最终用户的体验。在这种情况下,最终用户将是老年人,在您的情况下可能有所不同。这部分非常有创意!正如我们之前所说,我们的最终用户是一位老人,这就是为什么决定外壳必须具有VintageRadio风格的原因。因为他们喜欢那样。1.先做了一点研究!2.然后使用最好的3DCAD建模软件设计模型:AutodeskFusion360!!!在这里,您必须根据组件的大小来设计模型。您必须测量您的按钮和扬声器直径才能打出完美的孔。这部分真的取决于你。您可以根据您的测量使用模型并固定尺寸。您可以3D打印您的模型,也可以将其设计为在泡沫板上制作,就像我的情况一样。3.模型完成后,可以进行3D打印,也可以打印零件的图纸作为模板切割成泡沫板。关于如何切割泡沫板的教程。4.然后你需要给所有的部分上色,这样你就可以给它你想要的风格。就我而言,我看到了这个人造木头绘画教程,让它看起来复古而古老。5.你可以给它额外的装饰,比如贴花、网眼织物和一些额外的东西,让它更有吸引力!复古收音机.f3d点击下载第5步:组装和测试在这部分中,您应该将每个组件放入机箱并测试它的声音。如果用户感觉舒适,您可以检查警报。您还需要检查代码的无效设置中的音量。检查所有连接,因为如果连接不正确,电子设备可能会损坏和烧毁,并且无法工作。此时,如果一切都按计划进行,恭喜您已完成Remind-Ino的制作!
几个月前,我安装了一个小型的离网太阳能系统。我总是很好奇看到我的太阳能光伏系统的性能,而且好消息是我正在使用的充电控制器具有自己的本地显示器以进行监控。但是,我严重缺少远程监视功能。因此,我决定制作自己的监视系统,该系统必须同时具有本地和远程监视设施。为什么我们需要监控?1.它提供有关各种太阳能参数,提取的能量,故障检测,太阳能发电厂的历史分析以及相关的能量损失的清晰信息。2.您可以轻松地衡量您的太阳能产量以及每月电费的节省。3.您可以从智能手机实时跟踪太阳能光伏系统的所有重要参数。在本文中,我将向您展示我使用ESP32开发板和ACS723电流传感器制作了一个简单的太阳能监控系统。规格:1.输入电压-0-24V(可以扩展到50V)2.输入电流:0-15A3.太阳能电池板额定值-250W(12V)/500W(24V)视频展示:组件清单:1.ESP32开发板-30针(Banggood/Aliexpress)2.ACS723传感器(LCSC)3.OLED显示屏(亚马逊/Banggood)4.电阻器(亚马逊/Banggood)5.陶瓷电容器(亚马逊/Banggood)6.XL7015降压转换器模块(Amazon)7.温度传感器(亚马逊/Banggood)8.螺丝端子3P-3.5mm间距(LCSC)9.螺丝端子2P-9.52mm间距(LCSC)10.排针(Amazon/Banggood)11.跳线MF(Amazon)12.PCB13.助焊剂(Banggood)14.锡膏(Banggood)补充工具:1.烙铁(亚马逊/Banggood)2.少年(亚马逊/Banggood)3.剥线钳(Amazon/Banggood)4.3D打印机(Amazon/Banggood)步骤1:如何运作?太阳能电池板的电压和电流分别由电压和电流传感器感测。此处,使用分压器网络测量太阳能电池板电压,使用AC723霍尔效应电流传感器测量太阳能电池板电流。同样,DS18B20温度传感器可感测环境温度。来自所有传感器的原始传感器数据由ESP32板处理,并执行所有必要的数学运算来计算功率,能量。然后将处理后的数据发送到OLED显示器以进行本地监视,还发送到云以进行远程监视。远程监控是通过安装在智能手机上的Blynk应用程序完成的。步骤2:测量电压太阳能电池板电压由分压器网络感测,该分压器网络由两个电阻R1=47k和R2=6.8k组成。R1和R2的输出连接到ESP32模拟引脚GPIO引脚34。使用陶瓷电容器C1平滑分压器的输出。电压测量ESP32的模拟输入可用于测量0至3.3V之间的DC电压。我考虑过的太阳能电池板可以产生24V(开路电压)。要读取此电压,我们必须逐步使用可通过分压器网络完成的电压。用于分压器电路Vout=R2/(R1+R2)xVinVin=(R1+R2)/R2xVoutAnalogRead()函数读取电压并将其转换为0到4095之间的数字校准:我们将使用Arduino的模拟输入之一及其AnalogRead()函数读取输出值。该函数输出的值在0到4095之间,每个增量为3.3/4095Vin=Vout*(R1+R2)/R2;R1=47k和R2=6.8kVin=ADC计数*(3.3/4095)*((47+6.8)/6.8)伏您可以通过选择适当的电阻器R1和R2来使用更高电压的太阳能电池板。步骤3:测量电流对于电流测量,我使用了霍尔效应电流传感器ACS723-20AUvariant。根据ACS723传感器的电流检测范围,还有其他变体。ACS712传感器读取电流值并将其转换为相关的电压值。将这两个测量值关联起来的值为“灵敏度”。输出灵敏度可以从数据表中获得。根据数据表,灵敏度为200mV/A校准:模拟读取值=AnalogRead(Pin);ADCVoltage=(3.3/4095)*模拟读取值以安培计的电流=(ADCVoltage–失调电压)/灵敏度根据数据表,失调电压为0.1*Vcc(0.5V),灵敏度为200mV/A注意:ACS723的输出通过由R4和R5组成的分压器网络降压。步骤4:测量温度我已使用外部DS18B20探针测量环境温度。它使用单线协议与微控制器通信。单线设备需要在其信号线上连接一个上拉电阻,以便电路板正确读取。在这里,我使用了一个4.7K电阻(R6)作为上拉电阻。可以通过3针螺丝端子将其钩接到PCB上。要与DS18B20温度传感器接口,您需要安装OneWire库和DallasTemperature库。您可以阅读本文以获取有关DS18B20传感器的更多详细信息。连接如下:红线->Vcc黄线->数据黑线->GND以上所有内容在PCB上都有清晰的标签,以免造成混淆。步骤5:连接OLED显示器为了在本地显示太阳能电池板参数,我使用了0.96英寸的OLED显示屏。它的分辨率为128x64,并使用I2C总线与ESP32进行通信。使用了ESP32中的两个引脚SCL(GPIO22),SDA(GPIO21)沟通。我正在使用Adafruit_SSD1306库来显示参数。首先,您必须下载Adafruit_SSD1306。然后安装它。连接应如下所示:ESP32-->OLED3.3V--->VCC地线->地线GPIO21---->SDAGPIO22---->SCL步骤6:PCB设计我已经使用EasyEDA在线软件绘制了原理图,然后为该项目设计了定制PCB。PCB设计用于安装不同的模块,而不是使用大量的组件。我已经从JLCPCB订购了我的PCB,并在7天内收到了它。您可点击以下载以下附件的Gerber文件(点击下载)。步骤7:PCB组装对于焊接,您将需要一个体面的烙铁,焊料,钳口和万用表。优良作法是根据组件的高度进行焊接。首先焊接较小高度的部件。您可以按照以下步骤焊接组件:1.将组件脚推入它们的孔中,然后翻转PCB的背面。2.将烙铁头的尖端固定在焊盘和组件支脚的连接处。3.将焊料送入接头中,使焊料在引线周围全程流动并覆盖焊盘。一旦它四处流淌,将尖端移开。步骤8:焊接ACS723在整个PCB中,高度较小的组件是电流传感器ACS723,这是此项目中使用的唯一SMT组件。首先,在所有8个焊盘上施加助焊剂,然后在角焊盘上施加少量焊料。使用镊子放置并对准二极管芯片。用烙铁头触碰焊盘时,将芯片固定在适当的位置,以使焊料将引脚和焊盘融化在一起。确保PCB和ACS723IC上的点符号匹配在一起。点符号代表-1号插针。现在,将焊料涂到所有的焊盘上,就可以完成了。如果在焊接过程中弄糟,则可以使用拆焊芯除去多余的焊料。步骤9:3D打印的外壳为了使产品具有良好的商业外观,我使用AutodeskFusion360设计了一个用于该项目的外壳。所有组件的尺寸和PCB安装孔均通过游标卡尺测量,然后在设计时考虑相同因素。外壳分为两部分:1.主体2.顶盖主体的基本设计是保留PCB板。顶盖将盖住主体开口并安装OLED显示器。我使用CrealityCR-10打印机和1.75毫米绿色PLA灯丝打印部件。我花了大约6个小时来打印主体,大约花了2个小时来打印顶盖。我的设置是:列印速度:60毫米/秒层高:0.2mm(0.3也可以)填充密度:20%挤出机温度:200摄氏度床温:60摄氏度从Thingiverse下载STL文件步骤10:组装3D打印外壳可以将PCB安装在3D打印外壳的4个支架上。您可以使用4xM3螺钉直接固定PCB,也可以安装带螺纹的散热插件以提高可靠性。在这里,我在每个支架上都使用了热插入件。将PCB安装到主体上之后,我们可以移动安装OLED显示器。可以使用热胶或强力胶带将OLED显示器安装在顶盖的背面。将跳线从OLED显示器连接到PCBOLED端口。PCB上的插头引脚已明确标记。将温度传感器电缆插入机箱右侧的孔中。然后将电线连接到螺丝端子。现在,使用4xM3螺钉关闭顶盖。为了使外壳更具吸引力,我在顶盖上贴了一个Instructables标签。步骤11:软件和库要将ESP32板与Arduino库一起使用,您必须将ArduinoIDE与ESP32板一起使用。如果您还没有这样做,可以通过遵循Sparkfun的本教程,轻松地将ESP32开发板支持安装到ArduinoIDE。安装库:在上传代码之前,请安装以下库:1.ESP322.布林克3.Adafruit_SSD13064.一根线5.达拉斯温度如何安装库?您可以阅读Sparkfun的本教程来安装Arduino库。第12步:与Blynk应用交互Blynk是最流行的物联网平台,用于将任何硬件连接到云,设计用于控制它们的应用程序以及大规模管理已部署的产品。借助Blynk库,您可以将400多种硬件模型(包括ESP8266,ESP32,NodeMCU和Arduino)连接到BlynkCloud。步骤1:下载Blynk应用1.对于Android2.对于iPhone第2步:获取身份验证令牌为了连接Blynk应用程序和您的硬件,您需要身份验证令牌。1.在Blynk应用程序中创建一个新帐户。2.按顶部菜单栏上的QR图标。通过扫描上面显示的QR码,为该项目创建一个副本。一旦成功检测到,整个项目将立即在您的手机上。我已经制作了SolWeatherStation应用程序。欢迎您尝试一下!要开始使用它:1.下载Blynk应用:http://j.mp/blynk_Android或http://j.mp/blynk_Android2.触摸QR码图标,然后将相机指向下面的代码,请尽情享受我的应用程序!3.创建项目后,我们将通过电子邮件向您发送身份验证令牌。4.检查您的电子邮件收件箱,然后找到“身份验证令牌”。步骤3:为Wemos开发板准备ArduinoIDE要将Arduino代码上传到Wemos开发板,您必须遵循以下Instructables步骤4:安装完上述库后,粘贴下面给出的Arduino代码。输入步骤1中的身份验证码,ssid和路由器密码。然后上传代码。//=====================================================================================////////太阳能电池板能量监控V1.0固件////////由DebasishDutta开发,最新更新:06.05.2021////////=====================================================================================//#include#include#include#include#include“Wire.h”#include#defineBLYNK_PRINT串行#include#defineSCREEN_WIDTH128//OLED显示宽度(以像素为单位)#defineSCREEN_HEIGHT64//OLED显示高度(以像素为单位)#defineINPUT_VOLTAGE_SENSE_PIN34#定义INPUT_CURRENT_SENSE_PIN35#定义TEMP_SENSE_PIN4#定义VOLTAGE_SCALE7.911//R1+R2/R2//(47K+6.8K)/6.8K#定义CURRENT_SCALE1.5//R4+R5/R5//(1K+2K)/2K双倍mVperAmp=200;//传感器的灵敏度////对于100A模块使用100,对于30A模块使用66双ACSoffset=514;//理想情况下应为(0.1xVcc)//测量值为514mV无符号长last_time=0;无符号长current_time=0;浮动功率=0;//瓦特功率浮动能量=0;//瓦特小时的能值浮点温度tempC=0;//Celcius的温度//floattempF=0;温度(单位:F)浮动保存=0;//节约成本WiFiClient客户端;//声明连接到I2C的SSD1306显示器(SDA,SCL引脚)Adafruit_SSD1306显示(SCREEN_WIDTH,SCREEN_HEIGHT,&Wire,-1);//DS18B20连接到的GPIOconstintoneWireBus=2;//设置一个OneWire实例以与任何OneWire设备进行通信OneWireoneWire(TEMP_SENSE_PIN);达拉斯温度传感器(&oneWire);//=========================用于wifi服务器设置的变量==============================//您的WiFi凭据。//将开放网络的密码设置为“”。charssid[]=“XXXX”;//WiFi路由器ssidcharpass[]=“XXXX”;//WiFi路由器密码//从Blynk收到的邮件中复制charauth[]=“XXXX”;//=========================设置功能================================================voidsetup(){Serial.begin(115200);Blynk.begin(auth,ssid,pass);sensor.begin();如果(!display.begin(SSD1306_SWITCHCAPVCC,0x3C)){Serial.println(F(“SSD1306分配失败”));为了(;;);}display.clearDisplay();display.setTextColor(WHITE);display.display();延迟(500);}//========================循环功能===============================================无效循环(){//读取电压和电流浮动电压=abs(return_voltage_value(INPUT_VOLTAGE_SENSE_PIN));浮动电流=abs(return_current_value(INPUT_CURRENT_SENSE_PIN));//从DS18B20读取温度sensor.requestTemperatures();//获取温度tempC=sensor.getTempCByIndex(0);//tempF=sensor.getTempFByIndex(0);//计算功率和能量功率=电流*电压;//以瓦为单位计算功率last_time=current_time;current_time=millis();能量=能量+功率*(((current_time-last_time)/3600000.0);//以瓦特小时为单位计算功率//1小时=60分钟x60秒x1000毫秒节省=6.5*(能量/1000);//6.5是每千瓦时的成本//仅用作示例//================在串行监视器上显示数据================================================/*Serial.print(“Voltage:”);Serial.println(电压);Serial.print(“Current:”);Serial.println(当前);Serial.print(“Power:”);Serial.println(power);Serial.print(“Energy:”);Serial.println(energy);Serial.print(“Temp:”);Serial.println(tempC);Serial.println(电压);延迟(1000);*///================OLED显示器上的显示数据================================================//显示太阳能电池板电压display.setTextSize(1);display.clearDisplay();display.setCursor(10,10);display.print(电压,1);display.print(“V”);//显示太阳能电池板电流display.setCursor(70,10);如果(当前>0&&当前{display.print(current*1000,0);display.print(“mA”);}别的{display.print(current,2);display.print(“A”);}//以瓦为单位显示太阳能电池板的功率display.setTextSize(2);display.setCursor(10,25);display.print(power);display.print(“W”);//显示太阳能电池板产生的能量display.setCursor(10,45);如果(能量>=1000){display.print(energy/1000,3);display.print(“kWh”);}别的{display.print(energy,1);display.print(“Wh”);}display.display();display.clearDisplay();//=================在Blynk应用程序上显示数据================================================Blynk.run();Blynk.virtualWrite(0,voltage);//虚拟引脚0Blynk.virtualWrite(1,current);//虚拟针脚1Blynk.virtualWrite(2,power);//虚拟引脚2Blynk.virtualWrite(3,energy/1000);//虚拟引脚3Blynk.virtualWrite(4,tempC);//虚拟针脚4Blynk.virtualWrite(5,Saving);//虚拟针脚4//delay(1000);}//=========================计算太阳能电池板电压的功能====================================双return_voltage_value(intpin_no){双tmp=0;双ADCVoltage=0;doubleinputVoltage=0;平均双倍=0;对于(inti=0;i{tmp=tmp+AnalogRead(pin_no);}平均=tmp/100;ADCVoltage=((平均*3.3)/(4095))+0.184;//0.184通过加热进行偏移调整,然后尝试inputVoltage=ADCVoltage*VOLTAGE_SCALE;返回inputVoltage;}//=========================计算太阳能电池板电流的功能===================================doublereturn_current_value(intpin_no){双tmp=0;平均双倍=0;双ADCVoltage=0;双安培=0;对于(intz=0;z{tmp=tmp+AnalogRead(pin_no);}平均=tmp/150;ADCVoltage=((平均*3331)/4095);//获得mV安培=(((ADCVoltage*CURRENT_SCALE-ACSoffset)/mVperAmp);//1.5是分压器的缩放比例返回安培;}步骤13:现场测试现在,我们的设备已准备就绪,可以进行现场测试。连接应如下所示:1.将负载的负极端子连接到输出螺丝端子的负极端子,然后将正极端子连接到输出正极端子。在这里,我已将out端子连接到我的充电控制器太阳能输入端子。2.将太阳能电池板的负极端子连接到输入螺丝端子的负极端子,将正极连接到输入正极端子。输入和输出螺钉端子可用于26-10AWG的线径。您可以参考上面的接线图以获得更好的理解。注意:请确保您连接到正确的极性,否则您会看到魔烟。该电路没有反极性保护。完成所有连接后,您将在OLED显示屏上看到太阳能电池板参数。您可以通过打开Blynk应用程序从智能手机进行检查。至此,我们的项目就设计完成了,欢迎大家动手实践互动。
什么是SmartyPill?SmartyPill是一种自动药丸和饮水机,可确保您在正确的时间服用正确的药丸。凭借可自定义的警报和已连接的应用程序,SmartyPill是任何坚持药物治疗生活方式的理想家庭伴侣。组件清单:(一)硬件部件RaspberryPi3模型B×1个Arduino×1个英国威廉希尔SparkFun红板×1个RaspberryPi的2.8英寸TFT触摸屏×1个NeoPixel条×1个英国威廉希尔Sparkfun伺服×4个亚马逊Alexa回声点×1个(二)软件应用程序和在线服务Alexa技能套件亚马逊AlexaAlexa技能套件ArduinoIDEArduinoIDE融合360AutodeskFusion360设计初衷:由于个人健康问题以及老年人的健康状况,我们一直在寻找更好的医疗设备解决方案。我们还希望利用我们在软件开发,计算机工程和机械工程方面的优势来创造具有持久价值的产品。因此,我们开发了该产品来解决美国日益增长的药物依从性问题。根据2015年年份人口估算,美国有4800万老年人,预计到2060年将翻一番。成瘾治疗中心拉古纳医院说:“有些老年人通过改变自己的身体来解决问题剂量或寻找他们认为需要的药物的替代方案。”结合所有服用5种或5种以上药物的老年人中有60%的人说他们经常忘记服药这一事实,这引起了各个年龄段的人(尤其是老年人)对药物依赖性不一致的问题。该产品通过结合易于使用的现代功能,将现有产品提升到智能医疗设备市场的新水平。该设备非常适合老龄化和越来越精通技术的老年人。它可以确保在正确的时间以正确的剂量服用药物。它具有6个单独的药罐,可容纳您所有不同的药丸。还具有可定制的LED灯和内置扬声器,以通知何时应服用药丸。在产品上,有一个内置的显示屏供用户查看何时需要服用药丸。因为SmartyPill内置了智能家居集成功能,用户也可以问Alexa,“Alexa,我时候吃药?”。它也比市场上具有类似功能集的竞争产品便宜。使用起来也非常简单:只需设置并保持连接状态即可。由于可以多人使用此设备,因此它的成本效益是对其他现有产品的重大改进。通过模块化设计,它使用户可以购买他们所需的药丸类型的药丸容器,在他们购买此产品时可以省钱,而且如果他们的更改要求,也可以省钱,因为他们不需要购买整个新设备。该产品被中美青年制作大赛入围的事实证明了该产品的独特性。我们认为,该产品不仅可能适用于老年人,还可能适用于患有某种疾病或疾病的成年人或儿童,这些疾病或疾病需要他们每天多次服用多种药物。此外,还开发了一个同伴应用程序,该应用程序将允许家庭成员和医生监视并保留患者设备上的标签,以确保在设备通知患者时正在服用药物,并且不存在滥用药物的情况。视频展示:未来计划:能实现多用户系统,以便多个患者可以使用同一台分配器(为消费者节约成本);同时改进现有应用程序,以便除了控制LED之外还可以接收数据,让家人可以随时了解使用者的服用情况。;最后将6个药丸盒升级为9个,以提高产品的灵活性
本文将教你如何制作一个迷你“雕刻师”。这个“雕刻师”将能够雕刻纸板,木材,乙烯基贴纸等。教程视频所需材料(一)硬件清单ArduinoUNO(带USB电缆)2个DVD驱动器步进机构2个A4988步进电机驱动器模块(或CNC屏蔽)250mW激光,透镜可调最低12v2Amp电源1个IRFZ44NN通道Mosfet等。(二)工具清单烙铁钻孔机金属锉砂纸钢丝钳强力胶操作步骤步骤1:DVD驱动器步进机制对于这个项目,我们需要两个DVD刻录机机制。一个用于X轴,另一个用于Y轴。您可以从损坏的CPU或本地硬件商店中找到该DVD刻录机。也可以当地的五金店以非常便宜的价格买到。拆卸DVD刻录机步骤:使用飞利浦头螺丝刀卸下所有螺钉。从DVD驱动器上拔下所有连接器和电缆打开磁盘支架并拧松滑动机构。分离滑动机构。步进电机是4针双极步进电机。步骤二:找到步进电机步进电机是4针双极步进电机。它是一种机电设备,可将一系列电脉冲转换为离散的角位移,这意味着它能够根据其控制输入推进一系列的步进。步进电机的行为与数模(D/A)转换器相同,并且可以由逻辑系统的脉冲驱动。它的主要应用包括变频电机,无刷直流电机步骤三:步进电机接线使用万用表的连续性模式,确定确定2个线圈,线圈A和线圈B。我通过颜色区分制作了两对电线,一对用于线圈A,第二对用于线圈B。步骤4:X轴和Y轴坐标连接使用胶水将X和Y轴的滑块相互垂直地连接在一起。并在其上方附加一块切割好的木片作为工作床。步骤5:组装激光支架步骤6:激光组装我使用的是200-250mW650nm激光模块,它具有可聚焦透镜,用于调整激光点。必须连接所需的散热器才能获得较长时间的性能。您可以从网上购买全新的散热器,也可以像我一样使用旧主板散热器,使用强力胶将散热器与X轴滑块相连,将激光与支架相连。步骤7:电机组装固定将电机和激光线连接到CNC防护罩步骤8:下载并安装Benbox激光雕刻机3.7.991.下载并解压缩Benbox2.选择Benbox并运行安装向导3.下载并安装ArduinoIDE。https://www.arduino.cc/zh/Main/software4.单击并安装CH340驱动程序。5.重新启动计算机6.在计算机和雕刻机之间连接USB电缆。步骤9:安装ArduinoNano固件要安装固件,请单击菜单顶部的闪电符号(最右边的图标)。1.选择适当的COM端口。2.选择nano(328p)。3.选择并安装Lx.Hex固件。4.单击安装。成功安装固件后,您将在顶部的更新固件标题旁边看到一个绿色的对勾。步骤10:设置Benbox激光雕刻机参数最后一步是设置雕刻机的参数。1.单击软件右上角的蓝色菜单图标。2.单击菜单图标下方的向右箭头以访问参数列表。3.如图所示,输入参数值。步骤11:制作第一个雕刻品该起始点将与(0,0)位置上的红色弧相关(请参阅图像)。使用左侧的绘图工具绘制一个简单的图像。按绿色的开始按钮开始打印。单击带有调整的圆形激光按钮,直到光束清晰为止。最后:恭喜您成功制作出第一台雕刻机
该灯的灵感来自外太空和太空旅行。这是一个带有火箭的锡箔灯,作为一个滑动开关,当从地球移动到银河系开关时,该灯会打开以显示星光。步骤1:注意事项最好使用切割器小心地切割日光板,因为它容易破裂和破裂我在这里使用的led灯是一根破损的光纤灯,因此也连接了一个模式按钮,但是它不会影响此处使用锡箔进行的电路连接。如果要使用单独的led灯,则必须相应地连接电阻。步骤2:所需的材料对于光,我使用了损坏的光纤灯(该灯还具有许多光模式)防晒板丙烯酸漆切刀胶水透明胶带锡箔图钉步骤3:底座底座的测量值在上面添加的图片中。为了制造底座,我首先在阳光板上仔细地追踪了所有设计,然后使用切割机切割了所有零件然后,我使用金属黑色,深蓝色,金属深蓝色丙烯酸涂料来绘制所有基础作品,以模仿夜空。圆形部分使用不同的颜色绘制,两个较大的部分代表地球和太空或星系,较小的部分代表火箭。步骤4:滑杆开关图片中给出了滑块的尺寸。首先,我将铝箔贴在小圆圈(火箭)的背面,如第六张图片所示从侧壁上切下滑块腔后,我使用了用于滑块的后件,并跟踪了腔并在跟踪腔的两端粘贴了锡箔纸(如图片所示,左侧箔片为单片,右侧为两片))。确保在右侧的两个箔片上都留有多余的箔。在这里,左侧箔只是对称的。在下一步中,我们将知道如何使用粘贴在圆和滑块腔上的箔。步骤5:接线从图片中可以看到,右侧的箔不是单片而是两片,这是因为这将是led电路的一部分,这将是开路。滑动开关背后的机制是,火箭(小圆圈)的背面有铝箔,当它从左向右移动时,它会碰触两片铝箔,从而完成电路。如图所示,电路连接很简单,一条箔带被粘在电池盒的一侧,另一条箔被粘在引线上。现在,电池盒条然后连接到右侧的下部箔片,并且类似地,led箔条也连接到顶部箔片。现在,当所有连接完成时,我们会将滑块的后片粘贴到滑块面上,但请确保仅粘贴后片的侧面,而不粘贴顶部和底部,因为我们将从顶部插入一个小圆圈(火箭),并且需要滑动的空间。步骤6:铝箔灯金属箔灯只是一个简单的金属箔立方体,具有更高的稳定性,我将一张金属箔折叠成双层,然后在图片中追溯设计并进行切割。然后我用图钉在箔立方体的所有5个侧面上制作星星,最后将其折叠成立方体,然后用透明胶带从内部粘贴所有侧面,使其坚固。步骤7:底座和灯的组装将所有面都粘在底面上有点棘手!首先,我将所有四个面以一定角度彼此超级粘合(请参阅图片以了解),然后再次将侧面均粘合到底部,将地球和星系粘合到滑块侧,然后粘合顶部。如果所有的测量都正确,则应如图所示。在此之后,剩下的唯一部分就是将铝箔灯放在空腔上方的顶部,然后灯就完成了!步骤8:最终结果
我在锂离子电池上运行的第一个项目是:一个IOT设备,它不仅可以检测是否有水,而且还可以将数据发送到云中。硬件部件:WEMOSD1MiniPro×1个电池护罩V1.1.0对于WEMOSD1mini×1个锂离子3.7v可充电×1个电池座18650x1×1个定制PCB×1个ArduinoUno×1个RC蜂鸣器×1个软件应用程序和在线服务:ArduinoIDE手动工具和制造机:CrealityCR10S5我的朋友给我一个小挑战项目:我们必须创建一种可以检测漏水并通过Internet发送状态数据的设备。挑战包括一个约束:我必须使用WEMOS开发板。我认为该项目是使用电池的不错选择,因此我围绕电池进行了设计。我决定使用现有的电池屏蔽罩为电子电路上电。这是我第一次使用电池构建电子项目的经验。结果有效,但是有点耗电。首先,通过查看该项目的视频演示来检查该项目。然后,我将遍历电路,解释其工作原理。电路在测量不包括WEMOS的电子消耗量时,我们可以看到它消耗的电流为1.22ma,对于使用电池工作的设备而言,这还不够低,但是由于我决定使用9900mah电池,因此我希望该电路能够自动工作至少41周我认为这对我来说是可以的,因为我的第一个项目是使用电池运行。探测器第一部分是比较器:我连续使用的运算放大器比较点(a)和(b),并在导线接触水时做出反应。我们知道水不导电,因此我们期望在400k欧姆至3M欧姆之间,并且当检测器不接触水时,点(a)将由3.3M电阻上拉。一旦水接触到引线,它就会拉到地面,并创建一个分压器,MCP602将其与由2个100K电阻器创建的另一个分压器进行比较。结果是运算放大器的输出变为高电平。重置在电路的第二部分,首先有一个电容器(a),用于平滑运算放大器(MCP602)的输出。在分析示波器上的输出时,我注意到,在水接触到引线的那一刻,它可能会在稳定之前在高电平和低电平之间产生一些切换,因此设置一个小上限可使输出平滑。然后是一个耦合电容器(b),当输出(a)变为高电平时,它将产生一个峰值。重要的是不要将该值设置为高电平,因为复位必须是单个尖峰,这就是该上限的作用。然后,当产生尖峰时,它将触发将电压下拉至地的晶体管,将WEMOS复位一次(c)并唤醒控制器。该程序将通过在D6引脚上使用digitalRead来检查运算放大器的输出电压是否高(d),以及是否是否有水(避免错误复位)。因此,这实际上意味着导线正在接触水。然后,该程序将信息发布到io.adafruit.com上。Adafruit是一项免费服务,允许IOT设备使用MQTT在提要上发送和读取数据。蜂鸣器一旦确认进水,WEMOS就会通过引脚D7(a)触发蜂鸣器。我有一个旧的RC蜂鸣器。蜂鸣器非常响亮并且使用非常简单,只需要一个高值就可以触发并自动鸣响蜂鸣器3次。然后,该程序将一个值写入WEMOS的EEPROM中,并进入深度睡眠状态,持续30秒。唤醒后,它会读取EEPROM并知道过去已检测到水,并且再次读取digitalRead引脚D6,如果水仍然很高,它将再次触发蜂鸣器并循环直到不再检测到水为止。此步骤很重要,因为初始唤醒仅发生一次。当检测到水时,运算放大器将变为高电平并保持高电平,因此不会再次发生复位。我的程序也应该能够依赖计时器。最后,我编程2个启动顺序充当wifi客户端并连接到云以发送数据的启动序列充当wifi热点的启动序列,因此我可以连接到该序列以配置wifi个人信息电压监控器就像在下一部分中看到的那样,我将一条电线直接从电池连接器焊接到了板子(a),这样程序可以读取并计算电压。我计算了分压器(b)中的2个电阻,然后仔细评估了发送到云的电压值。启动后,WEMOS读取引脚A0并评估电压。然后,该程序将计算出的值发送到云中。云视图如前所述,我的设备在io.adafruit.com上发送数据。Adafruit可轻松为此类项目自由使用物联网服务,而我经常使用它。我创建的仪表板使我可以查看状态,WEMOS与MQTT服务通信的时间以及电池电压。外壳即使这篇文章更多关于电子产品,我也必须提到我设计外壳的方式。首先,这是我想到的一个3D视图,当我想到一个泄漏检测仪坐在热水箱附近的混凝土上时我设计了3点外壳。其中有不锈钢螺钉,其中之一是塑料盖的一部分。在下一个图像中,您可以看到我使用了BarrelWireCrimp铜端子连接器与2颗螺钉接触,该2颗螺钉用作外壳的支腿。我将电线焊接到了铜连接器上,并将另一端连接到电路上。
工人在清洗污水时必须面对的问题是跌落,起火,耗氧,有毒气体等。从上述问题出发,我们必须高度重视有毒气体,这会导致严重的健康问题,例如肝炎和伤寒,并且如果这些气体的数量迅速增加,请不要提早警告。有时可能导致人类死亡。清洁污水时会产生有害气体,包括甲烷(CH4),一氧化碳(CO),氨(NH3),硫化氢(H2S)。甲烷等窒息性气体很容易替代氧气,并被困在密闭空间中。这些有害气体大多数与氧气发生反应,耗尽了下水道中的氧气浓度。H2S有剧毒,是一种无声的威胁。在石油,废水管理中,天然气工业中的H2S是许多有毒物质暴露的原因。会导致严重的健康问题取决于其暴露时间和浓度。使用感应H2S含量和毒性的H2S传感器。卸下人孔盖进行清洁时,这些有害气体会影响站附近的人。通常,腔室/检修孔在进入之前要打开一段时间。目的是开发一种能够在一分钟内检测到这些有毒气体的存在并在各种水平下产生红光的设备。如果任何一种气体达到其目标限值,它将通过led发出警报。在清洁操作之前,将脉搏血氧饱和度传感器固定在工人的手上。警报系统基于心跳传感器发出蜂鸣器信号并引起外部工作人员的注意。Arduino用作控制板,它具有众多功能,使其适合各种应用。无线传感器网络可在农业,医疗保健,机器人技术,环境监测等大量应用中经济高效地实现。这里使用WSN,所有感测到的数据将集体存储在云中,并且可以实时访问所有数据以进行连续监视。GSM是当今广泛应用中的一种技术。GSM模块用于向相关机构发送警报消息。该系统具有紧急按钮,如果电子设备出现故障,该按钮将起作用。其引脚连接为:•电源引脚(5V,GND)•MQ-136传感器输出连接到模拟引脚A0。•MQ-4传感器输出连接到模拟引脚A1。•MQ-7传感器输出连接到模拟引脚A2。•将Arduino的Tx端子连接到ESP8266的RX端子。