Arduino

针对与Arduino兼容的开源硬件和软件开发人员的问答

5
高效的算法/数据结构来计算移动平均值
目前,我正在开发图形LCD系统,以显示热泵系统中的温度,流量,电压,功率和能量。使用图形LCD意味着屏幕缓冲区和字符串耗尽了我一半的SRAM和约75%的闪存。 我当前正在显示能源的最小/最大/平均数字。在午夜,当重置每日数字时,系统将检查当天的消耗量是否高于或低于先前的最小值或最大值,并存储该值。通过将累计能耗除以天数来计算平均值。 我想显示最近一周和一个月的日平均值(为简单起见,为4周),即滚动平均值。当前,这涉及维护最近28天的值数组,并计算整个数组中每月的平均值和每周的最后7天的平均值。 最初,我是使用浮点数组来完成此操作的(因为能量的形式为“ 12.12kWh”),但这使用的是28 * 4字节= 112字节(占SRAM的5.4%)。我不在乎分辨率只有一个小数点,因此我改为使用uint16_t并将该数字乘以100。这意味着12.12表示为1212,为了显示目的,我将其除以100。 数组的大小现在减少到56个字节(好多了!)。 没有简单的方法可以将图形缩小到我能看到的uint8_t。我可以忍受小数点后的损失(“ 12.1kWh”而不是“ 12.12kWh”),但是功耗通常高于25.5kWh(255是由8位无符号整数表示的最大值)。耗电量从未低于10.0kWh或高于35.0kWh,因此可以想象,我可以从存储的数据中减去10,但是我知道有一天我们会超过这些限制。 然后,我测试了将9位值打包到数组中的代码。范围为0-51.2kWh,总共使用32个字节。但是,访问这样的数组非常慢,尤其是当您必须遍历所有值以计算平均值时。 所以我的问题是-是否有更有效的方法来计算三个窗口(寿命,28天和7天)的移动平均值?效率意味着就SRAM的使用而言更小,但不会带来巨额代码的代价。我可以避免存储所有值吗?

4
在循环外声明变量和在循环内声明静态变量有什么区别?
这是我可以在循环(或任何函数)之外保存变量的两种方式。 首先,我可以在循环外使用全局范围声明它: void setup() { Serial.begin(9600); } int count = 0; void loop() { Serial.println(count); count++; delay(250); } 我还可以在循环内将其声明为静态的: void setup() { Serial.begin(9600); } void loop() { static int count = 0; Serial.println(count); count++; delay(250); } 这有什么区别(如果有)?

8
确定5加仑的水壶是否空的最佳方法
我有一台意式浓缩咖啡机,可以从那5加仑的蓝色水瓶中的一个取水(我会试水,但是这里的水太难喝了)。 如果我不小心使瓶子的水用完了,浓缩咖啡机中的旋转泵将会损坏,这将是一个代价高昂的错误。 我知道我可以在水瓶中安装某种磁性浮子传感器,但是由于我必须每隔几周更换一次,因此在水瓶中装另一件东西会使更换起来更加困难,并且更容易产生微生物污染。将水从瓶中抽出的泵在盖上形成紧密密封,任何在其下方或通过瓶盖流动的东西都会破坏该密封。 有什么我可以用来检测瓶外水位是否低的东西吗?像激光传感器一样?

3
精确控制水温
我有以下设置: Arduino Duemilanove 小型热水器与光继电器连接(PWM正常) 防水DS18B20温度传感器 未知水量(但温度传感器和加热器始终在水下)。 如何根据温度传感器的读数准确控制水温?准确地说,我指的是达到温度传感器的精度(在这种情况下为±0.5°C)。一切都应该在Arduino上运行,因此没有额外的数据存储或处理能力。对于调试,我显然可以使用计算机。 我已经尝试过运行PID,但似乎真的很难 避免超调-最初或在添加(冷)水时超过目标温度 加入冷水后要适当稳定。
9 pwm  pid 


5
Arduino如何输出特定的(即56 kHz)载波频率?
我正在研究一个自由空间光学项目,以在两点之间无线发送数据。为了实现这一点,我使用了连接到Arduino Uno的IR LED,该信号以发射器的56 kHz载波频率脉动,而第二个Arduino以接收器的56 kHz红外探测器模块脉动。 我尝试在引脚高电平和引脚低电平命令之间使用delayMicroseconds()来创建载波频率。这种工作方式有效,但是频率并不总是相同,脉冲信号的任何其他延迟(即调用函数和递减所需的时间)都可以改变它。 阅读ATmega328的数据表,似乎可以使用芯片的定时器来设置更精确的脉冲。这是否可能,如果可以,如何使用计时器创建一个56 kHz的脉冲?

