delay() () не работает внутри блока loop()

Отредактированный и прикрепленный код здесь.
Этот раздел не выполнен. delay(15000); не выполняется, я имею в виду, что скетч не выполнил эту строку, независимо от того, где ее поместить.

    // включаем библиотеку SPI:
    #include <SPI.h>

    // устанавливаем контакт 53 в качестве выбора подчиненного устройства для цифрового потенциометра:
    const int slaveSelectPin = 53; //БЫЛО 10 на Arduino uno.
    const int shutdownPin = 7; // было 7 на uno.
    const int wiper0writeAddr = B00000000;
    const int wiper1writeAddr = B00010000;
    const int tconwriteAddr = B01000000;

    const int tcon_0off_1on = B11110000;
    const int tcon_0on_1off = B00001111;
    const int tcon_0off_1off = B00000000;
    const int tcon_0on_1on = B11111111;

    const int analogInPin_c = A5;  // центр Vc=Vss/2 из PAD, используйте для установки ini V. здесь бесполезно, Vc напрямую идет на площадку.

    const int analogInPin_x = A1;  // Аналоговый входной контакт, к которому подключен потенциометр
    const int analogInPin_y = A2;  // Аналоговый входной контакт, к которому подключен потенциометр

    const int analogOutPin_x = wiper0writeAddr; // записываем MCP POT
    const int analogOutPin_y = wiper1writeAddr; // записываем MCP POT

    int sensorValue_c = 0;        // значение, прочитанное из PAD, Vc=Vss/2
    int sensorValue_x = 0;        // значение, прочитанное из PAD, Vc=Vss/2
    int sensorValue_y = 0;        // значение, прочитанное из PAD, Vc=Vss/2

    //?int outputValue_c = 0; // вывод значения на ШИМ (аналоговый выход)
    int outputValue_x = 0;        // переменная Mid сохраняет значение из SensorValue_c и MAP, которое будет использоваться
    int outputValue_y = 0;        // переменная Mid сохраняет значение из SensorValue_c и MAP, которое будет использоваться

    int Vcr = 0;        // значение, прочитанное из PAD, Vc=Vss/2
    int Vc = 0;        // значение, прочитанное из PAD, Vc=Vss/2
    const int LEDpin1 = 47;
    const int LEDpin2 = 46;
    int count = 0;

    void setup() {
      Serial.begin(9600);

      // устанавливаем подчиненныйSelectPin в качестве вывода:
      pinMode (slaveSelectPin, OUTPUT);
      // устанавливаем ShutdownPin как выход:
      pinMode (shutdownPin, OUTPUT);
      // начинаем с закрытия всех потов
      digitalWrite(shutdownPin, LOW);
      // инициализируем SPI:
      SPI.begin();
      Serial.println("Setup complete");
      //??
      Serial.println("Starting loop");
      digitalWrite(shutdownPin, HIGH); //Отключаем выключение
    }

    void loop() {
      AnalogInOut(); //
      ArduinoDAC(); //
    }
    void AnalogInOut() {
      //взять откуда-то, где использовался для тестирования светодиода управления джойстиком,
      //нужно изменить, чтобы получить дату из RC и записать в банки MCP
      // читаем аналог по значению:

      Vcr = analogRead(analogInPin_c);
      delay(1000);
      Serial.print("Vcr= ");
      Serial.println(Vcr);
      Vc = map(Vcr, 0, 1023, 165, 225);
      Serial.print("Vc = ");
      Serial.println(Vc);
      delay(10);
      Serial.print("count_ini= ");
      Serial.println(count);

      if (count = 0)  {

        if (Vc > 188)   {

          digitalWrite(LEDpin1, HIGH);
          Serial.print("Vc TOO HIGH: ");
          Serial.println(Vc);
          exit(0);
          delay(100);
        }

       if (Vc < 165) {

          digitalWrite(LEDpin2, HIGH);
          Serial.print("Vc TOO LOW = : ");
          Serial.println(Vc);
          exit(0);
          delay(10);
        }
        else {

          Serial.print("analogInPin_c_T00: ");
          Serial.println(analogInPin_c);

          /// digitalPotWrite(wiper0writeAddr, Vc);
          ///digitalPotWrite(wiper1writeAddr, Vc);

          digitalPotWrite(wiper0writeAddr, 100);
          digitalPotWrite(wiper1writeAddr, 220);

          count = 1;
          Serial.print("count_new= ");
          Serial.println(count);
        }
        delay(15000);
      }

      /////////////////////////////////////////////////// /////////////////////////////////////////////////// ////////

      sensorValue_x = analogRead(analogInPin_x);
      sensorValue_y = analogRead(analogInPin_y);
      // сопоставляем его с диапазоном аналогового выхода:
      outputValue_x = map(sensorValue_x, 0, 1023, 70, 248);
      outputValue_y = map(sensorValue_y, 0, 1023, 70, 248);  // меняем полученный аналог на набор значений для джойстика PAD


      // выводим результаты на последовательный монитор:
      Serial.println("sensor_x =_T10 ");
      Serial.println(sensorValue_x);
      Serial.println("sensor_y = ");
      Serial.println(sensorValue_y);
      Serial.println("\t output = ");
      Serial.println(outputValue_x);
      Serial.println(outputValue_y);

      // ждем 2 миллисекунды перед следующим циклом аналого-цифрового преобразования
      // конвертер для урегулирования после последнего чтения:
      delay(2);
    }


    void ArduinoDAC() {
      Serial.println("Starting loop");
      digitalWrite(shutdownPin, HIGH); //Отключаем выключение

      digitalPotWrite(wiper0writeAddr, outputValue_x); // Установка вайпера от 0 до 200

      delay(5);

      digitalPotWrite(wiper1writeAddr, outputValue_y); // Установите вайпер 1 на 200

      delay(5);
    }

    // Эта функция отвечает за отправку данных SPI в банк.
    void digitalPotWrite(int address, int value) {
      /// Serial.print("wiper0 Position_t30: ");////
      /// Serial.println();////
      // устанавливаем низкий уровень на выводе SS, чтобы выбрать микросхему:
      digitalWrite(slaveSelectPin, LOW);
      // отправляем адрес и значение через SPI:
      SPI.transfer(address);
      SPI.transfer(value);
      delay(30);
      // поднимем высокий уровень на выводе SS, чтобы отменить выбор чипа:
    }

    int digitalPotRead(int address) {
      // устанавливаем низкий уровень на выводе SS, чтобы выбрать микросхему:
      digitalWrite(slaveSelectPin, LOW);
      // отправляем адрес через SPI:
      SPI.transfer(address);
      // отправляем ноль для чтения данных по адресу
      delay(30);
    }

