использование строки для отображения текста на последовательном мониторе
После использования 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(" ");
}
@Askari, 👍-1
Обсуждение1 ответ
Лучший ответ:
Ваш синтаксис неверен. Вы присваиваете адрес статического строкового литерала целому числу, а затем используете результаты этого присвоения (адрес строкового литерала, когда он «проваливается» влево) для создания нового объекта 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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Как вы *думаете*, что должен делать этот код?, @Majenko
На последовательном мониторе мигает светодиод 1., @Askari
Зачем ему это делать?
ledPin1
— это просто число и не может быть ничем другим. Этоint
. Все, что вы делаете, это присваиваете ему адрес статической строки, превращаете это число также в строку, а затем выбрасываете эту строку., @MajenkoВ качестве отступления: вообще не пытайтесь научиться использовать String. Это приведет вас по темному и мрачному пути, который закончится нестабильным кодом и слезами перед сном. Не портите ими свои знания. Начните сразу со строк C (массивы символов, завершающиеся NULL)., @Majenko
Я изучаю aurdino на веб-сайте (toptechboy). Преподаватель сделал то же самое, что и представил понятие струны, но я не могу это выполнить., @Askari
Я только что просмотрел этот сайт (урок 5, да?). Там ничего такого нет. Самый близкий вариант:
String redMessage="Красный светодиод мигает";
это совсем не то, что у вас есть., @MajenkoДа, я думаю, это урок 5. Я не копирую его код, так как хочу научиться программировать, поэтому мой код кажется другим, но он имеет ту же структуру, что и на сайте., @Askari
Пожалуйста, прекратите отвечать и вместо этого используйте комментарии., @Majenko
Возможно, вам стоит начать с его кода и изменить его, а не пытаться бежать, прежде чем вы сможете ходить., @Majenko
Извините, что не пользуюсь комментариями., @Askari
В этом случае (строка) я даже скопировал его код, но проблема все еще сохраняется., @Askari
примечание: ваш код очень плохо отформатирован... из-за этого его трудно читать и выявлять ошибки.... правильное форматирование кода должно быть одной из первых вещей, которые вы усвоите.... это очень поможет вам в будущее.... обратите внимание: в вашем коде есть ошибки, которые мешают его компиляции, @jsotola