Криво работает шаговый двигатель в связке с датчиком температуры.(Стрелочный термометр)

Тема в разделе "Arduino & Shields", создана пользователем olegoriy, 14 июн 2015.

  1. olegoriy

    olegoriy Гик

    Добрый день.
    Не пойму в чем проблемма.
    Использую ардуино уно, шаговый двигатель, драйвер L298n, датчик DHT11.
    Задача такова. Все включаеться - датчик измеряет температуру - двигатель поворачивается на количество шагов равной температуре - останавливаеться - при изменении температуры делает шаг по часовой или против в зависимости от температуты.
    Короче стрелочный термометр.
    Так вот все вродебы получаеться , но иногда при изменении температуры двигатель шагает туда сюда а температура в порте начинает скакать. При чем ровно в половину. К примеру если 24 градуса то скачет 24-12-24-12-24-24-24-12-12-24. Как то так. Скачки происходят произвольно то есть может стабильно работать 5 минут или несколько секунд продолжительность скачков тоже произвольная.
    Думаю что ошибка в коде так как слабо понимаю как работает библиотека.
    Код (Text):
    #include <dht11.h>
    dht11 DHT;
    #define DHT11_PIN A0
    int ENA=2;
    int inA=3;
    int inB=4;
    int ENB=5;
    int inC=6;
    int inD=7;
    int z = 100;
    int q = 0;

    void setup()
    {pinMode(A0,INPUT);
    pinMode(ENA,OUTPUT);
    pinMode(ENB,OUTPUT);
    pinMode(inA,OUTPUT);
    pinMode(inB,OUTPUT);
    pinMode(inC,OUTPUT);
    pinMode(inD,OUTPUT);
    digitalWrite(ENA,HIGH);
    digitalWrite(ENB,HIGH);
    Serial.begin(9600);

    }
    void loop(){
      DHT.read(DHT11_PIN);
      Serial.println(DHT.temperature);
      int a = DHT.temperature;
      if(q < a){
      shag_nazad();
      q = q + 1;
      }
      if(q > a){
      shagvpered();
      q = q - 1;
      }
      if(q == a){
      stopp();
      }


    }

     
     


    void shagvpered() {
    digitalWrite(inA,HIGH);
    digitalWrite(inB,LOW);
    digitalWrite(inC,LOW);
    digitalWrite(inD,LOW);
    delay(z);
    digitalWrite(inA,LOW);
    digitalWrite(inB,LOW);
    digitalWrite(inC,HIGH);
    digitalWrite(inD,LOW);
    delay(z);
    digitalWrite(inA,LOW);
    digitalWrite(inB,HIGH);
    digitalWrite(inC,LOW);
    digitalWrite(inD,LOW);
    delay(z);
    digitalWrite(inA,LOW);
    digitalWrite(inB,LOW);
    digitalWrite(inC,LOW);
    digitalWrite(inD,HIGH);
    delay(z);
    }
    void shag_nazad() {

    digitalWrite(inA,LOW);
    digitalWrite(inB,LOW);
    digitalWrite(inC,LOW);
    digitalWrite(inD,HIGH);
    delay(z);
    digitalWrite(inA,LOW);
    digitalWrite(inB,HIGH);
    digitalWrite(inC,LOW);
    digitalWrite(inD,LOW);
    delay(z);
    digitalWrite(inA,LOW);
    digitalWrite(inB,LOW);
    digitalWrite(inC,HIGH);
    digitalWrite(inD,LOW);
    delay(z);
    digitalWrite(inA,HIGH);
    digitalWrite(inB,LOW);
    digitalWrite(inC,LOW);
    digitalWrite(inD,LOW);
    delay(z);
    }
    void stopp() {
    digitalWrite(inA,LOW);
    digitalWrite(inB,LOW);
    digitalWrite(inC,LOW);
    digitalWrite(inD,LOW);
    delay(z);
    }
     
  2. olegoriy

    olegoriy Гик

    Пришла в голову идея. Может реже опрашивать датчик и сравнивать?
     
  3. DrProg

    DrProg Вечный нерд

    Здорово было бы писать кратко суть вопроса в заголовке.
     
  4. Deniss

    Deniss Гик

    В коде вроде как все ОК. То что выдается в serial никак не зависит от двигателя.
    А вот от неправильных показаний датчика шалит и мотор и идут не верные значения в serial.
     
  5. Deniss

    Deniss Гик

    Кстати вспомнил, этот датчик нельзя опрашивать чаще 1 раза в 1 или 2 секунды, а задержки вроде как нет, возможно в библиотеке она предусмотрена, попробуй поставить задержку внизу кода delay(2000);
     
  6. DrProg

    DrProg Вечный нерд

    Предлагаю добавить немного математики, например, если значение температуры изменилось за один шаг более чем на градус, то игнорировать как ошибочное.
     
  7. vvr

    vvr Инженерище

    Делать опрос раз в 5 сек
     
  8. olegoriy

    olegoriy Гик

    Всем спасибо. Действительно стал опрашивать раз в две секунды проблема пропала.:)