Шаговый мотор (nema17)+ dht22

rsed
Offline
Зарегистрирован: 27.08.2018

Всем привет. Прошу помощи, не могу остановить шаговый мотор в заданном положении. При температуре от 24,5 до 25 (и при 26) градусов шаговик должен сделать 100 шагов и остановится. Он действительно останавливаетя, но дальше ничего не происходит (зависает). Понимаю, что проблема в функции stopp и while, но как ее исправить ума не приложу.

#include <MsTimer2.h>
#include "DHT.h"
#define DHTPIN 10  // 10 пин датчика DHT 22
#define DHTTYPE DHT22 // DHT 22
//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);

#define pinB 4  // пин энкодера
#define STEP 2 // шаги
#define DIR 5 // направление
#define EN 8 // вкл / откл  драйвера шагового двигателя

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размерность дисплея

volatile int val1 = 0;  
float t;

void setup() {
  MsTimer2::set(2000,datchik);  // прерывание по таймеру в 2 секунды
  MsTimer2::start();             // старт прерывания
  
  Serial.begin (9600);
  dht.begin();

////////////////LCD//////////////////
lcd.clear();
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.setCursor(0, 0);
lcd.print("TEMP");
lcd.setCursor(0, 1);
lcd.print("POSITION");
///////////////////////////////////////
  
  pinMode(pinB, INPUT);     
  attachInterrupt(1, encoder, FALLING); 

  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);
  pinMode(EN, OUTPUT);
}

void stepper(unsigned int Step, int Speed, boolean Set) {
  digitalWrite(DIR, Set);    
  for (int i = 0; i < Step; i++){
     digitalWrite(STEP, HIGH);
     delayMicroseconds(Speed);
     digitalWrite(STEP, LOW);
     delayMicroseconds(Speed);
  }
}

void stopp (){
  t = dht.readTemperature();
  lcd.clear();
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.setCursor(0, 0);
lcd.print("TEMP");
lcd.setCursor(10, 0);
lcd.print(t);
  digitalWrite(EN, HIGH);
}

void loop() {
  
  if (t> 24.5 && t< 25) {
  digitalWrite(EN, LOW);
  
  stepper(100, 15000,1);  //количество шагов, скорость, направление
  //motor_position==Step;
  digitalWrite(EN, HIGH);
    while (stopp) {
      if (t>24.7)break; 
     }
 }
  if (t> 26) {
  digitalWrite(EN, LOW);
    stepper(100, 15000,0);  //количество шагов, скорость, направление
  digitalWrite(EN, HIGH);
    while (stopp) {
     if (t>26,5)break; 
   }
 }
  else {  
    digitalWrite(EN, HIGH);   
  }

/////////////LCD/////////////////////
lcd.setCursor(10, 0);
lcd.print(t);
lcd.setCursor(10, 1);
lcd.print(motor_position);
/////////////////////////////////////

}

void datchik(){
t = dht.readTemperature();
Serial.print ("temp ");
Serial.println(    t);

}

void encoder() {  
  if (digitalRead(pinB)) {
    val1++; 
    Serial.print(">> ");  

  } 
  else {
    val1--; 
    Serial.print("<< "); 
  }
 Serial.println (val1);  
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Столь большое количество ошибок, наводит на подозрения, что ты не понимаешь в написанном ничего.

Это не "наезд", а попытка найти точку начала общения. Для этого сделай комментарии к каждой строке кода, и не вида "здесь записываю 4 в переменную" ;) ;) ;), а на обычном, человеческом языке, без терминов, потому, что термины ты тоже (скорее всего) не понимаешь и (возможно) станешь применять их не к месту. Просто напиши, зачем ты написал конкретную строку, про каждую. Про скобки можно не писать.

rsed
Offline
Зарегистрирован: 27.08.2018

Я извиняюсь, много лишнего и не нужного написал. Исправил код. 

#include <MsTimer2.h> //подключаю библиотеку прерывания
 
#include "DHT.h"    //подключаю библиотеку датчика DHT 22
#define DHTPIN 10  // 10 пин датчика DHT 22
#define DHTTYPE DHT22 // DHT 22

//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);

#define pinB 4  // пин энкодера
#define STEP 2 // шаги
#define DIR 5 // направление
#define EN 8 // вкл / откл  драйвера шагового двигателя



#include <LiquidCrystal_I2C.h>    //подключаю библиотеку lcd
LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размерность дисплея

float t; // задаем переменную для датчика температуры

