Помогите довести до ума.

PA4OK
Offline
Зарегистрирован: 10.10.2015

Всем доброго времени суток. Ардуино начал зучать не давно, програмированием раньше не занимался ни когда. В общем проблема в следующем. Есть 2 массивных заглушки, приводы двигателя с редукторами по 4 и 8 оборотов в минуту. С крайнего левого в крайнее правое положения (с полностью открытого до полностью закрытого) перемещается почти 5 минут. Delay не очень желательно. На крайних позициях хочу поставить 2 концевика. Как реализовать что б при совпадении времени и нажатом концевике А, срабатывало реле и находилось в включенном состоянии ДО срабатывания концевика Б, при этом концевик А уже будет отпущен. Базовый код наваял такой.

#include <Wire.h>
#include <DS3231.h>

DS3231  rtc(SDA, SCL);
Time RTC_T;

int relePins[5] = {2, 3, 4, 5, 7};         //   Rele
int keyPins[4] = {10, 11, 12, 13};         //   Koncevik
int ATXPin = 6;

/*    позиции временных переменных
1-2 открытие/закрытие 1
3-4 открытие/закрытие 2
*/

int relayHour[5] = {15, 19, 7, 15, 4};    //     Часы срабатывания 
int relayMin[5] = {39, 14, 34, 33, 30};    //     Минуты срабатывания

void setup() {
  Wire.begin();
  Serial.begin(9600);
  rtc.begin();
  //rtc.setDOW(TUESDAY);     // Set Day-of-Week to SUNDAY
  //rtc.setTime(13, 25, 0);     // Set the time to 12:00:00 (24hr format)
  //rtc.setDate(29, 9, 2015);   // Set the date to January 1st, 2014 dd^mm^yy

  pinMode(ATXPin, OUTPUT);
  for (int i = 0; i < 5; i++)
  {
    pinMode(relePins[i], OUTPUT);
    digitalWrite(relePins[i], HIGH);
    if (i < 4) pinMode(keyPins[i], INPUT);//INPUT_PULLUP replace INPUT in case when Key connected to gnd and pin; INPUT in case when Key connected to VCC and pin throw gnd. 
    }
}

void loop() {
  
  RTC_T = rtc.getTime();
//========================Rele 1 Открыть ===========================//
if (relayHour[0] == RTC_T.hour && relayMin[0] == RTC_T.min)
{
  digitalWrite(ATXPin, LOW);
  digitalWrite(relePins[0], LOW);
  }
  else
  {
  digitalWrite(ATXPin, HIGH);
  digitalWrite(relePins[0], HIGH);
    }
  
// ======================Rele 2 Закрытие  ============================//
if (relayHour[1] == RTC_T.hour && relayMin[1] == RTC_T.min)
{
  digitalWrite(ATXPin, LOW);
  digitalWrite(relePins[1], LOW);
  }  
  else
  {
  digitalWrite(ATXPin, HIGH);
  digitalWrite(relePins[1], HIGH);
    }
  Serial.print("Temperature: ");
  Serial.print(rtc.getTemp());
  Serial.println(" C");
  delay (1000);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

PA40K, здесь обычно задают вопросы по непоняткам в программировании. А "довести до ума проект" здесь никто впрягаться не будет. Более адекватное место для такой просьбы - http://arduino.ru/forumy/ishchu-ispolnitelya

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

PA40K, здесь обычно задают вопросы по непоняткам в программировании. А "довести до ума проект" здесь никто впрягаться не будет. Более адекватное место для такой просьбы - http://arduino.ru/forumy/ishchu-ispolnitelya

Эт я его сюда из "Работы с кнопками ...." отправил. Правда рекомендовал кроме кода, описать, в чем и где проблема возникает.
PA40K, давайте слоника кушать частями. Для начала выкиньте все ваши часы и прочее не относящееся к делу. Стоит задача: Проверить, что нажат концевик А, запустить привод, по достижении нажатия коцевика В, остановить привод. В качестве усложнения, по истечении 20 секунд сделать все в обратную сторону.
ВАЖНО: Предусмотреть в алгоритме ситуацию, когда привод завис между двумя концевиками (не нажат ни один, а привод остановлен). В рабочей системе ситуация весьма вероятная.