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);
}
@laoadam, 👍1
Обсуждение3 ответа
Лучший ответ:
В принципе это работает.
Здесь вы найдете небольшой набросок, чтобы увидеть, как это работает. Попробуйте перенести это в свое решение.
#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
Я бы посоветовал вам просмотреть руководства по программированию на веб-сайте Arduino. Было бы абсолютно возможно иметь приведенную выше структуру
в коде Arduino.
По этой ссылке приведен рабочий и проверенный пример, показывающий цикл while
, вызывающий другую функцию с использованием структуры if-else-if
.
https://www.arduino.cc/en/Tutorial/WhileStatementConditional?from=Tutorial .WhileLoop
Прочитайте руководства и опишите конкретную проблему, если и когда вы с ней столкнетесь.
Если код (не показан) внутри структуры if/else if/else не влияет на поток управления, то любое размещение задержки() будет работать. Но размещение внутри цикла будет задерживаться на каждом цикле цикла. Размещение под циклом будет задерживаться только после завершения выполнения цикла.
Я слежу за выполнением эскиза, даже за его выполнением, но задержка() в этом разделе этого не сделала., @laoadam
- Проблема с датчиком температуры и влажности DHT11
- Получение ошибки ets 8 января 2013,rst cause:4,boot mode(1,6) wdt reset
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Данные DHT11 из Arduino UNO в Firebase через ESP8266
- Объяснение кода MPU6050
- Измерение скорости двигателя постоянного тока с помощью поворотного энкодера
- Почему dtostrf() не работает для этого значения?
- Как я могу прервать задержку() при нажатии кнопки?
Покажите, пожалуйста, небольшой рабочий эскиз. Когда я вижу эти строки, то думаю: «а что?». Каково условие? 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