Нужна помощь
- Войдите на сайт для отправки комментариев
Чт, 17/03/2016 - 21:45
Задача такая. Есть три вала, которые вращаются с одинаковой скоростью, примерно 1 об. за 4 с. Нужно разработать программу на базе Arduino, которая б следила за этими валами, и если хоть один из них остановился, то подала сигнал. Сигнал будет сниматься индукционными датчиками, лог 0 за 4 сек. Можете мне помочь?
что за датчики, ссылка есть на них ?
http://www.delexgroup.ru/catalog/datchiki/beskontakt_vykl/lm08/
http://www.delexgroup.ru/catalog/datchiki/beskontakt_vykl/lm08/
они от 6 В. Мой мыл ydom cобaкa mail.ru пишите, сделаем.
Спасибо большое)
Правильно ли я понял, что если метка прошла и вал остановился, сигнал об остановке появится только через 4 сек? Это не критично, ждать столько времени?
Все правельно, не критично )
Если за 5 сек нет срабатываний от датчиков, мерзко орет пьезодинамик, мигает внешний аварийный индикатор и светодиод на плате. А шобы сразу заметили :)
#define SENSOR1 2 // пин для подключения индуктивного датчика #define SENSOR2 3 // датчики подключать через резистор 470 Ом #define SENSOR3 4 #define SENSOR4 5 #define ALARM_LAMP 8 // световая индикация аварии #define BUZZER 9 // звуковая индикация аварии #define CHECK_TIME 5000 // интервал проверки датчиков, мсек #define BEEP_INTERVAL 500 // частота включения сирены, мсек #define FLASH_INTERVAL 250 // частота включения аварийной лампы, мсек /* Питание платы и датчиков от одного блока питания на 12В 2А. Пример подключения световой сигнализации (12 В лампы или светодиодной ленты): pighixxx.com/PNG/158.png Пример подключения пищалки: pighixxx.com/PNG/182.png chipdip.ru/product/hpa24ax/ chipdip.ru/product0/9000208302/ */ enum {OK, ALARM} Status; // возможные состояния системы void setup() { pinMode(SENSOR1, INPUT_PULLUP); pinMode(SENSOR2, INPUT_PULLUP); pinMode(SENSOR3, INPUT_PULLUP); pinMode(SENSOR4, INPUT_PULLUP); pinMode(ALARM_LAMP, OUTPUT); pinMode(BUZZER, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); } void loop() { checkSensors(); stateManager(); } void checkSensors() { static unsigned long timeout; static unsigned int shaftCount; // локальная переменная-счетчик // исходим из того, что датчик выдает "0" в состоянии покоя и "1" при срабатывании // при вращении вала датчик должен выдать хотя бы один импульс "1" за 5 сек, иначе тревога if(!digitalRead(SENSOR1) || !digitalRead(SENSOR2) || !digitalRead(SENSOR3) || !digitalRead(SENSOR4)) shaftCount++; // записываем импульсы в счетчик if(millis() - timeout > CHECK_TIME) // проверка счетчика раз в 5 сек { Status = shaftCount > 0 ? OK : ALARM; shaftCount = 0; // сбрасываем счетчик каждые 5 сек timeout = millis(); } } void stateManager() { switch(Status) { case OK: { digitalWrite(ALARM_LAMP, LOW); digitalWrite(LED_BUILTIN, LOW); digitalWrite(BUZZER, LOW); break; } case ALARM: { siren(); // мигаем flash(); // кричим break; } default: { digitalWrite(ALARM_LAMP, HIGH); digitalWrite(LED_BUILTIN, HIGH); digitalWrite(BUZZER, LOW); break; } } } void siren() { static unsigned long beepTime; if(millis() - beepTime > BEEP_INTERVAL) { digitalWrite(BUZZER, !digitalRead(BUZZER)); beepTime = millis(); } } void flash() { static unsigned long flashTime; if(millis() - flashTime > FLASH_INTERVAL) { digitalWrite(ALARM_LAMP, !digitalRead(ALARM_LAMP)); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); flashTime = millis(); } }Стоимость оцени сам и скинь на карту Сбербанка или мобильный.
Спасибо большое!!) Дайте свои реквизиты))
Небольшие правки алгоритма
/* Есть три вала, которые вращаются с одинаковой скоростью, примерно 1 об. за 4 с. Нужно разработать программу на базе Arduino, которая б следила за этими валами, и если хоть один из них остановился, то подала сигнал. Сигнал будет сниматься индукционными датчиками, лог 0 за 4 сек. */ #define SENSOR1 2 // пин для подключения индуктивного датчика #define SENSOR2 3 // датчики подключать к пину через резистор 470 Ом #define SENSOR3 4 #define ALARM_LAMP 8 // световая индикация аварии #define BUZZER 9 // звуковая индикация аварии #define CHECK_TIME 5000 // интервал проверки датчиков, мсек #define BEEP_INTERVAL 500 // частота включения сирены, мсек #define FLASH_INTERVAL 250 // частота включения аварийной лампы, мсек /* Питание платы и датчиков от одного блока питания на 12В 2А. Пример подключения световой сигнализации (12 В лампы или светодиодной ленты): pighixxx.com/PNG/158.png Пример подключения пищалки: pighixxx.com/PNG/182.png chipdip.ru/product/hpa24ax/ chipdip.ru/product0/9000208302/ */ enum { OK, ALARM} Status; // возможные состояния системы void setup() { pinMode(SENSOR1, INPUT_PULLUP); pinMode(SENSOR2, INPUT_PULLUP); pinMode(SENSOR3, INPUT_PULLUP); pinMode(ALARM_LAMP, OUTPUT); pinMode(BUZZER, OUTPUT); pinMode(LED_BUILTIN, OUTPUT); } void loop() { checkSensors(); stateManager(); } void checkSensors() { static unsigned long timeout; static unsigned int count1; // счетчик импульсов вала 1 static unsigned int count2; static unsigned int count3; // исходим из того, что датчик выдает "0" в состоянии покоя и "1" при срабатывании // при вращении вала датчик должен выдать хотя бы один импульс "1" за 5 сек, иначе тревога count1 = !digitalRead(SENSOR1); // записываем импульсы в счетчик каждого вала count2 = !digitalRead(SENSOR2); count3 = !digitalRead(SENSOR3); if(millis() - timeout > CHECK_TIME) // проверка счетчика раз в 5 сек { if(count1 == 0 || count2 == 0 || count3 == 0) Status = ALARM; else Status = OK; count1 = 0; // сбрасываем счетчики каждые 5 сек count2 = 0; count3 = 0; timeout = millis(); } } void stateManager() { switch(Status) { case OK: { digitalWrite(ALARM_LAMP, LOW); digitalWrite(LED_BUILTIN, LOW); digitalWrite(BUZZER, LOW); break; } case ALARM: { siren(); flash(); break; } default: { digitalWrite(ALARM_LAMP, HIGH); digitalWrite(LED_BUILTIN, HIGH); digitalWrite(BUZZER, LOW); break; } } } void siren() { static unsigned long beepTime; if(millis() - beepTime > BEEP_INTERVAL) { digitalWrite(BUZZER, !digitalRead(BUZZER)); beepTime = millis(); } } void flash() { static unsigned long flashTime; if(millis() - flashTime > FLASH_INTERVAL) { digitalWrite(ALARM_LAMP, !digitalRead(ALARM_LAMP)); digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); flashTime = millis(); } }Огромное Спасибо, я только начал тестировать))