Всем привет. Недавно приобрел себе плату arduino mega 2560 и несколько модулей/датчиков. Но при подключении всех модулей модули работают некорректно. То есть, шаговый двигатель и сервопривод не могут работать в одно время(чтобы заработал сервопривод нужно дождаться полного оборота шагового двигателя) и на дисплее пропадает информация с датчика температуры и влажности(DHT11)(появляются каракули). Скетч: Спойлер #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); #define LedPin 41 #define pirPin 22 #include <Servo.h> Servo servo; #include "DHT.h" #define DHTPIN 52 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); #include <Stepper_28BYJ.h> #define STEPS 4078 Stepper_28BYJ stepper(STEPS, 53, 51, 49, 47); void setup() { lcd.begin(16, 2); pinMode(pirPin, INPUT); pinMode(LedPin, OUTPUT); servo.attach(24); dht.begin(); stepper.setSpeed(14); } void loop() { int pirVal = digitalRead(pirPin); float h = dht.readHumidity(); float t = dht.readTemperature(); delay(100); if (t < 30) { digitalWrite(LedPin, LOW); delay(1500); } else { stepper.step(256); digitalWrite(LedPin, HIGH); delay(1500); } lcd.setCursor(0,0); lcd.print("Humidity: "); lcd.print(h); lcd.print("%"); lcd.setCursor(0,1); lcd.print("Temperat: "); lcd.print(t); lcd.print("C"); //Если обнаружили движение if (pirVal == HIGH) { servo.write(0); delay(4000); servo.write(90); delay(8000); } } Принцип работы объяснять не буду, все видно в скетче. P.S. Реле работает наоборот(перепутал). P.S.S. В скетч нужно добавить еще датчики звука(KY-038) и освещения(LM393), чтобы данные выводились на дисплей вместе с DHT11, поочередно. P.S.S.S. Заменил скетч с последнего коммента.
Откуда такая уверенность, что модули работают не корректно? Мне кажется, что скетч составлен не совсем удачно. У вас везде стоят огромные задержки. Если вы пишете delay(8000), то придется таки ждать в этом месте 8 секунд и больше ни на что не реагировать. К тому же библиотека шаговика не умеет работать в фоновом режиме. Если вы ей говорите сделать 100 шагов, то пока она не выполнит эти 100 шагов с установленной скоростью, дальше программа не работает. Учитесь распределять задачи по времени, пользуйтесь таймером и прерываниями. Да, это все посложнее, но не смертельно
Короче, добавил все датчики, что были нужны. Реле тоже работает. Проверил работу всего без delay и получил тормоза везде.(Лампа горит, шаговик вращается, серво тоже, но все жутко тормозит.) Тему с многозадачностью нашел и прочел, но так как я в этом нуб, есть пара вопросов. Во-первых, в примере приведены диоды, которых у меня нет и строки long interval, которые, как я понял, для мигания диода. Во-вторых, не имею понятия как заставить все работать синхронно/слаженно. Если коротко, то в моем в случае сервопривод-это дверь, которая должна открыться, если есть движение на датчике движения. Далее, шаговый двигатель-это вентилятор, который будет охлаждать комплекс, если температура поднимится выше значения и наоборот, если температура ниже значения, то включить реле/лампу, которая все это дело нагреет. LCD при этом должен беспрерывно показывать значения влажности, температуры, звука и света.(Можно сделать каждые 5 сек). Спойлер #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); #define LedPin 41 //int LedState = LOW; //long previousMillis = 0; #define pirPin 22 #include <Servo.h> Servo servo; #include "DHT.h" #define DHTPIN 52 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); #include <Stepper_28BYJ.h> #define STEPS 4078 Stepper_28BYJ stepper(STEPS, 53, 51, 49, 47); int light; int sound; void setup() { lcd.begin(16, 2); pinMode(pirPin, INPUT); pinMode(LedPin, OUTPUT); servo.attach(24); dht.begin(); stepper.setSpeed(13); } void loop() { sound = analogRead(0); light = analogRead(1); int pirVal = digitalRead(pirPin); //delay(2000); int h = dht.readHumidity(); int t = dht.readTemperature(); if (t < 25) { digitalWrite(LedPin, LOW); // delay(2000); } else { stepper.step(512); //delay(1000); digitalWrite(LedPin, HIGH); } lcd.setCursor(0,0); lcd.print("Hum:"); lcd.print(h); lcd.print("% "); lcd.print("Temp:"); lcd.print(t); lcd.print("C"); lcd.setCursor(0,1); lcd.print("L/t:"); lcd.print(light); lcd.print(" "); lcd.print("S/d:"); lcd.print(sound); lcd.print("Db"); if (pirVal == HIGH) { servo.write(90);} else servo.write(0); } Помогите дописать код с использованием таймеров для мультизадачности или дайте хороший совет.