Добрый день. Не пойму в чем проблемма. Использую ардуино уно, шаговый двигатель, драйвер 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); }
В коде вроде как все ОК. То что выдается в serial никак не зависит от двигателя. А вот от неправильных показаний датчика шалит и мотор и идут не верные значения в serial.
Кстати вспомнил, этот датчик нельзя опрашивать чаще 1 раза в 1 или 2 секунды, а задержки вроде как нет, возможно в библиотеке она предусмотрена, попробуй поставить задержку внизу кода delay(2000);
Предлагаю добавить немного математики, например, если значение температуры изменилось за один шаг более чем на градус, то игнорировать как ошибочное.