单板计算机(SBC)-片上系统(SOC)嵌入式C++和FPGA(VHDL)

要点:

  1. 片上系统/单板计算机嵌入式C++及VHDL编程
  2. 单板计算机(Raspberry Pi)C++实现MQTT监控房间门锁,灯光,并使用RESTful提示状态
  3. 单板计算机(ESP8266)C++ 无线网络 MQTT土壤湿度监测仪,实现HTTP服务器,创建网页版监控界面,构建ESP8266监控固件,单板计算机集成到IP网络,添加二氧化碳检测传感器,使用GPIO和PWM控制继电器和直流压控风扇
  4. 片上系统(SOC)嵌入式C++和FPGA(VHDL)使用Qt建立通讯和图形界面,创建简易示波器

片上系统/单板计算机

片上系统 (SoC) 与 MCU 类似,但与那些类型的嵌入式系统不同,它具有一定程度的集成,同时仍需要大量外部组件才能运行。 它们通常作为单板实现(单板计算机 (SBC))的一部分,包括 PC/104 标准,以及最近的外形尺寸,例如 Raspberry Pi 和衍生板。

大多数 SoC 都是基于 ARM(Cortex-A 系列)的,尽管 MIPS 也很常见。 SBC 通常用于工业环境中。

其他实例是批量生产的电路板,例如智能手机的电路板,它们没有形成预定义的外形尺寸,但仍然遵循具有 SoC 和外部 RAM、ROM 和存储以及各种外围设备的相同模式。

外围设备被定义为向计算机系统添加 I/O 或其他功能的辅助设备。 它可以是从 I2C、SPI 或 SD 卡控制器到音频或图形设备的任何设备。 其中大部分是物理 SoC 的一部分,其他部分是通过 SoC 向外界公开的接口添加的。 外部外设的示例包括 RAM(通过 RAM 控制器)和实时时钟 (RTC)。

Raspberry Pi 监控房间C++ MQTT

我们将研究基于 SBC 的解决方案的实际实施,该解决方案为房间监控执行以下功能:

示例基础情景是,我们有一个房间,我们希望能够监控其锁定的状态,并在房间内部有一个开关,调节房间中的非永久性电源插座是否通电。 打开房间状态开关将为这些插座供电。 我们还希望通过 MQTT 发送通知,以便房间或其他地方的其他设备可以更新其状态。

MQTT 是一种基于 TCP/IP 的简单二进制发布/订阅协议。 它提供了一种轻量级通信协议,适用于资源受限的应用,例如传感器网络。 每个 MQTT 客户端都与中央服务器通信:MQTT 代理。

硬件结构和软件实现

ESP8266无线网络土壤湿度监测仪 C++ MQTT

为了让植物保持活力,你需要考虑以下因素:营养、灯光和水。

其中,前两种通常分别采用营养丰富的土壤和将植物放置在光线充足的地方,满足这两点后,保持植物存活的主要问题通常是第三点,因为这必须每天处理。

在这里,不仅仅是保持水加满那么简单,而是保持在土壤有足够水但又不过多的范围内。 土壤中水分过多会影响植物通过根部吸收的氧气量。 结果,土壤中的水分过多,植物就会枯萎死亡。

另一方面,水太少意味着植物无法吸收足够的水来补偿通过叶子蒸发的水,也无法将营养物质输送到根部。 在这种情况下,植物也会枯萎死亡。

当手动给植物浇水时,我们倾向于粗略估计植物何时可能需要更多的水,并用手指对表层土壤的湿度进行表面测试。 这不能告诉我们植物根部周围实际存在多少水,是否远低于土壤上层。

基础代码:

#include "base_module.h"BaseModule::SubModule BaseModule::modules[32];
uint32 BaseModule::active_mods = 0x0;
bool BaseModule::initialized = false;
uint8 BaseModule::modcount = 0;void BaseModule::init() {CO2Module::initialize();IOModule::initialize();JuraModule::initialize();JuraTermModule::initialize();MotionModule::initialize();PlantModule::initialize();PwmModule::initialize();SwitchModule::initialize();THPModule::initialize();
}bool BaseModule::registerModule(ModuleIndex index, modStart start, modShutdown shutdown) {// Initialise if necessary.if (!initialized) {for (uint8 i = 0; i < 32; i++) {modules[i].start = 0;modules[i].shutdown = 0;modules[i].index = index;modules[i].bitmask = (1 << i);modules[i].started = false;}initialized = true;}if (modules[index].start) {return false;}// Add the module if it hasn't been registered yet.modules[index].start = start;modules[index].shutdown = shutdown;++modcount;return true;
}// --- NEW CONFIG ---
bool BaseModule::newConfig(uint32 config) {OtaCore::log(LOG_DEBUG, String("Mod count: ") + String(modcount));uint32 new_config = config ^ active_mods; // XOR comparison.if (new_config == 0x0) {OtaCore::log(LOG_INFO, "New configuration was 0x0. No change.");return true; }OtaCore::log(LOG_INFO, "New configuration: " + new_config);for (uint8 i = 0; i < 32; ++i) {if (new_config & (1 << i)) {OtaCore::log(LOG_DEBUG, String("Toggling module: ") + String(i));if (modules[i].started) { if ((modules[i]).shutdown()) { modules[i].started = false; active_mods ^= modules[i].bitmask;}else { OtaCore::log(LOG_ERROR, "Failed to shutdown module.");return false; }}else { if ((modules[i].start) && (modules[i]).start()) { modules[i].started = true;active_mods |= modules[i].bitmask;}}}}return true;
}

