Измерительный комплекс

Тема в разделе "Arduino & Shields", создана пользователем Куаныш, 10 апр 2017.

  1. Куаныш

    Куаныш Нуб

    Всем привет. Недавно приобрел себе плату 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. Заменил скетч с последнего коммента.
     

    Вложения:

    • amperka.ino
      Размер файла:
      1,2 КБ
      Просмотров:
      547
    Последнее редактирование: 13 апр 2017
  2. sslobodyan

    sslobodyan Гик

    Откуда такая уверенность, что модули работают не корректно? Мне кажется, что скетч составлен не совсем удачно. У вас везде стоят огромные задержки. Если вы пишете delay(8000), то придется таки ждать в этом месте 8 секунд и больше ни на что не реагировать. К тому же библиотека шаговика не умеет работать в фоновом режиме. Если вы ей говорите сделать 100 шагов, то пока она не выполнит эти 100 шагов с установленной скоростью, дальше программа не работает. Учитесь распределять задачи по времени, пользуйтесь таймером и прерываниями. Да, это все посложнее, но не смертельно :)
     
  3. Куаныш

    Куаныш Нуб

    Короче, добавил все датчики, что были нужны. Реле тоже работает.
    Проверил работу всего без 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);
    }

    Помогите дописать код с использованием таймеров для мультизадачности или дайте хороший совет.
     

    Вложения:

    • amperka.ino
      Размер файла:
      1,2 КБ
      Просмотров:
      538
    Последнее редактирование: 13 апр 2017