Помогите запустить мотор 1 раз (новичок)

Michail.Orlov
Offline
Зарегистрирован: 30.12.2017

Доброго времени суток, собственно нужно запустить мотор один раз пока верно условие, запустить повторно только после того когда условие станет не верным и снова верным. Зарание спасибо, перечитал много но непонял, нужно наглядно.

 

#include <DallasTemperature.h>
#include <OneWire.h>

#define ONE_WIRE_BUS 5 // пин шины BUS DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// первый двигатель
int in1 = 9;
int in2 = 8;
// второй двигатель
int in3 = 7;
int in4 = 6;

void setup() {
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void sendTemps()
{
  sensors.requestTemperatures();
  float temp = sensors.getTempCByIndex(0);
  if (temp >= 20) dor1open();   // если температура >= то
}
void dor1open()
{
  digitalWrite(in1, HIGH); //включить мотор
  digitalWrite(in2, LOW); //включить мотор
  delay(2000);            //задержка
  digitalWrite(in1, LOW); //остановить
  digitalWrite(in2, LOW); //остановить
}
void loop() 
{
  sendTemps();
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Что бы мотор запустить повторно, надо его остановить. Обычно если повторно запускаешь работающий мотор не понятно. Он работает , потому что запустили его в первый раз, или потому что во второй.  ( Из "Визуальные наблюдения за поведением моторов")

Michail.Orlov
Offline
Зарегистрирован: 30.12.2017

Запускается на 2 секунды и останавливается это всё здесь

void dor1open()
{
  digitalWrite(in1, HIGH); //включить мотор
  digitalWrite(in2, LOW); //включить мотор
  delay(2000);            //задержка
  digitalWrite(in1, LOW); //остановить
  digitalWrite(in2, LOW); //остановить
}

а у меня получается что функция вызывается постоянно, вот он и едет и останавливается постоянно

ven-til
Offline
Зарегистрирован: 13.02.2018
//эту строчку до setup к переменным добавить
boolean turnOn = true;


//эти строки вместо 26 строки
if (temp >= 20 && turnOn ) {
dor1open();   // если температура >= то
turnOn = false;
}
else turnOn = true;

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Однажды слепой попросил зрячего описать слона. Ну зрячий начал описывать. А слепой говорит: не бубни мне на уши, а покажи наглядно.  Так и у людей. Люди видят не глазами ,а умом. А если человек безумен, то ему хорошее зрение не позволит рассмотреть ситуацию вокруг. Поэтому наглядно объяснить человеку кодом , как что и как работает, только если человек умеет читать код. Если вы хотите увидеть наглядно в коде, то пожалуйста подтяните свои знания чтения кода. Иначе будет один флуд в теме. 

Sidorchuk
Offline
Зарегистрирован: 22.07.2016

qwone пишет:

Однажды слепой попросил зрячего описать пчел.bsp;


Это "жжжжжжж" - неспроста!

Sidorchuk
Offline
Зарегистрирован: 22.07.2016

ven-til пишет:

//эту строчку до setup к переменным добавить
boolean turnOn = true;


//эти строки вместо 26 строки
if (temp >= 20 && turnOn ) {
dor1open();   // если температура >= то
turnOn = false;
}
else turnOn = true;

 


10-ую строку лучше записать так if (temp<20) turnon =true;

Michail.Orlov
Offline
Зарегистрирован: 30.12.2017

Спасибо, но почемуто тот же эфект, я так кстати пробовал. Всё равно dor1open() повторяется.

sadman41
Offline
Зарегистрирован: 19.10.2016

Попечатайте в Serial значение temp - может оно у вас около 20C скачет туды-сюды.

Michail.Orlov
Offline
Зарегистрирован: 30.12.2017

Спасибо так вроде работает ! 

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

Спасибо большое !

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Сколько длиться dor1open() - 2 секунды . Что делает пороцессор еще когда идет dor1open() - ничего он делаеть не может когда делаетdor1open() . А если кнопка раз нажмется . Сказано ничего. А как программа борится с дребезгом - никак. вывод. Когда все устранить, то код усложнится и разумеется ТС ничего в нем не поймет.

ven-til
Offline
Зарегистрирован: 13.02.2018

Sidorchuk пишет:
10-ую строку лучше записать так if (temp<20) turnon =true;

Не "лучше" записать, а "надо" записать. ))