Шаговый мотор +ds18b20

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем ArtemIlin, 2 дек 2015.

  1. ArtemIlin

    ArtemIlin Нерд

    Здравствуйте друзья.
    Помогите пожалуйста доработать код.
    Код (C++):
    #include <OneWire.h>       // Подключаем библиотеку для работы с шиной OneWire
    OneWire oneWire(2);               //  Термометр будет подключен на 2 пин в ардуино
    #include <DallasTemperature.h>     //Подключаем библиотеку для работы с термометром
    DallasTemperature ds(&oneWire);   //Создаем объект ds, подключенный по OneWire
    #include <Stepper_28BYJ.h>

    #define STEPS 4078                 // изменить количество шагов для вашего мотора
    Stepper_28BYJ stepper(STEPS, 8, 9, 10, 11); //пины на ардуино
    DeviceAddress sensorMILD = {0x28, 0xF4, 0x5B, 0x5C, 0x06, 0x0, 0x0, 0x4E}; //адрес датчика
    void setup()
    {
      ds.begin();
      stepper.setSpeed(13);           // установим скорость вращения
    }
    void loop()
    {
      ds.requestTemperatures();       // считываем температуру с датчика ds18b20
       
      if (ds.getTempC(sensorMILD) >= 29) //условие если температура >= 29C крутим мотор на 4000 шагов
    {
      stepper.step(4000);              // Делаем 4000 шагов в одну строну
    }
       
      if (ds.getTempC(sensorMILD) == 27) //условие если температура == 27C крутим мотор на -4000 шагов
    {
      stepper.step(-4000);            // Делаем 4000 шагов в другую строну
    }

      delay(3000);

    }
    Как видно из кода, шаговый мотор будет открывать или закрывать форточку в теплице при определенных условиях температуры.
    Но мне хотелось бы реализовать другой алгоритм работы открывания,закрывания,а так как я в программирование полный ноль прошу Вашей помощи.
    Пример того ,что я хочу от другого алгоритма;
    Допустим, максимальное открытие форточки будет =4000 шагам
    следовательно максимальное закрытие форточки должна будет =-4000 шагам
    При температуре>= 29 шаговый мотор должен сделать 4000 шагов один раз (открыли форточку)
    При температуре ==27 шаговый мотор должен сделать -4000 шагов один раз (закрыли форточку)
    Проблема в том,что в моем сектче мотор крутится в каждом цикле пока не достигнет заданных температур.
    Извиняюсь за сумбурно изложенный вопрос.
     
    Последнее редактирование: 2 дек 2015
  2. vvr

    vvr Инженерище

    у вас не предусмотрена система отслеживания положения форточки(концевик, геркон)
    поэтому при включении или перезагрузке мк вне зависимости от положения форточки всегда будет нулевое значение шагов.
    форточка, допустим, открыта.
    при повышении температуры шаговик опять начнёт её открывать.
    когда сделаете отслеживание положения форточки тогда и код немного поменяется и решится ваша проблема
     
    ArtemIlin нравится это.
  3. ArtemIlin

    ArtemIlin Нерд

    vvr спасибо за наводку,пойду думать.
    Вот подредактировал скетч,всё заработало .
    Если не трудно, посмотрите пожалуйста код, с профессиональной точки зрения ,не попадутся ли какие ни будь подводные камни в будущем .
    Спасибо.
    Код (C++):
    #include <OneWire.h>       // Подключаем библиотеку для работы с шиной OneWire
    OneWire oneWire(2);               //  Термометр будет подключен на 2 пин в ардуино
    #include <DallasTemperature.h>     //Подключаем библиотеку для работы с термометром
    DallasTemperature ds(&oneWire);   //Создаем объект ds, подключенный по OneWire
    #include <Stepper_28BYJ.h>
    #define STEPS 4078                 // изменить количество шагов для вашего мотора
    Stepper_28BYJ stepper(STEPS, 8, 9, 10, 11); //пины на ардуино
    DeviceAddress sensorMID = {0x28, 0xF4, 0x5B, 0x5C, 0x06, 0x0, 0x0, 0x4E}; //адрес датчика
    const int buttonPin = 3;           // номер входа, подключенный к кнопке
    int buttonState = 0;               // переменная для хранения состояния кнопки

    void setup()
    {
      ds.begin();
      stepper.setSpeed(13);           // установим скорость вращения
      pinMode(buttonPin, INPUT);     // инициализируем пин, подключенный к кнопке, как вход
    }
    void loop()
    {
      ds.requestTemperatures();       // считываем температуру с датчика ds18b20
      buttonState = digitalRead(buttonPin); // считываем значения с входа кнопки
      if (ds.getTempC(sensorMID) > 29)      //условие если температура > 29C крутим мотор на 1000 шагов
        {
          if (buttonState == HIGH)           //если кнопка замкнута
          {
           stepper.step(1000);               //крутим мотор на 1000 шагов
          }
         if (buttonState == LOW)             //если кнопка разомкнута
         {
           stepper.step(0);                  //мотор не крутится
         }
         }
     
      if (ds.getTempC(sensorMID) < 27)    //условие если температура <27C крутим мотор на -1000 шагов

       {
         if (buttonState == HIGH)          //если кнопка замкнута
         {
           stepper.step(0);                //мотор не крутится
         }
         if (buttonState == LOW)           //если кнопка разомкнута
         {
        stepper.step(-1000);               //крутим мотор на -1000 шагов
         }
         }
      delay(3000);

    }
     
    Последнее редактирование: 3 дек 2015
  4. vvr

    vvr Инженерище

    ну а теперь боремся с дребезгом контактов кнопки во избежание глюков:)
    ну и избавляемся от делеев
     
    ArtemIlin нравится это.
  5. ArtemIlin

    ArtemIlin Нерд

    Если речь идет о подтягивающим резисторе R1 -10К ,то я его включил в схему.
    С избавлением от делеев буду читать примеры :).
     
  6. vvr

    vvr Инженерище

    ArtemIlin нравится это.
  7. ArtemIlin

    ArtemIlin Нерд

    Спасибо за ссылку,буду разбираться.