включение мотора через периоды времени.

Тема в разделе "Флудилка", создана пользователем dreadfull, 20 мар 2014.

  1. dreadfull

    dreadfull Гик

    начнем с простого. есть у нас моторчик. нам необходимо чтобы он работал реверсно, по схеме. включался через определённый период, а выключался от датчика наклона MMA7361. образец скетча передрал из другого (по-этому там немного может быть лишнего). первая загвоздка в том, что при таймере в 5 сек все отлично, но нам необходимо 24 часа :confused: (плюс минус...) и скетч просто не работает!
    Код (Text):
    int dx=398; //задаем положение датчика наклона
    unsigned long startTime1 = 0;
    int timeOut1 = 5000;    //таймаут
    boolean timerState1 = false;    //флаг таймера
    unsigned long time;  //это для часов в окне монитора
    void setup() {
      Serial.begin(9600);
      pinMode(4, OUTPUT);  // задаем выход на мотор
      digitalWrite(4, LOW);
     
    }

    void loop() {
     
      int x;                  // переменные для хранения значений по осям
      x = analogRead(A0)-dx;          // читаем положение по оси Х
        Serial.println();
        Serial.print("X:");
        Serial.print(x);
        Serial.println(" ");
        delay(1000);
    if(x < 90 && (millis() - startTime1) > timeOut1){ //задаем условия на включение моторчика
      digitalWrite(4, HIGH);
      timerState1 = true;
      startTime1 = millis();
    }
    else if(x > 90){  //задаем условие на отключение моторчика
      timerState1 = false;
      digitalWrite(4, LOW);
    }
        Serial.print("T:");
        Serial.print(startTime1);
        Serial.println(" ");
        {Serial.print("Time: ");
        time = millis();  //выводит количество миллисекунд с момента начала выполнения программы
        Serial.println(time);
    }
    }
     

    Вложения:

  2. dreadfull

    dreadfull Гик

    скетч поправил. работает, но только на малых промежутках времени (до 10 сек). что это может быть????
    Код (Text):
    int dx=398; //задаем положение датчика наклона
    unsigned long startTime1 = 0;
    unsigned long startTime2 = 0;
    int timeOut1 = 5000;    //таймаут
    int timeOut2 = 10000;
    unsigned long time1;  //это для часов в окне монитора
    unsigned long time2;

    void setup() {
      Serial.begin(9600);
      pinMode(4, OUTPUT);  // задаем выход на мотор
      digitalWrite(4, LOW);
      pinMode(3, OUTPUT);  // задаем выход на реверс мотора
      digitalWrite(3, LOW);
    }

    void loop() {
      int x;                  // переменные для хранения значений по осям
      x = analogRead(A0)-dx;          // читаем положение по оси Х
        Serial.println();
        Serial.print("X:");
        Serial.print(x);
        Serial.println(" ");
        Serial.print("T:");
        Serial.print(startTime1);
        Serial.println(" ");
        {Serial.print("Time: ");
        time1 = millis();
        time2 = millis();  //выводит количество миллисекунд с момента начала выполнения программы
        Serial.println(time1);
        delay(1000);
        if(x < -60 && (time1 - startTime1) > timeOut1 ){ //задаем условия на включение моторчика
      digitalWrite(4, HIGH);
    }
    if(x > 90){  //задаем условие на отключение моторчика
      startTime1 = time1;
      digitalWrite(4, LOW);
    }
    if(x > 90 && (millis() - startTime2) > timeOut1 ){
      digitalWrite(3, HIGH);  // включаем реверсное вращение моторчика
      }
    else if(x < -50){  //задаем условие на отключение моторчика
      startTime2 = millis();
      digitalWrite(3, LOW);
    }
    }
    }
     
  3. dreadfull

    dreadfull Гик

    итак. получается какая-то странная вещь. вот в таков виде как сейчас есть скетч отказывается с большими значениями
    Код (Text):
    int timeOut1 = 5000;
    более 15 секунд (15000 милисекунд). взял в строке
    Код (Text):
     time1 = millis();
    добавил "/1000" а в строке таймаут1 изменил на 15
    Код (Text):
    int timeOut1 = 15;
    и все работает. как так получается не знаю... сейчас тестю на значениях "3600" и "7200" (1 и 2 часа)....
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    long timeOut1
     
  5. dreadfull

    dreadfull Гик

  6. dreadfull

    dreadfull Гик

    вопрос следующий. возможно ли с помощью кнопки переключаться между режимами. т.е. у меня есть
    Код (Text):
     if(x < -60 && (time1 - startTime1) > timeOut1 ){ //задаем условия на включение моторчика
      digitalWrite(4, HIGH);
    }
    if(x > 90){  //задаем условие на отключение моторчика
      startTime1 = time1;
      digitalWrite(4, LOW);
    }
    if(x > 90 && (millis() - startTime2) > timeOut1 ){
      digitalWrite(3, HIGH);  // включаем реверсное вращение моторчика
      }
    else if(x < -50){  //задаем условие на отключение моторчика
      startTime2 = millis();
      digitalWrite(3, LOW);
    }
    а я нажатием кнопки хочу запустить
    Код (Text):
     if(x < -60 && (time3 - startTime3) > timeOut3 ){ //задаем условия на включение моторчика
      digitalWrite(4, HIGH);
    }
    if(x > 90){  //задаем условие на отключение моторчика
      startTime3 = time3;
      digitalWrite(4, LOW);
    }
    if(x > 90 && (millis() - startTime4) > timeOut3 ){
      digitalWrite(3, HIGH);  // включаем реверсное вращение моторчика
      }
    else if(x < -50){  //задаем условие на отключение моторчика
      startTime4 = millis();
      digitalWrite(3, LOW);
    }
    такое возможно????
     
  7. acos

    acos Официальный гик Администратор

    переменную под запоминание состояния, а потом запускаем ту или иную функцию
     
  8. dreadfull

    dreadfull Гик

    извините, а можно пример или образец. ну хотя бы приблизительно....
     
  9. totuin

    totuin Нерд

    Попробуй посмотри здесь, может поможет: flprog.ru