问题标签 [arduino-c++]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
244 浏览

c++ - 迭代对比 将整数打印到字符 LCD/OLED 显示器的递归

问题

我正在寻找一些关于如何优化将整数的数字打印uint32_t num = 1234567890;到带有 Arduino UNO 的字符显示的输入。要考虑的主要指标是内存使用量和编译大小。显示速度太慢了,没有任何提高速度的意义,最小代码长度虽然不错,但不是必需的。

目前,我正在使用提取最低有效数字num%10,然后删除该数字num/10,依此类推,直到num提取所有数字。使用递归,我可以颠倒打印的顺序,因此只需要很少的操作(作为明确的代码行)就可以按正确的顺序打印数字。使用for循环我需要找到用于写入数字的字符数,然后存储它们,然后才能以正确的顺序打印它们,需要一个数组和 3 个for循环。

根据 Arduino IDE,当打印各种有符号和无符号整数时,递归使用2010/33字节的存储/内存,而使用扩展类的库时,迭代使用2200/33字节和 2474/52字节。Adafruit_CharacterOLEDPrint

有没有办法比我在下面使用递归和迭代编写的函数更好地实现这一点?如果不是,你更喜欢哪一个,为什么? 我觉得可能有更好的方法可以用更少的资源做到这一点——但也许我是堂吉诃德与风车搏斗,代码已经足够好了。

背景

我正在使用 NHD-0420DZW 字符 OLED 显示器,并使用 Newhaven 数据表和 LiquidCrystal 库作为编写我自己的库的指南,并且显示器运行良好。然而,为了尽量减少代码膨胀,我选择不让我的显示库成为 的子类Print,它是 Arduino 核心库的一部分。在此过程中,已经实现了存储空间(~400 字节)和内存(~19 字节)的显着节省(ATmega328P 具有 32k 存储空间和 2k RAM,因此资源稀缺)。


递归

如果我使用递归,打印方法相当优雅。该数字除以 10,直到达到基本情况为零。然后打印最小数字的最低有效位(num的MSD),下一个最小数字的LSD(num的第二个MSD)等等,导致最终的打印顺序颠倒。%10这更正了使用和/10操作的数字提取的相反顺序。

迭代

由于数字提取方法从 LSD 而不是 MSD 开始,所以提取的数字不能直接打印,除非我移动光标并告诉显示器从右到左打印。所以我必须在提取数字时存储它们,然后才能以正确的顺序将它们写入显示器。


更新

最终,递归占用最少的存储空间,但可能使用最多的内存。

在查看了 Igor G 和 darune 提供的代码,以及查看 Godbolt 上列出的指令数量(由 darune 和 old_timer 讨论)后,我相信 Igor G 的解决方案是最好的整体。在测试期间,darune 的函数(使用语句停止前导零并能够打印)编译为2076字节与2096字节。当附加必要的语句时,它还需要比 darune 的 (273) 更少的指令 (88) 。if0if

使用指针变量

使用索引变量

这就是我最初的for循环试图做的,但是以一种天真的方式。正如 Igor G 所指出的那样,试图最小化缓冲区数组的大小确实没有意义。


替代方案

这是 darune 的函数,添加了 if 语句,供那些不想筛选评论的人使用。条件pow10 == 100与 相同pow10 == 1,但在具有相同编译大小的情况下保存了循环的两次迭代以打印零。

0 投票
1 回答
965 浏览

arduino - 如何使用 SdFat 从 SD 卡中删除最旧的文件

我正在尝试使用 SdFat 从 sd 卡中删除最旧的文件,但没有成功

我在 Arduino 论坛上发现了这个 功能

但是当这个函数运行任何想法为什么以及如何解决这个问题时,我会收到一条“失败”消息?

编辑:我可以像这样使用删除:

file.remove()仍然无法正常工作

0 投票
1 回答
71 浏览

c++ - 如果我传递一个临时引用并将其存储为类成员会发生什么?

我有一个类存储对某种应用程序状态的引用,然后在操作期间它会发生变化:

通常我会创建并传递state这样的:

如果我像这样初始化 Mutator,我的 Mutator 类中的状态引用会发生什么:

我假设,由于状态引用是临时的,Mutator._state成员将指向一个内存位置,该位置可能包含也可能不包含导致不可预测行为的状态值。它是否正确?

0 投票
1 回答
5003 浏览

esp32 - 如何修复“大师冥想错误:核心 1 恐慌”(LoadProhibited)。由 registerForNotify() 引起的异常未处理

我正在尝试通过蓝牙连接两个 ESP32,一个用作服务器,一个用作客户端。将客户端连接到服务器就可以了,并且发现特性也可以。但是当我尝试为通知注册特征时,我收到一条错误消息。

