Шаговый мотор (nema17)+ dht22
- Войдите на сайт для отправки комментариев
Пнд, 27/08/2018 - 18:28
Всем привет. Прошу помощи, не могу остановить шаговый мотор в заданном положении. При температуре от 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); }
Столь большое количество ошибок, наводит на подозрения, что ты не понимаешь в написанном ничего.
Это не "наезд", а попытка найти точку начала общения. Для этого сделай комментарии к каждой строке кода, и не вида "здесь записываю 4 в переменную" ;) ;) ;), а на обычном, человеческом языке, без терминов, потому, что термины ты тоже (скорее всего) не понимаешь и (возможно) станешь применять их не к месту. Просто напиши, зачем ты написал конкретную строку, про каждую. Про скобки можно не писать.
Я извиняюсь, много лишнего и не нужного написал. Исправил код.
зачем 58 и 59? подумайте, нужны ли они вообще, если уже есть 31 и 32.
и что за херня в 82??? Посмотрите на нее внимательно и объясните. Если не увидите ошибку, то все остальное не имеет смысла.
58 и 59 согласен не нужны. А вот по 82 я и пишу, что не могу понять как сделать, что бы мотор останавливался при заданных параметрах. Хотелось вообще реализовать пропорциональное вращение двигателя при повышении или понижении заданной температуры. Я ардуино и программированием занимаюсь недавно и неготорых процессов не совсем понимаю. Вот и прошу помощи.
f - это просто имя, с точки зрения программы - адрес в памяти, некое постоянное число, в отличии от f() - что является ВЫЗОВОМ ФУНКЦИИ f().
Еще раз спрашиваю, что за херня в 82?
Задумка в 82 была зациклить функцию stopp в 55 строке (остановку шагового мотора) и при температуре выше 26,5 выйти из цикла. Т.к. без while мотор крутится без остановки в цикле loop.
Блеать! Еще раз:
ЧТО означает, в твоем понимании запись while (stopp) ?????
Напоминаю, что stopp и stopp() - это РАЗНЫЕ ВЕЩИ. stopp - просто слово, это раз. И даже если ты хотел вызвать функцию, но не смог по генетическим причинам, то одноименная функция у тебя ВООБЩЕ ничего не возвращает. Следовательно stopp() - тоже не имеет определенного значения. Но тут, на наше счастье, тебе компилятор об этом напомнит, указав на ошибку.
Как сделать правильно?
Не дразни пингвина, брат.
Как сделать правильно?
Правильно - изучить язык программирования С, а потом писать на нем программы.
При таком уровне знаний - тебе в раздел "Ищу исполнителя".
Если стыдно или жадно, то набери в яндексе "функции в си" и почитай пару детских сайтов.
========================
и заранее на возмущения типа "что, на вопрос ответить трудно?!" - я уже на него ответил, если бы ты знал минимум о языке, ты бы уже сам все испроавил. А при твоих знаниях, да трудно.
Спасибо большое,что потратили свое драгоценное время на меня.
Спасибо большое,что потратили свое драгоценное время на меня.
Времени у меня дохера, поделиться могу, я не работаю потому, что не хочу.
Но я не прикладной психолог и с обидками мне разбираться не интересно.
Написал: вызов функции это stopp(), а не просто stopp, и функция ничего не возвращает. А вот что именно ей следует возвращать - это должен решить ты сам.
====================
и да, странно, почему все обижаются, когда их посылают в коммерческий раздел, будто нахер послали? Если не можешь сам - заплати какому-нибудь студенту. И студенту польза и человеку не нужно учить то, что ему неинтересно. Если интересно - то учи сам. Вот чего-чего, а учебных пособий и материалов сейчас в сети... эх! Если б в мою юность так было!
Спасибо, буду разбираться, что ей нужно возвращать.
Мне понравилась ваша логика, например в строках 79-81.
Строка 79- "выключаем питание двигателя" далее
строка 80 - "делаем 100 шагов, на скорости 15000, направление право".
Как вы себе это представляете , при выключенном питании БУДЕТ КРУТИТЬСЯ двигатель???
В строке 79 - ошибка в коментарии! При низком уровне в low драйвер шагового двигателя включен, при высоком high выключен.
Не вижу определение булевой переменной stopp. Компилятор должен уйти в ошибку, но если он не ушел в ошибку значит подставил первое что ему взбрело в голову - true. Идем дальше, получили бесконечный цикл. Теоретически из него может вывести условие "t>значение", но если вдруг при вхождении в этот самый цикл t не имело этого значения, то оно наверное изменяется по прерыванию или таймеру? Поскольку никаких прерываний или таймеров я не вижу, то крутиться ему пока не отрубят питание. Зато если добавите t = dht.readTemperature() в этот самый цикл, то условие будет проверяться как надо. Хотя это решение через ж... Да, чисто теоретически вызов процедуры stopp() будет делать то же самое, т.е. если добавить скобки к той пока еще переменной. Но это тоже через, т.к. останавливает полностью исполнение программы.