Как перенести константы из одного цикла в следующий
#include "VernierLib.h"
VernierLib Vernier;
#define led 13
float sensorReading;
void setup() {
Serial.begin(9600);
Serial.println(Vernier.sensorName());
Vernier.autoID();
}
void loop() {
float base_temp;
base_temp = Serial.parseFloat();
sensorReading = Vernier.readSensor();
Serial.print(sensorReading);
Serial.print(" ");
Serial.println(Vernier.sensorUnits());
Serial.println(base_temp);
if (base_temp > sensorReading) {
digitalWrite(led, HIGH);
} else {
digitalWrite(led, LOW);
}
delay(3000);
}
Здравствуйте, это код, у меня есть вопрос. Когда я записываю в серийник температуру, она длится только до конца одного цикла. Как сохранить ту же температуру в следующем цикле?
@OtGreat, 👍-2
Обсуждение2 ответа
Здесь есть две вещи, которые вы должны учитывать.
Во - первых, ваша переменная является "локальной" переменной. Такая переменная создается в начале каждой итерации, а затем отбрасывается в конце этой итерации.
Есть две вещи, которые вы можете сделать, чтобы "исправить" это:
- Сделайте переменную "глобальной", то есть переместите определение из
loop()
в область "global" (поместите его в верхнюю часть вашей программы). Тогда он создается только один раз и никогда не отбрасывается. - Сделайте переменную "static" - то есть добавьте
к ней ключевое слово static. Затем он создается только на первой итерации и никогда не отбрасывается.
Второе, что нужно учитывать, - это то, что у вас нет концепции "Ценности нет". На каждой итерации вы анализируете новый float, независимо от того, есть он там или нет. А если его нет, то он просто дает вам 0
. Поэтому вам нужно придумать какой-то способ сказать: "Я ввел число, так что разберите его". Самое простое-просто предположить, что все значения 0-это "не введенное число", но это, конечно, мешает вам когда-либо вводить 0 в качестве допустимого ввода.
Статическая
переменная создается перед запуском функции main() (или setup() на Arduinos). Он инициализируется с заданным явным значением или обнуляется без него., @the busybee
@thebusybee Технически, да, это так. Но эффект, насколько это касается пользователя Arduino, заключается в том, что он создается один раз при первом запуске и остается после него. Пользователям Arduino действительно пока не нужно знать такие технические тонкости., @Majenko
Что-то вроде этого должно работать (непроверено, но вы поняли идею. Объяснение есть в комментариях):
void loop() {
static float base_temp = 21; // Или любое начальное значение по умолчанию, которое вы хотите
static float t = 0; // Временное хранилище для Serial.parseFloat()
t = Serial.parseFloat(); // Read t; если Serial.parseFloat() истечет, он вернет 0.00
if (t != 0.00) { // Если в t есть что-то другое, чем 0.00
base_temp = t; // Обновить base_temp с помощью t
} // Примечание: Вы не можете установить base_temp ровно на 0.00 с помощью этой настройки
sensorReading = Vernier.readSensor();
Serial.print(sensorReading);
Serial.print(" ");
Serial.println(Vernier.sensorUnits());
Serial.println(base_temp);
if (base_temp > sensorReading) {
digitalWrite(led, HIGH);
} else {
digitalWrite(led, LOW);
}
delay(3000);
}
В этом коде 0.00
означает, что "значение не было введено", поэтому вы не можете установить температуру точно на 0.00 с этой настройкой; однако 0.01 должен работать нормально.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Чтобы сохранить значение переменной в разных итерациях функции, объявите ее
статической
. Хотя ваш код будет перезаписывать это значение, когда вы используете Serial.parseFloat(). Хотя это вопрос программирования, а не вопрос Arduino, @chrisl@chrisl спасибо, но я хотел бы сохранить ту же константу для 2, 3 циклов, а затем изменить ее снова. Как бы я это сделал?, @OtGreat
Мне непонятно, что именно вы имеете в виду. А почему именно 2 или 3 петли? Чего вы пытаетесь достичь?, @chrisl
@chrisl, я хотел бы добиться того, чтобы я мог в любое время изменить постоянную температуру, и когда я меняю ее, она должна оставаться прежней, пока я не изменю ее снова., @OtGreat
константы не могут быть изменены ... используйте переменную для хранения изменяемых данных, @jsotola
Также спрашивают здесь: https://stackoverflow.com/questions/65512883/how-do-i-change-variable-after-each-2-3-loops . Пожалуйста, не пересекайте столб., @ocrdu
В дополнение к комментарию @chrisl вам нужно использовать такой код, как
if (Serial.available()) { base_temp = Serial.parseFloat(); }
., @sa_leinad