我的其余代码似乎工作得很好,因为如果我不注册通知特性,我没有任何问题。

我总是收到以下错误消息:

0 投票
0 回答
3348 浏览

json - 使用 JSON 的 Arduino POST 请求

我正在尝试让我的 Arduino(带有以太网屏蔽)将带有 JSON 正文的 POST 请求发送到我的本地托管服务器。

我正在使用ArduinoJson(版本 6)和以太网库。

我正在尝试使用 ArduinoJSON 的 JSON 创建功能向本地端点(托管在我的笔记本电脑上)/routes/test发送POST请求。使用该库,我创建了一个名为doc的 DynamicJsonDocument并向其写入属性。然后我使用serializeJson将文档的数据写入 POST 请求。

我的问题:我向端点/routes/test发出 POST 请求,但是当我 console.log 正文时,它显示为空。似乎我的帖子请求中没有包含任何正文

在请求对象上使用utils.inspect,我得到这个:

身体: {}

这是语法问题还是我的方法存在根本问题?任何帮助将不胜感激!!。

0 投票
3 回答
2896 浏览

c++ - “'SomeFuction'的多重定义”。不知道如何修复

我正在编写一个 Arduino 应用程序(在 VSCode 中使用 platformIO),并包括一个外部 CAN 库(FlexCAN_T4)。我想在一个单独的文件(protocol.cpp)中定义我所有的协议/消息处理程序回调,并从我的主文件(main.cpp)中引用它们。所以我用我所有的函数签名创建了一个头文件(protocol.h),并包含来自protocol.cpp和main.cpp的protocol.h。

但是我得到了“'flexcan_isr_can1()'的多重定义”(这是一个在引用库 FlexCAN_T4 中定义的函数)。我无法弄清楚如何摆脱这个错误,并且仍然拥有我所有的函数签名和常量以及无法正常工作的东西。

示例错误消息(FlexCan_T4.h 中定义的每个非类函数一个):

协议.h

协议.cpp

主文件

从某种意义上说,这些错误是有道理的,因为 protocol.h(以及,可传递的,FlexCAN_T4.h)被多次#included。

但是我怎样才能保持这种良好的代码组织,我的回调在 main.cpp 之外定义?包含这些依赖项的正确方法是什么?

0 投票
1 回答
113 浏览

arduino - 如何使用 ESP32 控制多个舵机

我是 arduino/ESP32 的新手。我想在 ESP32 的帮助下控制几个伺服电机。我想以不同的速度控制所有伺服系统,并想使用正弦波逻辑来控制速度。

我有可以单独控制 2 个伺服系统的代码。我在这里附上了代码,

我想要此代码给出的相同输出,但使用正弦波。但我不知道如何在 ESP32 中实现正弦波逻辑。我怎样才能做到这一点?

0 投票
1 回答
55 浏览

arduino - 使用 DHT 11 温度/湿度传感器进行 Arduino 练习,但出现问题

我目前正在将温度数据从传感器发送到 lcd 16x2 显示器,我可以显示温度,但它会不断地从温度到 -999 交替显示,当我打印它们时,它也会在串行监视器中显示这样的数据。谁能告诉我我做错了什么?这是我草率的代码,抱歉没有正确注明,但我仍在掌握基础知识。

0 投票
0 回答
366 浏览

arduino - 如何获得 +IPD 响应的值

问题是 +IPD 响应的值没有显示在 ReadLastEntryThingSpeak() 中,所以我的代码不正确或者我必须添加一些东西?我搜索了很多网站 Arduino 论坛、Thingspeak 论坛等。但我没有看到任何解决方案。:(

我尝试了这个系统 5 天,但它不起作用,为什么?

我有 Received data = 的结果,但实际输出是 Received data = 120。

0 投票
1 回答
822 浏览

arrays - 如何通过 MATLAB 向 ESP32 串口发送一个大数组(96000 个样本)?

简而言之,我正在 MATLAB 中读取 .wav 文件,以便将其发送到 ESP32 进行 FFT 分析。有问题的 .wav 文件包含电晕效应的记录。输入 MATLAB 时,我的文件有 96223 个样本。

现在,我正在尝试取回校验和,以便知道数据已正确发送。

我已经尝试使用我为较小样本量编写的代码。例如,当我发送 200 个样本时,我得到了正确的校验和,尽管代码花费的时间比我想要的要长,这并不好。不仅如此,而且由于超时,我再也没有得到任何回报。

这是我的 MATLAB 代码:

这是我的 Arduino 代码:

我希望能取回校验和,但在使用非常大的样本量时会超时。我还应该补充一点,即使 ESP32 应该能够处理我的文件,我也不能将整个文件推送到串行端口,因为我收到缓冲区溢出错误。有针对这个的解决方法吗?