использование строки для отображения текста на последовательном мониторе

После использования int для отображения текста на последовательном мониторе я пытаюсь использовать строку, но что-то не так. Ожидаемый результат: «Led1 включен» на последовательном мониторе, но я получаю «285». Это код, включающий строки.

String(ledPin1="Led1 is on");
Serial.println(ledPin1);

пока это полный код

int numledPin1Blinks=5;
int ledPin1Blinks=2;
int i;
int j;
int waiTtimeoff2=1000;
int waitTimeOn2=1000;
int ledPin2=10;
int ledPin1=13;
int waiTtimeOn1=1000;
int waiTtimeOff1=1000;
void setup() 
{pinMode(10,OUTPUT);
pinMode(13,OUTPUT);
Serial.begin(9600);
String(ledPin1="Led1 is on");

}

void loop()
{Serial.println(ledPin1);
for (i=1;i<=3;i=i+1){
Serial.print("   You are on blink 
no#:  ");
Serial.println(i);
digitalWrite(ledPin1,HIGH);
delay(waiTtimeOn1);
digitalWrite(ledPin1,LOW);
delay(waiTtimeOff1);}
Serial.println(" ");

Serial.println("Led 2 is on!");
for (j=1;j<=4;j=j+1){
Serial.print(" You are on blink no 
#:");
Serial.println(j);
digitalWrite (ledPin2,HIGH);
delay(waitTimeOn2);
digitalWrite (ledPin2,LOW);
delay(waiTtimeoff2);}
Serial.println(" ");

}

, 👍-1

Обсуждение

Как вы *думаете*, что должен делать этот код?, @Majenko

На последовательном мониторе мигает светодиод 1., @Askari

Зачем ему это делать? ledPin1 — это просто число и не может быть ничем другим. Это int. Все, что вы делаете, это присваиваете ему адрес статической строки, превращаете это число также в строку, а затем выбрасываете эту строку., @Majenko

В качестве отступления: вообще не пытайтесь научиться использовать String. Это приведет вас по темному и мрачному пути, который закончится нестабильным кодом и слезами перед сном. Не портите ими свои знания. Начните сразу со строк C (массивы символов, завершающиеся NULL)., @Majenko

Я изучаю aurdino на веб-сайте (toptechboy). Преподаватель сделал то же самое, что и представил понятие струны, но я не могу это выполнить., @Askari

Я только что просмотрел этот сайт (урок 5, да?). Там ничего такого нет. Самый близкий вариант: String redMessage="Красный светодиод мигает"; это совсем не то, что у вас есть., @Majenko

Да, я думаю, это урок 5. Я не копирую его код, так как хочу научиться программировать, поэтому мой код кажется другим, но он имеет ту же структуру, что и на сайте., @Askari

Пожалуйста, прекратите отвечать и вместо этого используйте комментарии., @Majenko

Возможно, вам стоит начать с его кода и изменить его, а не пытаться бежать, прежде чем вы сможете ходить., @Majenko

Извините, что не пользуюсь комментариями., @Askari

В этом случае (строка) я даже скопировал его код, но проблема все еще сохраняется., @Askari

примечание: ваш код очень плохо отформатирован... из-за этого его трудно читать и выявлять ошибки.... правильное форматирование кода должно быть одной из первых вещей, которые вы усвоите.... это очень поможет вам в будущее.... обратите внимание: в вашем коде есть ошибки, которые мешают его компиляции, @jsotola


1 ответ


Лучший ответ:

2

Ваш синтаксис неверен. Вы присваиваете адрес статического строкового литерала целому числу, а затем используете результаты этого присвоения (адрес строкового литерала, когда он «проваливается» влево) для создания нового объекта String. Этот объект String затем выбрасывается.

Вам необходимо создать новую переменную String (не использовать повторно ту, которую вы активно используете для другой части вашей программы) и присвоить ей строковый литерал:

String led1Message = "LED 1 is on";

Тогда вместо этого вы можете напечатать эту переменную:

Serial.println(led1Message);

ОДНАКО Объекты String очень хрупки на Arduino, и их следует избегать. Забудьте о попытках научиться ими пользоваться, поскольку вам придется отучиться от них только позже. Пропустите их и начните сразу с C-строк (массивы char, завершающиеся NULL). Также узнайте о PROGMEM.

Например, приведенное выше можно записать так:

const char led1Message[] PROGMEM = "LED 1 is on";

А затем используйте приведение, чтобы получить println и получить его из флэш-памяти:

Serial.println((__FlashStringHelper*)led1Message);

При этом практически не используется ОЗУ, что для Arduino очень важно. Еще более важно, что это не вызывает кучи фрагментации, которая может привести к случайному сбою вашей программы.

,

Большое спасибо, я понятия не имел о недостатках использования строк. Вместо этого я просто попробую использовать const char., @Askari

Может ли print/println действительно различать константный символ в памяти и флэш-символ? Макрос F использовал переинтерпретацию приведения к указателю FlashStringHelper, поэтому можно использовать перегрузку функции., @KIIV

На самом деле, я не уверен: я никогда активно не *использую* Arduino... ;) Возможно, вы захотите привести его к (__FlashStringHelper*)., @Majenko