Подключение шагового двигателя и DHT11

Здравствуйте. Помогите пожалуйста разобраться,. как настроить одновременную работу шагового двигателя и датчика DHT11. При запуске кода раз в секунду происходит опрос датчика и в этот момент происходит один шаг двигателя.

#include "DHT11.h"  // библиотека для датчика температуры и влажности
#define DHTPIN 8    // имя пина для подключения датчика температуры и влажности
DHT11 dht(DHTPIN);

#include <GyverStepper.h>
GStepper<STEPPER4WIRE> stepper(2048, 14, 16, 15, 17);

#define _LCD_TYPE 1             // подключение дисплея
#include <LCD_1602_RUS_ALL.h>   // библиотека для дисплея
#include <Wire.h>               //библиотека для I2C на дисплеи
LCD_1602_RUS lcd(0x27, 16, 2);  // настройка дисплея

void setup() {
  Serial.begin(9600);              //разрядность порта
  lcd.init();                      // инциализация дисплея
  stepper.setRunMode(KEEP_SPEED);  // режим кручения
  stepper.setSpeedDeg(80);         //скорость в градусах/сек
}

void loop() {
  float h = dht.readHumidity();     //считывание влажности
  float t = dht.readTemperature();  // считывание температуры
  lcd.backlight();                  // включение подсветки
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Влажн  =    %");       // Выводим текст
  lcd.setCursor(8, 0);              // Устанавливаем курсор на 7 символ
  lcd.print(h, 1);                  // Выводим на экран значение влажности
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Темпер =    c");       // Выводим текст, \1 - значок градуса
  lcd.setCursor(8, 1);              // Устанавливаем курсор на 7 символ
  lcd.print(t, 1);                  // Выводим на экран значение температуры
  stepper.tick();                   // начало движения мотора
}

А проблема в чём? Вы забыли описать проблему. Какая помощь Вам нужна и в чём она должна заключаться?

Когда я коментирую эту часть кода

float h = dht.readHumidity();     //считывание влажности
  float t = dht.readTemperature();  // считывание температуры
  lcd.backlight();                  // включение подсветки
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Влажн  =    %");       // Выводим текст
  lcd.setCursor(8, 0);              // Устанавливаем курсор на 7 символ
  lcd.print(h, 1);                  // Выводим на экран значение влажности
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Темпер =    c");       // Выводим текст, \1 - значок градуса
  lcd.setCursor(8, 1);              // Устанавливаем курсор на 7 символ
  lcd.print(t, 1);                  // Выводим на экран значение температуры

мотор работает, как должен со скоростью 80 градусов в секунду, а когда раскомментирую то со скоростью 1 шаг в секунду

И что Вас удивляет? Что у Вас написано в первых двух строках?

float h = dht.readHumidity();     //считывание влажности
float t = dht.readTemperature();  // считывание температуры

Обе эти функции работают не менее 0,5 секунды (если быть точным - 0,5 сек + реальное время измерения), от вместе они примерно секунду и работают! Это легко понять, если посмотреть на начало функции readRawData, которую они обе вызывают:

int DHT11::readRawData(byte data[5]) {
    delay(_delayMS);
    ...

а _delayMS определена в файле DHT.h как

unsigned long _delayMS = 500; // Default delay in milliseconds between sensor readings.

Т.е. Вы первыми двумя строками делаете секундную задержку, а потом чему-то удивляетесь.

Для справки: переменную _delayMS можно уменьшить, хоть до нуля при помощи метода setDelay, но есть нюанс - этот датчик нельзя дёргать чаще раза в секунду, а Вы именно это пытаетесь делать. В библиотека есть простенькая “защита от дурака”, вот она и сработала.

1 лайк

Спасибо за объяснение, но что в таком случае делать?

Как что делать?

Простейший (но, хреновый) вариант - мотор запускать так часто, как Вам надо, а измерения - раз в секунду, убив при этом задержку в ноль. Но это хреново, т.к. само измерение тоже занимает время и эта естественная задержка всё равно будет мешать управлению мотором.

Более правильный вариант - мотор дёргать по прерыванию от таймера. Тогда ему ничто мешать не будет. А измерения делать раз в секунду и ни о чём не думать.

1 лайк

Спасибо, сейчас буду разбираться, как это делается.