Доброго времени суток! Тут на работе делаем сами один станок и я решил сам сделать автоматику. Допустим, объект проходит через систему датчиков и должны происходить определенные действия. Нажали кнопку пуск и включился первый мотор. Сработал датчик 1 и первый мотор выключился, и включился его тормоз. Нажали кнопку пуск вторично...тормоз отключился и включился мотор первый... Далее следующие датчики и отклики на них Вот скетч: int switchPin1 = 8; int ledPin1 = 11; int switchPin2 = 10; int ledPin2 = 13; int ledPin3 = 7; boolean lastButton = LOW; boolean currentButton = LOW; int ledLevel = 0; int ledLevel1 = 0; void setup() { pinMode(switchPin1, INPUT); pinMode(ledPin1, OUTPUT); pinMode(switchPin2, INPUT); pinMode(ledPin2, OUTPUT); pinMode(ledPin3, OUTPUT); } boolean debounce(boolean last) { boolean current = digitalRead(switchPin1); if (last != current) { delay(5); current = digitalRead(switchPin1); } return current; } void loop() { { digitalWrite (ledPin1,LOW); digitalWrite (ledPin2,LOW); digitalWrite (ledPin3,LOW); } currentButton = debounce(lastButton); if (lastButton == LOW && currentButton == HIGH) { ledLevel = ledLevel + 1; } lastButton = currentButton; if (ledLevel > 2) ledLevel = 0; if (ledLevel == 1) { digitalWrite (ledPin1,HIGH); digitalWrite (ledPin2,LOW); digitalWrite (ledPin3,LOW); } if (digitalRead(switchPin2) == HIGH) { digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, LOW); } if (ledLevel == 2) { digitalWrite (ledPin1,HIGH); digitalWrite (ledPin2,LOW); digitalWrite (ledPin3,HIGH); } } Часть: if (digitalRead(switchPin2) == HIGH) { digitalWrite(ledPin1, LOW); digitalWrite(ledPin2, HIGH); digitalWrite(ledPin3, LOW); } работает так...если кнопка2 нажата то и светодиод горит...остальное работает как надо Заранее извиняюсь за глупые вопросы ))
хорошо ))) сделать нужно следуешее: Нажали кнопку "Пуск"...вкличился 1-й мотор...сработал датчик 1-й, мотор отключился...включился его тормоз...нажали кнопку "Пуск" вторично...отключился тормоз, включился мотор1 и мотор 2...это для начала )))
Нарисуйте конечный автомат и все само разложится по полочкам. Подробно в вашем коде еще не разбирался, но за могу сразу сказать одно - за деталями реализации теряется смысл действий. Комментарии бы не помешали.
последовательность такая...нажали первую кнопку- включили первый двигатель...сработал концевик1 -двигатель 1 выключили и включили его тормоз...ждем повторного нажатия клавиши "пуск" (первая кнопка"...отключили тормоз и включили двигатель1 и двигатель2...ну далее я наверное уже сам смогу
Суть вот в чем: у системы есть N состояний, одно из них начальное и одно конечное; находясь в определенном состоянии система реагирует на некоторые воздействия и, совершая некоторое действие, соответствующее только этой комбинации {текущее состояние, воздействие} переходит из одного состояния в другое. В программе это реализуется следующим образом: Код (Text): const int STATE_INITIAL = 0; const int STATE_RUNNING = 1; const int STATE_STOPPED = 2; const int STATE_FINAL = 3; int state = STATE_INITIAL; void loop() { switch (state) { case STATE_INITIAL: { if (buttonPressed(BUTTON_START)) { startMotor(); state = STATE_RUNNING; } break; } case STATE_RUNNING: { if (buttonPressed(BUTTON_STOP)) { stopMotor(); state = STATE_STOPPED; } break; } case STATE_STOPPED: { if (buttonPressed(BUTTON_START)) { startMotor(); state = STATE_STOPPED; } else if (buttonPressed(BUTTON_OFF)) { state = STATE_FINAL; } break; } case STATE_FINAL: { break; } } }
Программа должна быть понятной с первого взгляда и читаться как художественное произведение Пусть имена переменных, констант, функций говорят сами за себя, не нужно безликих pinLed1,2,3,pin125 и т.п.
Спасибо Вам огрмное! Все работает идеально. Если позволите, то еще один вопрос))) Как приостановить выполнение всего цикла прграммы (активные двигатели должны быть выключены) при срабатывании (кнопка "пауза" скажем) и возобновить её (вернуть тсходное состояние двигателей) при срабатывании другой кнопки? Я смотрел апаратные прерывания, но к сожалению там не возможно что-то считывать.
Добавляете состояние STATE_PAUSED, вход в которое возможен из какого-либо другого состояния, например STATE_RUNNING, по нажатию кнопки "Pause", возврат по этому же событию в состояние, из которого произошел переход в STATE_PAUSED. Эмм... ОК, сейчас накидаю кусок кода в пример. Код (Text): void save(MachineState& currentState) { // здесь запоминаем в структуру MachineState что где крутилось } void halt(void) { // вырубаем все что есть } void resume(const MachineState& savedState) { // восстанавливаемся из структуры MachineState // и запускаем все как было раньше } MachineState motors; int resume_state = STATE_PAUSED; switch (state) { // ... здесь какие-то другие состояния ... // case STATE_RUNNING: { if (buttonPressed(BUTTON_STOP)) { stopMotor(); state = STATE_STOPPED; } if (buttonPressed(BUTTON_PAUSE)) { save(motors); halt(); resume_state = state; state = STATE_PAUSED; } break; } case STATE_PAUSED: { if (buttonPressed(BUTTON_PAUSE)) { resume(motors); state = resume_state; } break; } // ... здесь тоже какие-то другие состояния ... // }