ARDUINO Помогите с кодом

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
Заголовок темы должен отражать содержимое. Отредактируй или тема будет удалена
Есть следующий код, который при получении сигнала с датчика освещения подает питание на 13 пин:

int LED = 13;

int LDR = 0;

int base;

int threshold = 100;

void setup() {

pinMode(LED, OUTPUT);

pinMode(LDR, INPUT);

base = analogRead(LDR);

}

void loop() {

int v = analogRead(LDR);

if ((base - v) < threshold) {

digitalWrite(LED, HIGH);

} else {

digitalWrite(LED, LOW);

}

}
Как правильно вставить условие - если после считывания сигнала с аналогового датчика на 13 пин подается питание, то на любой другой цифровой выход подать короткий импульс длительностью 0,3 сек, и одновременно на другой цифровой пин выход подать импульс длительностью 5 сек
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,410
976
58
Марий-Эл
Если по точности не критично, то врубаем пины, которые нужно.
Делаем delay(300) выключаем тот где нужен был короткий импульс.
потом delay(4700) и вырубаем второй, где нужен 5 секунд.
Если нужно поточнее, используем иблиотеку GyverTimer
 
  • Лойс +1
Реакции: Дед из леса

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
Если по точности не критично, то врубаем пины, которые нужно.
Делаем delay(300) выключаем тот где нужен был короткий импульс.
потом delay(4700) и вырубаем второй, где нужен 5 секунд.
Если нужно поточнее, используем иблиотеку GyverTimer
Спасибо, точность не требуется, я не могу правильно вставить это условие в код, постоянно получается ошибка
 

Эдуард Анисимов

★★★★★★✩
23 Сен 2019
2,410
976
58
Марий-Эл
C++:
int LED = 13;
int LDR = 0;
int base;
int threshold = 100;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(LDR, INPUT);
  base = analogRead(LDR);
}

void loop()
{
  int v = analogRead(LDR);
  if ((base - v) < threshold)
  {
    digitalWrite(LED, HIGH);
  }
  else
  {
    digitalWrite(LED, LOW);
  }
}
Вы имеете в виду этот Ваш код?
И какого типа ошибка?
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
if ((base - v) < threshold) {

digitalWrite(LED, HIGH);
digitalWrite(pinShort, HIGH);
digitalWrite(pinLong, HIGH);
delay(300);
digitalWrite(pinShort, LOW);
delay(4700);
digitalWrite(pinLong, LOW);
}

Как-то так. Только нужно заранее определить номера пинов pinShort и pinLong.
 
  • Лойс +1
Реакции: Дед из леса

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
if ((base - v) < threshold) {

digitalWrite(LED, HIGH);
digitalWrite(pinShort, HIGH);
digitalWrite(pinLong, HIGH);
delay(300);
digitalWrite(pinShort, LOW);
delay(4700);
digitalWrite(pinLong, LOW);
}

Как-то так. Только нужно заранее определить номера пинов pinShort и pinLong.
Огромное спасибо, сейчас попробую!
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
А лучше заюзать библиотеку MSTIMER, чтобы не задерживать процессор аж на 5 секунд. Это слишком дофига.
 

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
if ((base - v) < threshold) {

digitalWrite(LED, HIGH);
digitalWrite(pinShort, HIGH);
digitalWrite(pinLong, HIGH);
delay(300);
digitalWrite(pinShort, LOW);
delay(4700);
digitalWrite(pinLong, LOW);
}

Как-то так. Только нужно заранее определить номера пинов pinShort и pinLong.
Вставил в код, получилось следующее:

int LED = 13;
int LDR = 0;
int pinLong = 7;
int pinShort = 4;

int base;
int threshold = 100;

void setup() {
pinMode(LED, OUTPUT);
pinMode(pinLong, OUTPUT);
pinMode(pinShort, OUTPUT);
pinMode(LDR, INPUT);
base = analogRead(LDR);
}


void loop() {
int v = analogRead(LDR);
if ((base - v) < threshold) {
digitalWrite(LED, HIGH);
digitalWrite(pinShort, HIGH);
digitalWrite(pinLong, HIGH);
delay(300);
digitalWrite(pinShort, LOW);
delay(4700);
digitalWrite(pinLong, LOW);
} else {
digitalWrite(LED, LOW);
}
}

