首页 > 解决方案 > 如何解决 Arduino 中可用的内存不足的问题

问题描述

我正在使用这段代码:

#include <HCSR04.h>
#include <SoftwareSerial.h>
#include <ArduinoJson.h>
#include <Wire.h>
#include "RTClib.h"

#define buzzer 2

//initialisation class HCSR04 (trig pin , echo pin)
HCSR04 hcAir(13, 12);
HCSR04 hcPakan(11, 10);

SoftwareSerial s(5, 6);
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jum'at", "Sabtu"};

StaticJsonBuffer<1000> jsonBuffer;
JsonObject& root = jsonBuffer.createObject();

void setup() {
  s.begin(115200);
  pinMode(buzzer, OUTPUT);
  rtc.begin();
}

void air() {
  int air = hcAir.dist();
  int rumus = ((100 / 50) * air);
  int isiAir = 100 - rumus;

  if (isiAir <= 0) {
    root["air"] = 0;
    digitalWrite(buzzer, HIGH);
  } else if (isiAir >= 100) {
    root["air"] = 100;
    digitalWrite(buzzer, LOW);
  } else {
    root["air"] = isiAir;
    digitalWrite(buzzer, LOW);
  }
}

void pakan() {
  int pakan = hcPakan.dist();
  int rumus2 = ((100 / 50) * pakan);
  int isiPakan = 100 - rumus2;

  if (isiPakan <= 0) {
    root["pakan"] = 0;
    digitalWrite(buzzer, HIGH);
  } else if (isiPakan >= 100) {
    root["pakan"] = 100;
    digitalWrite(buzzer, LOW);
  } else {
    root["pakan"] = isiPakan;
    digitalWrite(buzzer, LOW);
  }
}

void waktu() {
  DateTime now = rtc.now();
  int jam = now.hour();
  int menit = now.minute();
  String hari = daysOfTheWeek[now.dayOfTheWeek()];

  root["jam"] = jam;
  root["menit"] = menit;
  root["hari"] = hari;
}

void loop() {
  air();
  pakan();
  waktu();

  if (s.available() > 0) {
    root.printTo(s);
  }
}

出现此消息导致代码无法运行:

Sketch 使用 10468 字节(32%)的程序存储空间。最大值为 32256 字节。
全局变量使用 1608 字节 (78%) 的动态内存,为局部变量留下 440 字节。最大值为 2048 字节。
    可用内存不足,可能会出现稳定性问题。

标签: arduinoarduino-idearduino-c++

解决方案


尝试查看您的 Json 的绝对最大大小,并将缓冲区大小 ( StaticJsonBuffer<1000>) 减小到希望较小的数字。

此外,对于简单的 Json,您可以“手动”执行操作而不使用库;您也可以简单地发送名称/值对并且根本不使用 Json。


推荐阅读