, 👍1

Обсуждение

Покажите, пожалуйста, небольшой рабочий эскиз. Когда я вижу эти строки, то думаю: «а что?». Каково условие? https://www.arduino.cc/reference/en/language/structure/control-structure/ while/, @Jot

да, это может сработать, потому что вам разрешено if в while, @Jaromanda X

какая задержка(5000);? ... их два.... а откуда ты знаешь, что команда не выполняется?, @jsotola

пройти курс кодирования, @Juraj

Спасибо за ответ, код прикрепил., @laoadam

Теперь я не вижу задержки (5000) в прикрепленном коде., @mico

@jsotola и mico, извините, в исходном коде была задержка (15000)., @laoadam

Вы заметили эту ошибку в своем коде? если (счет = 0)., @Delta_G

if (count = 0) никогда не бывает истинным. = — это присвоение count, а результатом присваивания является присвоенное значение. значение 0, @Juraj

Код должен читаться как if (count == 0). С единственным равенством это присваивание, и оператор if оценивает значение правой части., @Duncan C


3 ответа


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

1

В принципе это работает.

Здесь вы найдете небольшой набросок, чтобы увидеть, как это работает. Попробуйте перенести это в свое решение.

#include <M5Stack.h>  // only necessary for my board (M5Stack)

bool condition_while = true;
bool condition_loop = true;
int condition_if = 0;

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);
}

void loop() {
   while (condition_while) {
       if (condition_if == 0) {
           Serial.println("testcase #1: if path reached");
           condition_if = 1;
       }
       else if (condition_if == 1 ) {
           Serial.println("testcase #2: if else path reached");
           condition_if = 2;
       }
       else {
           Serial.println("testcase #3: else path reached");
           condition_while = false;
       }
       Serial.println("testcase #4: path reached inside while");
   }
   if (condition_loop) {
       Serial.println("testcase #5: path reached outside while");
       condition_loop = false;
   }
}

Это вывод на COM3

,

Спасибо, я отвечу. это в мой код., @laoadam

Не могу найти строку с задержкой(5000), можете добавить номер строки, тоже время не нахожу?, @RJPlog

@laoadam и взгляните на строку 77: 'if (count = 0) {', если вы хотите проверить, равен ли счетчик нулю, вам нужно написать 'if (count == 0) {', @RJPlog

Спасибо RJPlog, я сделал это., @laoadam

@laoadam Это сейчас работает?, @RJPlog


0

Я бы посоветовал вам просмотреть руководства по программированию на веб-сайте Arduino. Было бы абсолютно возможно иметь приведенную выше структуру в коде Arduino.

По этой ссылке приведен рабочий и проверенный пример, показывающий цикл while, вызывающий другую функцию с использованием структуры if-else-if.

https://www.arduino.cc/en/Tutorial/WhileStatementConditional?from=Tutorial .WhileLoop

Прочитайте руководства и опишите конкретную проблему, если и когда вы с ней столкнетесь.

,

0

Если код (не показан) внутри структуры if/else if/else не влияет на поток управления, то любое размещение задержки() будет работать. Но размещение внутри цикла будет задерживаться на каждом цикле цикла. Размещение под циклом будет задерживаться только после завершения выполнения цикла.

,

Я слежу за выполнением эскиза, даже за его выполнением, но задержка() в этом разделе этого не сделала., @laoadam