void setup() {                  //        
  MsTimer2::set(2000,datchik);  // устанавливаем функцию прерывания (прерывание по таймеру в 2 секунды)
  MsTimer2::start();             // старт прерывания
  
  Serial.begin (9600);          // инициализация последовательного соединения 
  dht.begin();                      // назначает указанный выше пин (10) как выходной параметр  

////////////////LCD//////////////////
lcd.clear();                          // очистка дисплея
lcd.init();                             // Инициализация lcd
lcd.backlight();                   // Включаем подсветку
lcd.setCursor(0, 0);            // установка курсора в заданное положение  
lcd.print("TEMP");              // пишем TEMP
lcd.setCursor(0, 1);            // установка курсора в заданное положение 
///////////////////////////////////////
  

  pinMode(STEP, OUTPUT); // устанавливаем STEP как выход
  pinMode(DIR, OUTPUT);  // устанавливаем DIR как выход
  pinMode(EN, OUTPUT);  // устанавливаем EN как выход
}

void stepper(unsigned int Step, int Speed, boolean Set) {  // ФУНКЦИЯ РАБОТЫ ШАГОВОГО ДВИГАТЕЛЯ
  digitalWrite(DIR, Set);     // ФУНКЦИЯ РАБОТЫ ШАГОВОГО ДВИГАТЕЛЯ
  for (int i = 0; i < Step; i++){  // ФУНКЦИЯ РАБОТЫ ШАГОВОГО ДВИГАТЕЛЯ
     digitalWrite(STEP, HIGH);    // ФУНКЦИЯ РАБОТЫ ШАГОВОГО ДВИГАТЕЛЯ
     delayMicroseconds(Speed);    // ФУНКЦИЯ РАБОТЫ ШАГОВОГО ДВИГАТЕЛЯ
     digitalWrite(STEP, LOW);     // ФУНКЦИЯ РАБОТЫ ШАГОВОГО ДВИГАТЕЛЯ
     delayMicroseconds(Speed);    // ФУНКЦИЯ РАБОТЫ ШАГОВОГО ДВИГАТЕЛЯ
                           
  }
}

void stopp (){       // функция остановки шагового двигателя
  t = dht.readTemperature();  // читаем температуру
  lcd.clear();   // очистка дисплея
lcd.init();        // Инициализация lcd       
lcd.backlight();   // Включаем подсветку
lcd.setCursor(0, 0);   // установка курсора в заданное положение 
lcd.print("TEMP");     // пишем TEMP
lcd.setCursor(10, 0);   // установка курсора в заданное положение
lcd.print(t);          // выводим покозание температуры 
  digitalWrite(EN, HIGH);   // отключаем питание шагового двигателя
}

void loop() {
  
  if (t> 24.5 && t< 25) {     // если температура больше 24,5  и меньше 25 то     
  digitalWrite(EN, LOW);      // включаем питание шагового двигателя  
  stepper(100, 15000,1);      //делаем 100 шагов, на скорости 15000, направление право
  digitalWrite(EN, HIGH);    // выключаем питание шагового двигателя
    
while (stopp) {              // зацикливаем остановку шагового двигателя
      if (t>24.7)break;     // если температура больше 24,7 выход из while 
   }
 }
  if (t> 26) {              // если температура больше 26 выход из while
  digitalWrite(EN, LOW);    // выключаем питание шагового двигателя
    stepper(100, 15000,0);  //делаем 100 шагов, на скорости 15000, направление влево
  digitalWrite(EN, HIGH);   // включаем питание шагового двигателя 
    while (stopp) {         // зацикливаем остановку шагового двигателя
     if (t>26,5)break;      //если температура больше 26,5 выход из while
   }
 }
  else {                     // если температура в не заданных параметрах отключаем питание 
    digitalWrite(EN, HIGH);  // шагового двигателя 
  }

/////////////LCD/////////////////////
lcd.setCursor(10, 0);       // установка курсора в заданное положение
lcd.print(t);               // выводим покозание температуры 
/////////////////////////////////////
}

void datchik(){      // функция прерывания датчика температуры
t = dht.readTemperature(); // читаем температуру
Serial.print ("temp ");    // пишем tepm в серийный порт 
Serial.println(    t);     // выводи показания температуры в серийный порт
}

 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

зачем 58 и 59? подумайте, нужны ли они вообще, если уже есть 31 и 32.

и что за херня в 82??? Посмотрите на нее внимательно и объясните. Если не увидите ошибку, то все остальное не имеет смысла.

