If you use 10 ultrasonic sensors in the newping library, the "String" content will disappear.
However, if I change it to use 7, the contents of the "String" remain, so what's the problem?
see below please
#include <Adafruit_SSD1306.h>
#include <NewPing.h> // Ultrasound Sensor
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#define SONAR_NUM 10 // Number of sensors.
#define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
#define PING_INTERVAL 33 // Milliseconds between sensor pings (29ms is about the min to avoid cross-sensor echo).
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
int distance;
// OLED λμ€νλ μ΄ κ°μ²΄ μμ±
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);
unsigned long pingTimer[SONAR_NUM]; // Holds the times when the next ping should happen for each sensor.
unsigned int cm[SONAR_NUM]; // Where the ping distances are stored.
NewPing sonar[SONAR_NUM] = { // Sensor object array.
NewPing(10, 0, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping.
NewPing(10, 1, MAX_DISTANCE),
NewPing(10, 2, MAX_DISTANCE),
NewPing(10, 3, MAX_DISTANCE),
NewPing(10, 4, MAX_DISTANCE),
NewPing(10, 5, MAX_DISTANCE),
NewPing(10, 6, MAX_DISTANCE),
NewPing(10, 7, MAX_DISTANCE),
NewPing(10, 8, MAX_DISTANCE),
NewPing(10, 9, MAX_DISTANCE)
};
// OLED λμ€νλ μ΄μ ν
μ€νΈμ μ€μν λ³μ μΆλ ₯νλ ν¨μ
void OLED_display(float voltage, float current, float power, float energy, int unit, int funct) { //λμ€νλ μ΄
// OLED λμ€νλ μ΄ μ΄κΈ°ν
display.setTextSize(1);
display.setTextColor(WHITE);
unsigned long time = millis() / 1000;
String timestr = String(time);
// μ€μν λ³μλ₯Ό λ¬Έμμ΄λ‘ λ³ννμ¬ OLED λμ€νλ μ΄μ μΆλ ₯
char voltageStr[8];
char currentStr[8];
char powerStr[8];
char energyStr[8];
char timeStr[8];
dtostrf(voltage, 6, 2, voltageStr);
dtostrf(current, 6, 2, currentStr);
dtostrf(power, 6, 2, powerStr);
dtostrf(energy, 6, 2, energyStr);
String functstr;
if (funct == 0){
functstr = "function 1";
}
else if (funct == 1){
functstr = "function 2";
}
else if (funct == 2){
functstr = "function 3";
}
// μΆλ ₯ νμ κ²°μ
String unitStr;
if (unit == 0) {
display.clearDisplay();
display.setCursor(0, 0);
// display.println(voltageStr + " V " + currentStr + " mA " + powerStr + " W");
display.println(currentStr);
display.setCursor(0, 10);
display.println(functstr);
display.display();
} else if (unit == 1) {
display.clearDisplay();
display.setCursor(0, 0);
// display.println(voltageStr + " V " + currentStr + " mA " + energyStr + " Wh ");
display.setCursor(0, 10);
display.println(functstr+ " " + timeStr + " s ");
display.display();
}
Serial.println(voltageStr);
Serial.println(currentStr);
Serial.println(powerStr);
Serial.println(energyStr);
Serial.println(timeStr);
// Serial.println(funct);
}
int readSwitchOnPin11() { //μ€μμΉ κΈ°λ₯
static int globalstate1 = 0;
if (digitalRead(11) == HIGH){
if(globalstate1 == 0){
globalstate1 = 1;
}
else if(globalstate1 == 1){
globalstate1 = 2;
}
else if(globalstate1 == 2){
globalstate1 = 0;
}
}
if(globalstate1 == 0){
return 0;
}
else if(globalstate1 == 1){
return 1;
}
else if(globalstate1 == 2){
return 2;
}
}
int readSwitchOnPin12() { //μ€μμΉ κΈ°λ₯
static int globalstate2 = 0;
if (digitalRead(12) == HIGH){
if(globalstate2 == 0){
globalstate2 = 1;
}
else if(globalstate2 == 1){
globalstate2 = 0;
}
}
if(globalstate2 == 0){
return 0;
}
else if(globalstate2 == 1){
return 1;
}
}
float currentsens(){//μ λ₯ κ° λ°ν
float a[500];
float ivalue = 0;
float ivalue_avg = 0;
for (int i = 0; i<500; i++){
a[i]= (analogRead(A3) - 5)/3;
ivalue = ivalue + a[i];
}
ivalue_avg = ivalue / 500;
return ivalue_avg;
}
float energycalc(float voltage, float current) {//μλμ§ κ° λ°ν
static unsigned long startTime = 0;
static float accumulatedEnergy = 0.0;
static float accumulatedTime = 0.0;
float energy = voltage * current / 1000;
unsigned long currentTime = millis();
if (digitalRead(14) == HIGH) { // λμ§νΈ pin 14λ²μ high μ νΈκ° λ€μ΄μμ λ μ΄κΈ°ν
startTime = currentTime;
accumulatedEnergy = 0.0;
accumulatedTime = 0.0;
}
accumulatedEnergy += energy * (currentTime - startTime) / 100.0; // μλμ§ μ μ°
accumulatedTime += (currentTime - startTime) / 100.0; // μκ° μ μ°
float averagePower = 0.0;
if (accumulatedTime > 0) {
averagePower = accumulatedEnergy / accumulatedTime; // νκ· μ λ ₯ κ³μ°
}
return averagePower;
}
void setLEDs(int* ult_num, int enable, int cds_value) { // LEDλ₯Ό μΌκ³ λλ ν¨μ
if (enable == 0) { //function 1 κΈ°λ₯ dimming off
for (int i = 0; i < 10; i++) {
pwm.setPWM(i, 0, 4095);
}
}
else if (enable == 1){ //function 2 κΈ°λ₯ dimming on
for (int i = 0; i < 10; i++) {
/* if (ult_num[i] <= 20) {
pwm.setPWM(i-1, 0, 2047);
pwm.setPWM(i, 0, 4095);
pwm.setPWM(i+1, 0, 2047);
} else {
pwm.setPWM(i, 0, 0);
}
}
*/
pwm.setPWM(i, 0, 2000);
}
}
else if (enable == 2){ //function 3 κΈ°λ₯ cds on
for (int i = 0; i < 10; i++) {
pwm.setPWM(i, 0, 1000);
}
}
}
void setup() {
// OLED λμ€νλ μ΄ μ΄κΈ°ν
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
pinMode(11,INPUT);
pinMode(12,INPUT);
pwm.begin();
pwm.setPWMFreq(10000); // Set the PWM frequency to 1000 Hz
Serial.begin(115200);
pingTimer[0] = millis() + 75; // First ping starts at 75ms, gives time for the Arduino to chill before starting.
for (uint8_t i = 1; i < SONAR_NUM; i++) // Set the starting time for each sensor.
pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;
}
int ult_distance() {
static int distance[10];
for (uint8_t i = 0; i < SONAR_NUM; i++) {
distance[i] = sonar[i].ping_cm();
}
return distance;
}
float voltage = 5.0;
void loop() {
float current = currentsens();
float power = voltage * current / 1000;
float energy = energycalc(voltage, current);
distance = ult_distance();
int button1 = readSwitchOnPin11(); // LED μΆλ ₯ νν λ³κ²½
int button2 = readSwitchOnPin12(); // OLED νμ λ³κ²½
OLED_display(voltage, current, power, energy, button2, button1);
setLEDs(5, button1, 0);
Serial.println(button1);
}