Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Arduino代码异常-LCD出现多个';如果';声明_C++_Arduino - Fatal编程技术网

C++ Arduino代码异常-LCD出现多个';如果';声明

C++ Arduino代码异常-LCD出现多个';如果';声明,c++,arduino,C++,Arduino,我有一个关于一些代码和奇怪异常的问题。此代码放置在一个目录上。Digispark的代码大小限制为6010字节。使用嵌套的if语句时,文本不会输出到LCD屏幕(请参阅下面的链接)。通过分别评论每一组,我能够让它再次工作 基本LCD功能: LCD输出内部啤酒温度和环境空气温度 液晶显示器清除 LCD输出目标温度和加热器(继电器)状态 变量是浮点型的 float inside_temp; float outside_temp; float target = 74.00; //inside_temp

我有一个关于一些代码和奇怪异常的问题。此代码放置在一个目录上。Digispark的代码大小限制为6010字节。使用嵌套的
if
语句时,文本不会输出到LCD屏幕(请参阅下面的链接)。通过分别评论每一组,我能够让它再次工作

基本LCD功能:

  • LCD输出内部啤酒温度和环境空气温度
  • 液晶显示器清除
  • LCD输出目标温度和加热器(继电器)状态
  • 变量是浮点型的

    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;
    
    当使用此代码时,LCD工作,并将其注释如下。编译后的大小为5928字节

    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");
      }
    
    if(内部温度限制){
    //数字写入(继电器引脚,低电平);
    //液晶显示器。打印(“关闭”);
    // }
    //否则{
    数字写入(继电器引脚,高电平);
    lcd.打印(“ON”);
    // }
    }
    否则{
    数字写入(继电器引脚,低电平);
    液晶显示器。打印(“关闭”);
    }
    
    LCD也可以使用此代码。编译后的大小为5590字节

    // 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");
        // }
    
    //如果(内部温度限制){
    数字写入(继电器引脚,低电平);
    液晶显示器。打印(“关闭”);
    }
    否则{
    数字写入(继电器引脚,高电平);
    lcd.打印(“ON”);
    }
    // }
    //否则{
    //数字写入(继电器引脚,低电平);
    //液晶显示器。打印(“关闭”);
    // }
    
    未注释时LCD不工作。编译后的大小为5992字节。它所做的只是坐在那里,背光亮着,没有文字

    if(内部温度限制){
    数字写入(继电器引脚,低电平);
    液晶显示器。打印(“关闭”);
    }
    否则{
    数字写入(继电器引脚,高电平);
    lcd.打印(“ON”);
    }
    }
    否则{
    数字写入(继电器引脚,低电平);
    液晶显示器。打印(“关闭”);
    }
    

    我不明白为什么会这样。发生这种情况是因为我太接近最大尺寸限制了吗?我可以不这样构造代码吗?

    我认为如果不能在本地进行测试,就很难得出结论性的答案

    不过,它听起来确实很可疑,当代码大小接近最大值时,它就会中断。另一方面,它似乎表明工具中存在一个bug,如果超过某个限制,它不会“硬”突破

    关于如何减少代码大小的一些提示:

    • 不要使用
      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);
    
    uint8继电器引脚=低电平;
    const char*lcd_text=“关闭”;
    如果(内部温度<目标温度){
    浮动限制=目标+1;
    如果(超出温度>限制){
    }
    否则{
    继电器_引脚=高;
    lcd_text=“ON”;
    }
    }
    数字写入(继电器引脚、继电器引脚);
    打印(lcd_文本);
    

    这使用了我们希望始终更新LCD和继电器的事实,因此我们可以始终调用函数。然后,我们使用变量来保存所需的值,因为赋值通常比函数调用便宜(这里以代码大小而言)。

    不要忘记RAM的小尺寸,因为与328的2K相比,Attiny85只有512字节的SRAM。您可能只是内存不足。我了解到当它用完的时候,它只是坐在那里

    我建议你读一下这个图书馆的免费图书。它提到“.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。

    我将其分解为true或false,然后调用digitalWrite()。我将一些int变量更改为byte,因为无论如何只需要0-255。我还去掉了float limit=target+1,并将target+1放在if比较中。我还删除了一些.print语句。
    Serial.println(freeMemory(), DEC);  // print how much RAM is available.