Помогите довести до ума.
- Войдите на сайт для отправки комментариев
Вс, 11/10/2015 - 18:10
Всем доброго времени суток. Ардуино начал зучать не давно, програмированием раньше не занимался ни когда. В общем проблема в следующем. Есть 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);
}
PA40K, здесь обычно задают вопросы по непоняткам в программировании. А "довести до ума проект" здесь никто впрягаться не будет. Более адекватное место для такой просьбы - http://arduino.ru/forumy/ishchu-ispolnitelya
PA40K, здесь обычно задают вопросы по непоняткам в программировании. А "довести до ума проект" здесь никто впрягаться не будет. Более адекватное место для такой просьбы - http://arduino.ru/forumy/ishchu-ispolnitelya
Эт я его сюда из "Работы с кнопками ...." отправил. Правда рекомендовал кроме кода, описать, в чем и где проблема возникает.
PA40K, давайте слоника кушать частями. Для начала выкиньте все ваши часы и прочее не относящееся к делу. Стоит задача: Проверить, что нажат концевик А, запустить привод, по достижении нажатия коцевика В, остановить привод. В качестве усложнения, по истечении 20 секунд сделать все в обратную сторону.
ВАЖНО: Предусмотреть в алгоритме ситуацию, когда привод завис между двумя концевиками (не нажат ни один, а привод остановлен). В рабочей системе ситуация весьма вероятная.