Помогите пожалуйста 28BYJ-48 + UNL2003 + arduino uno

aleksandrovu
Offline
Зарегистрирован: 27.06.2018

Здравствуйте, при программировании столкнулся с такой проблемой: На драйвере лампочка загорается если температура больше 30, а шаговик нивкакую не поворачивает. Если можете, то исправьте код, и да я полный нуб в этом деле

#include <OneWire.h>
#include <CustomStepper.h>            // Подключаем библиотеку CustomStepper
CustomStepper stepper(2, 3, 4, 5);  // Указываем пины, к которым подключен драйвер шагового двигателя
boolean rotate1 = false;              // Переменная для смены режимов
boolean rotatedeg = false;            // Переменная для смены режимов
boolean crotate = false;              // Переменная для смены режимов      
OneWire ds(10); // на пине 10 (нужен резистор 4.7 КОм)
const uint8_t  pinSensor = 8;                                  // Определяем № вывода Arduino, к которому подключён датчик расхода воды
      uint32_t varPulse;                                       // Объявляем переменную для хранения длительности импульсов с датчика
      uint8_t  varResult; 


void setup(void) {
  stepper.setRPM(12);                 // Устанавливаем количество оборотов в минуту
  stepper.setSPR(4075);       // Устанавливаем колочество шагов на полный оборот. Максимальное значение 4075.7728395
Serial.begin(9600);                                       // Инициируем передачу данных в монитор последовательного порта
pinMode(pinSensor, INPUT);
  pinMode (A0, INPUT);
  pinMode (A1, INPUT);
  
}
void loop(void) {
  int tmp;
  float celsius, fahrenheit, r, temperature;

 byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
   ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров
  ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство 
  ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память
   
  delay(1000); // Микросхема измеряет температуру, а мы ждем.  
   
  ds.reset(); // Теперь готовимся получить значение измеренной температуры
  ds.write(0xCC); 
  ds.write(0xBE); // Просим передать нам значение регистров со значением температуры
 
  // Получаем и считываем ответ
  data[0] = ds.read(); // Читаем младший байт значения температуры
  data[1] = ds.read(); // А теперь старший
 
  // Формируем итоговое значение: 
  //    - сперва "склеиваем" значение, 
  //    - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625)
  float temp =  ((data[1] << 8) | data[0]) * 0.0625;
   
  // Выводим полученное значение температуры в монитор порта
   Serial.println((String) "Температура прибора = "+temp+" градусов по Цельсию ");
   if (temp>30){
   Serial.println((String) "Температура предельно высока: "+temp+" градусов по Цельсию ");

   // =========================================================================================
   
  if (stepper.isDone() &&  rotate1 == false)  
  {
    stepper.setDirection(CCW);        // Устанавливает направление вращения (по часовой)
    stepper.rotateDegrees(290);                // Устанавливает вращение на заданное количество оборотов
    rotate1 = true;
    stepper.run();
  }
  if (stepper.isDone() && rotate1 == true && rotatedeg == false && temp>30)
  {
    stepper.setDirection(CW);         // Устанавливает направление вращения (против часовой)
    stepper.rotateDegrees(290);        // Поворачивает вал на заданное кол-во градусов
    rotatedeg = true;
 
  }
  stepper.run();                      // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо
}
rotate1 = false;
rotatedeg = false;
crotate = false;

  #define  R0  ((float)10000)
#define B ((float)3435)
  tmp = analogRead (A0);
  Serial.print ("Входная температура = ");
  Serial.println (tmp);
  r = ((1023.0*R0)/(float)tmp)-R0;
  temperature = B/log(r/0.09919) - 273.15;  // log is ln in this case
  
  Serial.print ("T = ");
  Serial.print (temperature);
  Serial.println (", C");
  delay (1000);
  
  tmp = analogRead (A1);
  Serial.print ("Выходная температура = ");
  Serial.println (tmp);
  r = ((1023.0*R0)/(float)tmp)-R0;
  temperature = B/log(r/0.09919) - 273.15;  // log is ln in this case
  
  Serial.print ("T 2 = ");
  Serial.print (temperature);
  Serial.println (", C");
  delay (1000);


 // =========================================================================================

Serial.println( );
Serial.println();
 varPulse=pulseIn(pinSensor, HIGH, 200000);                 // Считываем длительность импульса, но не дольше 0,2 сек
    if(varPulse){varResult=uint8_t(1000000/(15*varPulse));}    // Если длительность импульса считана, то рассчитываем скорость потока воды: Q = 1000000/(15L) л/мин
    else        {varResult=0;Serial.println ("Danger, the chip is not connect or water don't go");}                                 // Если длительность импульса не считана, то считаем что скорость потока воды = 0 л/мин
    Serial.println((String) "CKOPOCTb = "+varResult+" L/MIN");

 // =========================================================================================
  
 
   }

Идея в том, чтобы заставить двигатель крутануться на несколько шагов при температуре большей 30

IVAN222
Offline
Зарегистрирован: 19.04.2017

Я бы на Вашем месте, переписал вопрос. А то сейчас народ налетит, будет жарко.

sadman41
Offline
Зарегистрирован: 19.10.2016

Откуда все полезли именно с этим комплектом, однотипными задачами и одинаковыми переменными в скетче?

IVAN222
Offline
Зарегистрирован: 19.04.2017

То есть при >30 градусов на драйвер команда идет, значит что то с  драйвером или двигателем. 

aleksandrovu
Offline
Зарегистрирован: 27.06.2018

Спасибо за то, что отозвались. 
Случилось такое, что двигатель отказывается крутиться вообще и лишь одна из 4-х лампочек горит. Пробовал вырезать код двигателя и запустить его отдельно - всё работает

sadman41
Offline
Зарегистрирован: 19.10.2016

Если постоянно горит светодиод - это означает, что драйвер не степает. Скорее всего run() вызвался только один раз. Стало быть ошибка в алгоритме.

IVAN222
Offline
Зарегистрирован: 19.04.2017

Посмотрите внимательно код  stepper.run(); , в 1 блоке он стоит , а во втором за блоком?

if (stepper.isDone() &&  rotate1 == false) 
  {
    stepper.setDirection(CCW);        // Устанавливает направление вращения (по часовой)
    stepper.rotateDegrees(290);                // Устанавливает вращение на заданное количество оборотов
    rotate1 = true;
    stepper.run();
  }
  if (stepper.isDone() && rotate1 == true && rotatedeg == false && temp>30)
  {
    stepper.setDirection(CW);         // Устанавливает направление вращения (против часовой)
    stepper.rotateDegrees(290);        // Поворачивает вал на заданное кол-во градусов
    rotatedeg = true;
  
  }
  stepper.run();  

Попробуй убрать строку 06.