Помогите довести до ума.
- Войдите на сайт для отправки комментариев
Вс, 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 секунд сделать все в обратную сторону.
ВАЖНО: Предусмотреть в алгоритме ситуацию, когда привод завис между двумя концевиками (не нажат ни один, а привод остановлен). В рабочей системе ситуация весьма вероятная.