2
使用无效的密码时会发生什么?
相关信息: 如果出现运行时错误会怎样? 这个问题类似于上面的问题,但是这是另一种情况: int pin = 999; pinMode(pin, OUTPUT); digitalWrite(pin, HIGH); 在这种情况下会发生什么?编译器可能会捕获它,但是如果您使用随机数,IDE会捕获它吗?


4
如何真正缩小草图
为了测试,我想制作一个尽可能小的草图。问题是,当我编译BareMinimum草图(具有空的设置和循环)时,Uno会得到466个字节,Leonardo会得到4,242个字节。有什么办法可以编写自己的没有额外功能的代码(即millis()和的Timer0 delay())。我还希望能够禁用Leonardo的键盘/鼠标功能。

2
如何管理依赖关系?
我想包括一个类似Logging的依赖项。在其页面上显示: 下载压缩文件 将日志记录文件夹放在“ libraries \”中。 我不想(以Maven的心态)相信这是我们在Arduino项目中管理依赖项的方式。这意味着,签出我的软件包的每个人都必须在本地重复这些步骤(或者您在版本控制中是否包含“ libraries \”),依赖性管理的最佳实践是什么?
9 library 

2
Arduino Uno有两个晶体吗?
看一下这张照片: 我认为大多数人都同意板上(红色)上的“大银色”东西是Arduino著名的16 MHz晶体。直到最近我才相信这一点。 我很无聊,所以我看了看我的Arduino Uno,发现它看起来像是另一个晶体(黄色)。看起来像Pro Mini上的那个。它也位于XTAL引脚附近。在我第二次检查原理图之后,板上似乎也有两个晶体。 这两个中的哪一个实际上连接到XTAL引脚,为什么有两个?

4
Arduino板预处理器列表#defines
当人们在Arduino IDE中选择板子时,预处理器定义将添加到其中一个后台文件中。 经过大量的搜寻和一些好运,我发现此定义的格式为: #define ARDUINO_<PROCESSOR-DESCRIPTOR>_<BOARDNAME> 有些很容易猜到(ARDUINO_AVR_UNO例如,),而有些则不太容易猜到。Pro Micro根据速度在定义后附加“ 16”或“ 8”。我不知道5V或3.3V的定义是否不同。我还没有猜到Mega2560的定义,但是它并不明显。 问题1:是否存在可能定义的清单? 问题2:就编译和预处理器的参与而言,BoardX -5V和BoardX -3.3V 之间有什么区别,如何区分?

10
在Arduino中以不同方式(最快)计算正弦(和余弦)
我正在使用Arduino Uno开发板来计算系统角度(机械臂)。使用ADC的整个范围,角度实际上是ADC的10位值(0至1023)。我只会在第一象限(0至90度)中操作,正弦和余弦均为正,因此负数没有问题。我的疑问可以用3个问题来表达: 在Arduino上计算这些三角函数有哪些不同的方法? 什么是最快的方法? Arduino IDE中有sin()和cos()函数,但是Arduino如何实际计算它们(例如它们是否使用查找表或近似值等)?它们似乎是一个显而易见的解决方案,但是在尝试之前,我想知道它们的实际实现。 PS:我对Arduino IDE上的标准编码和汇编编码以及未提及的任何其他选项都开放。我也没有错误和近似的问题,这对于数字系统是不可避免的。但是,如果可能的话,最好提一下可能的错误程度

2
Arduino在20 MHz?
我不知道为什么Arduino不能以AVR指定的频率20 MHz运行。现在,以16 MHz运行,我们白白浪费了20%的性能。 我认为将16 MHz谐振器替换为20 MHz类型不会有任何影响,这可能是引导加载程序中波特率的唯一例外。还是在那里? 有人知道为什么Arduino设计人员选择16 MHz吗?

2
从Arduino IDE移除未使用的板
在当前项目中,我正在同时编程一个UNO董事会和一个Leonardo董事会。 在“ 工具”菜单中的两个板之间来回切换会花费太多时间,因为我仍然不拥有其他18个板。 有没有办法从“工具”菜单中删除那些板?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.