При таком коде на 13 пин напряжение подается постоянно, независимо от показаний с аналогового датчика, на пин 7 тоже постоянно приходит питание, на пин 4 постоянно подается нужный импульс в 0,3 сек с интервалом 5 сек, то есть пока поставленная задача не достигнута
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
При таком коде на 13 пин напряжение подается постоянно, независимо от показаний с аналогового датчика, на пин 7 тоже постоянно приходит питание, на пин 4 постоянно подается нужный импульс в 0,3 сек с интервалом 5 сек, то есть пока поставленная задача не достигнута
а переменная base где-то меняется? Судя по коду, она постоянно равна значению, полученному один раз в сетапе. Нужно вывести переменные v и base в монитор и следить за ними.
 
Изменено:
  • Лойс +1
Реакции: Дед из леса

kalobyte

★★★✩✩✩✩
1 Янв 2020
724
148
код кривой
в сетапе не надо использовать чтение с ацп, там только инициализация подсистем контроллера
 
  • Лойс +1
Реакции: Дед из леса

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
а переменная base где-то меняется? Судя по коду, она постоянно равна значению, полученному один раз в сетапе. Нужно вывести переменные v и base в монитор и следить за ними.
Упростил код, но все равно не могу правильно сделать команды для подачи импульсов после получения сигнала на 13 пин:
C++:
 int LED = 13;
 int LDR = 0;
 
 
 int base;
 int threshold = 200;
 

 void setup() {
   pinMode(LED, OUTPUT);
   pinMode(LDR, INPUT);
   Serial.begin (9600);
 }
 
 void loop() {
   base = analogRead(LDR);
   if (base > threshold) {
     digitalWrite(LED, HIGH);
   } else {
     digitalWrite(LED, LOW);
   }
 Serial.println(analogRead (LDR));
   }
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
но все равно не могу правильно сделать команды для подачи импульсов после получения сигнала на 13 пин
а в мониторе значение порта LDR меняется достаочно для того, чтобы выполнялось условие? И как часто этот порт нужно опрашивать?
 
  • Лойс +1
Реакции: Дед из леса

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
а в мониторе значение порта LDR меняется достаочно для того, чтобы выполнялось условие? И как часто этот порт нужно опрашивать?
Порт опрашивается постоянно, значение меняется.
Мне кажется, что после условия if (base > threshold) выполнять digitalWrite для другого пина (к примеру пин 7, HIGH) нет смысла, поскольку данная команда должна включаться не от изменения аналогового значения, а от изменения напряжения на цифровом пине, но как это правильно прописать я не знаю
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
не от изменения аналогового значения, а от изменения напряжения на цифровом пин
так вы определитесь уже с алгоритмом, нихрена же непонятно. Я бы, может, мысли и прочитал бы, да миелофон у меня спи... Украли короче.
 

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
так вы определитесь уже с алгоритмом, нихрена же непонятно. Я бы, может, мысли и прочитал бы, да миелофон у меня спи... Украли короче.
Сорри, написал не понятно. Алгоритм следующий - при при поступлении на А0 значения с датчика более 200 необходимо подать импульс на цифровой выход 0,3 сек и на другой цифровой пин 3-5 сек, более ничего не требуется
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
при при поступлении на А0 значения с датчика более 200 необходимо подать импульс на цифровой выход 0,3 сек и на другой цифровой пин 3-5 сек
а если на А0 постоянно значение более 200. Что тогда делать? Повторюсь: как часто его нужно опрашивать?
 

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
а если на А0 постоянно значение более 200. Что тогда делать? Повторюсь: как часто его нужно опрашивать?
То в период времени пока А0 более 200 подавать указанные импульсы с интервалом в 60 сек с момента первого увеличения значения >200 на А0 и до момента пока значения на А0 не станет <200
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,706
474
То в период времени пока А0 более 200 подавать указанные импульсы с интервалом в 60 сек с момента первого увеличения значения >200 на А0 и до момента пока значения на А0 не станет <200
а что же раньше об этом ни слова? Нужно писать функцию, которая и будет это делать. А в вашем коде её и в помине нету. Процессор, конечно, штука шустрая, только мыслей он не читает. Пишите функцию.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,302
Москва
Можно попробовать использовать ШИМ для подачи импульса используя tone заданной длины. Саму величину тона надо повыше, а длительность указывается.
Это предположение. Но должно сработать.
 
  • Лойс +1
Реакции: Дед из леса

Дед из леса

✩✩✩✩✩✩✩
13 Июн 2020
11
0
Можно попробовать использовать ШИМ для подачи импульса используя tone заданной длины. Саму величину тона надо повыше, а длительность указывается.
Это предположение. Но должно сработать.
Спасибо, пока что ограничился импульсом на 13 пин с его регулировкой посредством delay, как советовал выше PiratFox, второй импульс сделаю аппаратно