Технический форум

Технический форум (http://www.tehnari.ru/)
-   Микропроцессоры (http://www.tehnari.ru/f115/)
-   -   Arduino: проблема с milis() (http://www.tehnari.ru/f115/t262322/)

AmGadm 30.12.2018 11:03

Arduino: проблема с milis()
 
Здравствуйте уважаемые форумчане, захотел собрать управляемый страбоскоп
Код:

int ledPin = 11;
unsigned long time;
bool flag;
int flash=10;

void setup() {
  flag =false;
  ledPin = LOW;
Serial.begin(9600); // Инициализируем общение c компьютером на скорости 9600
pinMode(ledPin, OUTPUT);
}
 
void loop() {

long sensorValue1 = analogRead(A0);// Считываем значение с аналогового порта
sensorValue1 = map(sensorValue1,0,1023,5990,119990);//Приводим значение к показателям от 5990 до 119990
int sensorValue2 = analogRead(A1);// Считываем значение с аналогового порта
long sensorValue = sensorValue1 + sensorValue2;
sensorValue=constrain(sensorValue,5990,119990);// Обрезаем лишки
Serial.println(sensorValue);// Печатаем значение в мониторе порта

  if(digitalRead(ledPin) == LOW){
    if(flag == false){
      time=micros();
      flag=true;
    }
    else{
      if(micros()-time > sensorValue){
      digitalWrite(ledPin, HIGH);
      flag = false; 
      }
    }
  }
  else if (digitalRead(ledPin) == HIGH){
    if(flag == false){
      time=micros();
      flag=true;
    }
    else{
      if(micros()-time > 10){
      digitalWrite(ledPin, LOW);
      flag=false; 
      }
    }
  }
}

И опять завис с milis и не могу понять почему светодиод вообще не реагирует
Код:

  if(digitalRead(ledPin) == LOW){
    if(flag == false){
      time=micros();
      flag=true;
    }
    else{
      if(micros()-time > sensorValue){
      digitalWrite(ledPin, HIGH);
      flag = false; 
      }
    }
  }
  else if (digitalRead(ledPin) == HIGH){
    if(flag == false){
      time=micros();
      flag=true;
    }
    else{
      if(micros()-time > 10){
      digitalWrite(ledPin, LOW);
      flag=false; 
      }
    }

Все просто если светодиод не горит
Код:

if(digitalRead(ledPin) == LOW)
то проверяется защелка
Код:

if(flag == false)
если значение защёлки ложно то присваиваем переменой time текущее время с начала работы
Код:

time=micros();
и закрываем защёлку присваивая ей значение правда
Код:

flag=true;
Снова проверяем горит ли светодиод, если он по прежнему не горит проверяем защёлку. Так как она приняла значение правда то выполняем исключение. И сравниваем разницу между значением time и текущим значением milis() c заданной переменной
Код:

if(micros()-time > sensorValue)
если условие соблюдается то зажигаем светодиод
Код:

digitalWrite(ledPin, HIGH);
и защёлка принимает значение лож для последующей работы с ней.
Так же построено если светодиод горит.
На delay() всё работает.
даже вот так
Код:

  if(digitalRead(ledPin) == LOW){
    if(flag == false){
      time=micros();
      flag=true;
    }
    else{
      if(micros()-time > sensorValue){
      digitalWrite(ledPin, HIGH);
      flag = false; 
      }
    }
  }
  else{
  delayMicroseconds(10);                       
  digitalWrite(ledPin, LOW);

но вешать процессор нельзя.


Часовой пояс GMT +4, время: 11:00.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.