Шаговый мотор (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 в переменную" ;) ;) ;), а на обычном, человеческом языке, без терминов, потому, что термины ты тоже (скорее всего) не понимаешь и (возможно) станешь применять их не к месту. Просто напиши, зачем ты написал конкретную строку, про каждую. Про скобки можно не писать.
Я извиняюсь, много лишнего и не нужного написал. Исправил код.
#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); // выводи показания температуры в серийный порт }зачем 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() будет делать то же самое, т.е. если добавить скобки к той пока еще переменной. Но это тоже через, т.к. останавливает полностью исполнение программы.