Arduino 代码异常 - LCD 出现故障并显示多个 'if' 语句
Arduino code anomalies - LCD fails with multiple 'if' statements
我有一个关于一些代码和奇怪异常的问题。此代码放置在 Digispark 上。Digispark 的代码大小限制为 6,010 字节。使用嵌套if
语句时,文本不会输出到 LCD 屏幕(请参阅下面的链接)。通过单独注释掉每个集合,我能够让它再次工作。
基本液晶功能:
- LCD 输出内部啤酒温度和环境空气温度 https://i.stack.imgur.com/4hAQk.jpg
- 液晶屏清除
- LCD 输出目标温度和加热器(继电器)状态 https://i.stack.imgur.com/eYaJf.jpg
变量为浮点型。
float inside_temp;
float outside_temp;
float target = 74.00;
//inside_temp and outside_temp are values from 2 ds18b20's
inside_temp = 70.70;
outside_temp = 70.81;
使用此代码时,液晶屏工作正常,并像这样注释掉。编译大小为 5,928 字节。
if(inside_temp < target){
//Create a limit so heater isn't crazy hot as 5 gallons takes a while to change temperature.
// float limit = target + 1;
// if(outside_temp > limit){
// digitalWrite(RELAY_PIN, LOW);
// lcd.print("OFF");
// }
// else{
digitalWrite(RELAY_PIN, HIGH);
lcd.print("ON");
// }
}
else{
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}
液晶屏也可以使用此代码。编译大小为 5,590 字节。
// if(inside_temp < target){
//Create a limit so the heater isn't crazy hot as 5 gallons takes a while to change temperature.
float limit = target + 1;
if(outside_temp > limit){
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}
else{
digitalWrite(RELAY_PIN, HIGH);
lcd.print("ON");
}
// }
// else{
// digitalWrite(RELAY_PIN, LOW);
// lcd.print("OFF");
// }
液晶屏在取消注释时无法正常工作。编译大小为 5,992 字节。它所做的只是坐在那里,背光亮着,没有文字。https://i.stack.imgur.com/OUt15.jpg
if(inside_temp < target){
//create a limit so heater isn't crazy hot as 5 gallons takes a while to change temperature.
float limit = target + 1;
if(outside_temp > limit){
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}
else{
digitalWrite(RELAY_PIN, HIGH);
lcd.print("ON");
}
}
else{
digitalWrite(RELAY_PIN, LOW);
lcd.print("OFF");
}
我不明白为什么会这样。发生这种情况是因为我太接近最大大小限制吗?我可以不这样构建代码吗?
以决定性的方式回答这个问题,而无法在本地进行测试。
听起来确实很可疑,当代码大小接近最大值时它会中断。另一方面,它似乎表明工具中的一个错误,如果超过某个限制,它不会"硬"中断。
有关如何减小代码大小的一些提示:
- 不要使用
float
,因为 CPU 必须模拟它。定点格式应该适用于温度。 - 分解函数调用
digitalWrite()
和lcd.print()
,因为函数调用生成了相当多的代码。
分解这些调用的一种方法是执行以下操作:
uint8_t relay_pin = LOW;
const char *lcd_text = "OFF";
if(inside_temp < target) {
float limit = target + 1;
if(outside_temp > limit) {
}
else {
relay_pin = HIGH;
lcd_text = "ON";
}
}
digitalWrite(RELAY_PIN, relay_pin);
lcd.print(lcd_text);
这利用了我们希望始终更新LCD和继电器的事实,因此我们始终可以调用函数。然后我们使用变量来保存所需的值,因为赋值通常比函数调用便宜(就代码大小而言)。
不要忘记RAM的小尺寸,因为Attiny85只有512字节的SRAM,而328的2K。您可能只是用完了 RAM。我了解到,当它用完时,它就坐在那里。
我建议阅读此库中的自述文件以获取FreeRAM。它提到了".print"如何同时消耗RAM和ROM。
我现在总是使用
Serial.print(F("HELLO"));
对
Serial.print("HELLO");
因为它节省了RAM,对于lcd.print来说应该是这样。我总是把一个
Serial.println(freeMemory(), DEC); // print how much RAM is available.
在代码的开头,并注意。注意需要有空间来运行实际代码并递归到其中。
Unwind 将 .print out 分解为仅一个实例的示例是使用变量。它实际上与 F()(较旧的 getPSTR())类似,因为它不再是常量字符串。所以它实际上也使用更少的RAM。
- 我的简单if-else语句是如何无法访问的代码
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 我似乎对if/else的基本语句有问题:/
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- Craps游戏问题,忽略if语句
- c++:定义if语句中的模板
- C++嵌套的 If 语句中,它无法按预期工作
- 如果中的多个语句是否与多个 if 相同?
- C++ If/Else 语句被跳过
- 使用语句if时逻辑的问题
- 如何添加语句if-else
- 如何将语句if(isalpha(c))从c++转换为MIPS ?
- 在if语句if C++中创建对象时出现作用域问题
- if语句-if/else和参数放置C++