Как перенести константы из одного цикла в следующий

#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);
}

Здравствуйте, это код, у меня есть вопрос. Когда я записываю в серийник температуру, она длится только до конца одного цикла. Как сохранить ту же температуру в следующем цикле?

, 👍-2

Обсуждение

Чтобы сохранить значение переменной в разных итерациях функции, объявите ее статической. Хотя ваш код будет перезаписывать это значение, когда вы используете 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


2 ответа


1

Здесь есть две вещи, которые вы должны учитывать.

Во - первых, ваша переменная является "локальной" переменной. Такая переменная создается в начале каждой итерации, а затем отбрасывается в конце этой итерации.

Есть две вещи, которые вы можете сделать, чтобы "исправить" это:

  1. Сделайте переменную "глобальной", то есть переместите определение из loop() в область "global" (поместите его в верхнюю часть вашей программы). Тогда он создается только один раз и никогда не отбрасывается.
  2. Сделайте переменную "static" - то есть добавьте к ней ключевое слово static. Затем он создается только на первой итерации и никогда не отбрасывается.

Второе, что нужно учитывать, - это то, что у вас нет концепции "Ценности нет". На каждой итерации вы анализируете новый float, независимо от того, есть он там или нет. А если его нет, то он просто дает вам 0. Поэтому вам нужно придумать какой-то способ сказать: "Я ввел число, так что разберите его". Самое простое-просто предположить, что все значения 0-это "не введенное число", но это, конечно, мешает вам когда-либо вводить 0 в качестве допустимого ввода.

,

Статическая переменная создается перед запуском функции main() (или setup() на Arduinos). Он инициализируется с заданным явным значением или обнуляется без него., @the busybee

@thebusybee Технически, да, это так. Но эффект, насколько это касается пользователя Arduino, заключается в том, что он создается один раз при первом запуске и остается после него. Пользователям Arduino действительно пока не нужно знать такие технические тонкости., @Majenko


0

Что-то вроде этого должно работать (непроверено, но вы поняли идею. Объяснение есть в комментариях):

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 должен работать нормально.

,