rsed
Offline
Зарегистрирован: 27.08.2018

58 и 59 согласен не нужны. А вот по 82 я и пишу, что не могу понять как сделать, что бы мотор останавливался при заданных параметрах. Хотелось вообще реализовать пропорциональное вращение двигателя при повышении или понижении заданной температуры. Я ардуино и программированием занимаюсь недавно и неготорых процессов не совсем понимаю. Вот и прошу помощи. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

f - это просто имя, с точки зрения программы - адрес в памяти, некое постоянное число, в отличии от f() - что является ВЫЗОВОМ ФУНКЦИИ f().

Еще раз спрашиваю, что за херня в 82?

 

rsed
Offline
Зарегистрирован: 27.08.2018

Задумка в 82 была зациклить функцию stopp в 55 строке (остановку шагового мотора) и при температуре выше 26,5 выйти из цикла. Т.к. без while мотор крутится без остановки в цикле loop.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Блеать! Еще раз:

ЧТО означает, в твоем понимании запись while (stopp) ?????

Напоминаю, что stopp  и stopp() - это РАЗНЫЕ ВЕЩИ. stopp - просто слово, это раз. И даже если ты хотел вызвать функцию, но не смог по генетическим причинам,  то одноименная функция у тебя ВООБЩЕ ничего не возвращает. Следовательно stopp() - тоже не имеет определенного значения. Но тут, на наше счастье, тебе компилятор об этом напомнит, указав на ошибку.

rsed
Offline
Зарегистрирован: 27.08.2018

Как сделать правильно? 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Не дразни пингвина, брат.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

rsed пишет:

Как сделать правильно? 

Правильно - изучить язык программирования С, а потом писать на нем программы.

При таком уровне знаний - тебе в раздел "Ищу исполнителя".

Если стыдно или жадно, то набери в яндексе "функции в си" и почитай пару детских сайтов.

========================

и заранее на возмущения типа "что, на вопрос ответить трудно?!" - я уже на него ответил, если бы ты знал минимум о языке, ты бы уже сам все испроавил. А при твоих знаниях, да трудно.

rsed
Offline
Зарегистрирован: 27.08.2018

Спасибо большое,что потратили свое драгоценное время на меня.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

rsed пишет:

Спасибо большое,что потратили свое драгоценное время на меня.

Времени у меня дохера, поделиться могу, я не работаю потому, что не хочу.

Но я не прикладной психолог и с обидками мне разбираться не интересно.

Написал: вызов функции это stopp(), а не просто  stopp, и функция ничего не возвращает. А вот что именно ей следует возвращать - это должен решить ты сам.

====================

и да, странно, почему все обижаются, когда их посылают в коммерческий раздел, будто нахер послали? Если не можешь сам - заплати какому-нибудь студенту. И студенту польза и человеку не нужно учить то, что ему неинтересно. Если интересно - то учи сам. Вот чего-чего, а учебных пособий и материалов сейчас в сети... эх! Если б в мою юность так было!

rsed
Offline
Зарегистрирован: 27.08.2018

Спасибо, буду разбираться, что ей нужно возвращать.

ATkRnr
Offline
Зарегистрирован: 22.10.2013

Мне понравилась ваша логика, например в строках 79-81.

Строка 79- "выключаем питание двигателя"  далее

строка 80 - "делаем 100 шагов, на скорости 15000, направление право". 

Как вы себе это представляете , при выключенном питании БУДЕТ КРУТИТЬСЯ двигатель???

rsed
Offline
Зарегистрирован: 27.08.2018

В строке 79 - ошибка в коментарии! При низком уровне в low драйвер шагового двигателя включен, при высоком high выключен.  

nevkon
Offline
Зарегистрирован: 20.01.2015

Не вижу определение булевой переменной stopp. Компилятор должен уйти в ошибку, но если он не ушел в ошибку значит подставил первое что ему взбрело в голову - true. Идем дальше, получили бесконечный цикл. Теоретически из него может вывести условие "t>значение", но если вдруг при вхождении в этот самый цикл t не имело этого значения, то оно наверное изменяется по прерыванию или таймеру? Поскольку никаких прерываний или таймеров я не вижу, то крутиться ему пока не отрубят питание. Зато если добавите t = dht.readTemperature() в этот самый цикл, то условие будет проверяться как надо. Хотя это решение через ж... Да, чисто теоретически вызов процедуры stopp() будет делать то же самое, т.е. если добавить скобки к той пока еще переменной. Но это тоже через, т.к. останавливает полностью исполнение программы.