温湿度检测代码示例:

#include "bme280_module.h"BME280* BME280Module::bme280 = 0; //(DHT_PIN);
Timer BME280Module::timer;// --- INIT ---
bool BME280Module::init() {// Ensure we got a sensor class instance.if (!bme280) { bme280 = new BME280(); }// Wait for sensor startup, then start logging.if (bme280->EnsureConnected()) {OtaCore::log(LOG_INFO, "Connected to BME280 sensor.");bme280->SoftReset(); // Ensure clean start.bme280->Initialize(); // Initialise and pull calibration data (?).}else {OtaCore::log(LOG_ERROR, "Not connected to BME280 sensor.");return false;}// Create timer.timer.initializeMs(2000, BME280Module::readSensor).start();return true;
}bool BME280Module::shutdown() {timer.stop();delete bme280;bme280 = 0;return true;
}void BME280Module::config(String cmd) {Vector<String> output;int numToken = splitString(cmd, '=', output);if (output[0] == "set_pin" && numToken > 1) {//dhtPin = output[1].toInt();}
}// --- READ SENSOR ---
void BME280Module::readSensor() {float t, h, p;if (bme280->IsConnected) {t = bme280->GetTemperature();h = bme280->GetHumidity();p = bme280->GetPressure();// Publish via MQTT.OtaCore::publish("nsa/temperature", OtaCore::getLocation() + ";" + t);OtaCore::publish("nsa/humidity", OtaCore::getLocation() + ";" + h);OtaCore::publish("nsa/pressure", OtaCore::getLocation() + ";" + p);}else {OtaCore::log(LOG_ERROR, "Disconnected from BME280 sensor.");}
}
硬件和软件实施

片上系统(SOC)嵌入式C++和FPGA(VHDL)简易示波器

此示例基本概述了如何在嵌入式项目中使用 FPGA。 它使用 FPGA 对输入进行采样并测量电压或类似电压,就像示波器一样。 然后,生成的 ADC 数据通过串行链路发送到基于 C++/Qt 的应用程序,该应用程序将显示数据。

硬件和软件实施
参阅一:亚图跨际
参阅二:亚图跨际

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653687.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手把手带你死磕ORBSLAM3源代码(六十二) Atlas.cc GetAtlasKeyframes

目录 一.前言 二.代码 2.1完整代码 一.前言 以下是对每个函数的详细解释: SetKeyFrameDababase(KeyFrameDatabase pKFDB)* 功能:设置Atlas对象的关键帧数据库。参数:pKFDB是一个指向KeyFrameDatabase的指针。实现:将成员变量mpKeyFrameDB设置为传入的pKFDB。GetKeyFram…

(28)Linux 信号保存 信号处理 不可重入函数

首先介绍几个新的概念&#xff1a; 信号递达(Delivery)&#xff1a;实际执行信号的处理动作。信号未决(Pending)&#xff1a;信号从产生到递达之间的状态。信号阻塞(Block)&#xff1a;被阻塞的信号产生时将保持在未决状态&#xff0c;直达解除对该信号的阻塞&#xff0c;才执…

【大厂AI课学习笔记】1.2 人工智能的应用(1)

目录 1.2 人工智能的应用 1.2.1 产业中人工智能的应用 金融 教育 医疗 交通 制造 ——智慧金融 智能风控 智能理赔 智能投研 &#xff08;声明&#xff1a;本学习笔记学习原始资料来自于腾讯&#xff0c;截图等资料&#xff0c;如有不合适摘录的&#xff0c;请与我联…

性能篇,Hashmap的设计与优化?

嗨,小米的技术小窝又迎来了大家!今天我们要聊的话题是大家在日常开发中经常接触到的数据结构之一——HashMap。这个看似简单的键值对存储结构,背后却蕴含了许多设计和优化的奥秘。废话不多说,让我们一起来揭开HashMap的神秘面纱! HashMap的实现结构 在HashMap的实现中,…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十五)

用户端历史订单模块 1. 查询历史订单1.1 需求分析和设计1.2 代码实现1.2.1 user/OrderController1.2.2 OrderService1.2.3 OrderServiceImpl1.2.4 OrderMapper1.2.5 OrderMapper.xml1.2.6 OrderDetailMapper 2. 查询订单详情2.1 需求分析和设计2.2 代码实现2.2.1 user/OrderCon…

第二百九十三回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取图片文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

机器学习之遗传算法(Genetic Algorithm)

机器学习(Machine Learning)是一种通过使用算法和统计模型,使计算机系统能够从数据中学习并改善性能的领域。而遗传算法(Genetic Algorithm)是一种受到自然选择和遗传学原理启发的优化算法,用于寻找问题的最优解或近似最优解。 遗传算法的基本思想是通过模拟自然选择和遗…

C++ 指针,数组与指针之间的关系以及指针运算

文章目录 C 指针C 中使用指针 C Null 指针数组与指针sizeof在数组和指针的上的区别&intArr 和 &intArr[0]的类型 C 指针的算术运算递增一个指针递减一个指针指针的比较 引用 VS 指针C 把引用作为参数C 把引用作为返回值 指针的释放 C 指针 学习 C 的指针既简单又有趣。…

C++ easyX小程序(介绍几个函数的使用)

本小程序通过代码和注释&#xff0c;介绍了easyX窗口及控制台窗口的设置方法&#xff1b;还介绍了easyX中关于颜色、线型、画圆、画方、显示文字以及鼠标消息处理等函数的使用方法。为便于理解&#xff0c;本程序同时使用控制台和easyX窗口&#xff0c;由控制台控制程序运行、由…

SpringBoot常见错误

SpringBoot常见错误 1、SpringBoot启动时报错 错误: 找不到或无法加载主类 com.xxx.xxx.Application springboot启动时报错错误&#xff1a;找不到或无法加载主类 com.xxx.xxx.Application。 解决方法就是打开idea的控制台&#xff0c;输入以下三行命令&#xff1a; mvn cl…

nginx安装ssl模块http_ssl_module

查看nginx安装的模块 /usr/local/nginx/sbin/nginx -V若出现“–with-http_ssl_module”说明已经安装过&#xff0c;否则继续执行下列步骤 进入nginx源文件目录 cd /usr/local/nginx/nginx-1.20.2重新编译nginx ./configure --with-http_ssl_module如果组件linux缺少&…

综合案例 - 商品列表

文章目录 需求说明1.my-tag组件封装&#xff08;完成初始化&#xff09;2.may-tag封装&#xff08;控制显示隐藏&#xff09;3.my-tag组件封装&#xff08;v-model处理&#xff1a;信息修改&#xff09;4.my-table组件封装&#xff08;整个表格&#xff09;①数据不能写死&…

《HTML 简易速速上手小册》第3章:HTML 的列表与表格(2024 最新版)

文章目录 3.1 创建无序和有序列表&#xff08;&#x1f4dd;&#x1f31f;&#x1f44d; 信息的时尚搭配师&#xff09;3.1.1 基础示例&#xff1a;创建一个简单的购物清单3.1.2 案例扩展一&#xff1a;创建一个旅行计划清单3.1.3 案例扩展二&#xff1a;创建一个混合列表 3.2 …

uniapp报错:export { render, staticRenderFns, recyclableRender, components }

uniapp vue2项目启动报错 export { render, staticRenderFns, recyclableRender, components }解决办法: 降低prettier的版本 "prettier": "^3.2.4","prettier": "2.8.8",参考 SyntaxError: /xxxx.vue: Unexpected token, expected…

【数据分享】1929-2023年全球站点的逐年平均气温数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

win11 系统 WSL2 备份与还原

win11 系统想要使用 linu 开发环境&#xff0c;除了虚拟机&#xff0c;就是 wsl 好使了。 但是 wsl 如过用了一段时间里面环境工程配置迁移麻烦如果重装系统后能直接备份还原就方便了。 确定你的版本 使用 WinR 打开输入框 输入 cmd 命令 打开命令提示符界面 wsl -l -v查看…

com.sun.jna.platform.mac.SystemB$Timeval

错误信息 Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/jna/platform/mac/SystemB$Timevalat java.lang.ClassLoader.defineClass1(Native Method)at java.lang.ClassLoader.defineClass(ClassLoader.java:757)at java.security.SecureClas…

C++笔记(六)

加号运算符重载&#xff1a; 成员函数重载 person operator(person& p) { person temp; temp.m_a this->m_a p.m_a; temp.m_b this->m_b p.m_b; return temp; } 全局函数重载 Person operator(Person& p1, Person& p2) { Person temp; temp.m_A p1.m_A…

GeoHash编码在日志数据处理中的应用与优化

目录 需求说明 GeoHash编码 GeoHash编码介绍 GeoHash编码的基本原理 GeoHash的UDF函数

秀!巧用Python实现对单个文件或多个文件中的指定字符串进行批量(修改)替换

目录 1. 对单份文件 1.1 将替换后的内容保存到新文件中 1.2 直接替换当前文件中的字符 2. 对多份文件&#xff08;支持递归子目录&#xff09; 1. 对单份文件 示例&#xff1a;将文件中字符串“address”替换成“device.address” 1.1 将替换后的内容保存到新文件中 实现…