Ви не увійшли.
Правильный ответ : НЕТ. Обычный двигатель постоянного тока с инкрементным энкодером в остановленном состоянии не зафиксирован. Нужен еще электромагнитный тормоз.
Какие шутки. Первое что надо сделать сделать класс мотор.
/*
#1 моторы
Мотор правый ENA ->5 (M1_ENA_pin) скорость
IN1 ->4 (M1_IN1_pin) вперед
IN2 ->3 (M1_IN2_pin) назад
Мотор левый ENA ->9 (M2_ENA_pin) скорость
IN1 ->8 (M2_IN1_pin) вперед
IN2 ->7 (M2_IN2_pin) назад
*/
class Cl_Motor {
public:
Cl_Motor(byte _1pin, byte _2pin, byte _3pin, byte _speed); // конструктор
void in_setup(); // функцию засунуть в setup() программы
void FORWARD(); // запустить мотор вперед
void BACKWARD(); // запустить мотор вперед
void STOP();// остановить мотор
private:
byte ENA_pin; // пин ENA
byte N1_pin; // пин N1
byte N2_pin; // пин N2
byte Speed; // скорость мотора
byte Motor;// 1 мотор вращается вперед/2 мотор вращается назад / 0 нет
};
Cl_Motor::Cl_Motor(byte _1pin, byte _2pin, byte _3pin, byte _speed) { // конструктор
ENA_pin = _1pin; // пин ENA
N1_pin = _2pin; // пин N1
N2_pin = _3pin; // пин N2
Speed = _speed; // скорость мотора
}
void Cl_Motor::in_setup() { // функцию засунуть в setup() программы
Motor = 0;
analogWrite (ENA_pin, Speed);
pinMode (N1_pin, OUTPUT);
digitalWrite(N1_pin, 0);
pinMode (N2_pin, OUTPUT);
digitalWrite(N2_pin, 0);
}
void Cl_Motor::FORWARD() { // запустить мотор вперед
if (Motor != 1) {
Motor = 1;
digitalWrite(N1_pin, 1);
digitalWrite(N2_pin, 0);
}
}
void Cl_Motor::BACKWARD() { // запустить мотор назад
if (Motor != 2) {
Motor = 2;
digitalWrite(N1_pin, 1);
digitalWrite(N2_pin, 0);
}
}
void Cl_Motor::STOP() { // остановить мотор
if (Motor != 0) {
Motor = 0;
digitalWrite(N1_pin, 0);
digitalWrite(N2_pin, 0);
}
}
// #1 моторы
Cl_Motor M1(5, 4, 3, 255); // создать мотор 1 (ENA=5,N1=4,N2=3,SPEED=255) 255 максимальная скорость
Cl_Motor M2(9, 8, 7, 255); // создать мотор 2 (ENA=9,N1=8,N2=7,SPEED=255) 255 максимальная скорость
void setup() {
// #1 моторы
M1.in_setup();// инициализировать мотор 1
M2.in_setup();// инициализировать мотор 2
// движение вперед
M1.FORWARD();
M2.FORWARD();
delay (60000); // пауза 1 минута
// движение назад
M1.BACKWARD();
M2.BACKWARD();
delay (60000); // пауза 1 минута
// вращение на месте
M1.FORWARD();
M2.BACKWARD();
delay (60000); // пауза 1 минута
// остановка
M1.STOP();
M2.STOP();
delay (60000); // пауза 1 минута
}
void loop() {
// #1 моторы
}
BasicStepperDriver.ino:12:32: error: BasicStepperDriver.h: No such file or directory
Название файла .ino и файла .h не должны совпадать.
No such file or directory - переводчик в руки- нет файла или директории.
А дальше следсвие.
Самая большая проблема не в этом. Если вы сложили шалаш, это не значит что вы сможете сложить не то что небоскреб, но и двух этажный дом. Рассказывать вам про систему реального времени и millis() ,как машинные часы в системе реального времени. Это долго. Да и мне не зачем.
http://www.youtube.com/watch?v=5y8KmiXT26g
http://sites.google.com/site/nikromsoft/home/programmy/ribs
Блин. Что там вставлять. Да и код все же оформите вставкой , если приводите его на форуме.
/* генератор вспышек
#1 часы
#2 поддержка реле
реле -> 13 (Relay_pin) 1 вкл/ 0 выкл
GND -> GND
вкл с 8:00:00 до 19:00:00 каждые 5 минут на 7 секунд
*/
//#1
uint8_t HOUR;// время
uint8_t MINUTE;
uint8_t SECOND;
//#2
const uint32_t Time_0N = (8 * 60 + 0) * 60 + 0; // время вкл в сек 8:00:00
const uint32_t Time_OFF = (19 * 60 + 0) * 60 + 0; // время выкл в сек 19:00:00
uint32_t Time;// текущее время в секундах
const int Relay_pin = 13 ; // нога светодиода
uint8_t Relay ;
void setup() {
pinMode(Relay_pin, OUTPUT);
digitalWrite(Relay_pin, Relay = 0);
}
void loop() {
static uint32_t MILLIS ;
MILLIS = millis() ;
//#1 непрерывно вычислит. поток 1
// получить точное время
// uint8_t HOUR= ...
// uint8_t MINUTE= ...
// uint8_t SECOND= ...;
//#2 вычислит. поток 2
static uint32_t past_2 = 0 ;
Time=(HOUR * 60 + MINUTE) * 60 + SECOND;// получить время в секундах
if (Relay && MILLIS - past_2 >= 7000 ) {// 7сек длительность вспышеки
digitalWrite(Relay_pin, Relay = 0);
}
if ( Time >=Time_0N && Time<Time_OFF && MILLIS - past_2 >= 5*60*1000) { // каждые 5 минут период вспышек
digitalWrite(Relay_pin, Relay = 1);
past_2 = MILLIS ;
}
}
Разберешься и сможешь применить, то все Ок.
/* генератор вспышек
светодиод -> 13 (Led_pin) 1 горит/ 0 нет
GND -> GND
*/
const int Led_pin = 13 ; // нога светодиода
uint8_t Led ;
void setup() {
pinMode(Led_pin, OUTPUT);
digitalWrite(Led_pin, Led = 0);
}
void loop() {
static uint32_t MILLIS ;
MILLIS = millis() ;
//#1 1000 миллисекунд вычислит. поток 1
static uint32_t past_1 = 0 ;
static uint32_t past1_1 = 0 ;
if (Led && MILLIS - past1_1 >= 2000 ) {// 2000 миллесекунд=2сек длительность вспышеки
digitalWrite(Led_pin, Led = 0);
}
if (MILLIS - past_1 >= 10000) { // 10000 миллесекунд=10сек период вспышек
past_1 = MILLIS ;
digitalWrite(Led_pin, Led = 1);
past1_1 = MILLIS ;
}
}
Если глаза болят ,тогда бросайте и программирование. Потому что форумы и гугл это основные источники информации.
А также вам прийдется собирать свою библиотеку проверенных решений на все случаи жизни.
Выкинь на (цензура) эту книжку.
digitalWrite(HOT, HIGH);
delay(1000);
digitalWrite(HOT, LOW);
Это дибилизм.
Надо как минимум так писать.
digitalWrite(HOT, HIGH);// зажечь светодиод
delay(1000); // подождать 1 секунду что бы наблюдатель увидел
digitalWrite(HOT, LOW);// погасить светодиод
delay(1000);// подождать 1 секунду что бы наблюдатель увидел что светодиод уже не горит
А вот по поводу приведеного кода
#define COLD 2 // так правильно
#define 2 COLD // а вот так нет ;)
Нет . У вас проблемы в схемотехнике. 1 - на батарейку надо дать нагрузку. Хотя бы 1 кОм паралельно батарейке. 2 - бреадбоард тоже не лучший вариант. Там тоже контакты гуляют.
ПС: Из фундаментального. На батарейке не стабильное напряжение. Внутреняя ЭДС, внутренее сопротивление. Нужна какая-то наргузка. А аналоговый вход Ардуины такой нагрузки не дает. Тем более там АЦП одно и оно переключается по аналоговым выходам.
NoName. Ну да произвел обратный инженеринг. Но когда я это сделал, то понял, что тут надо переделывать всю программу, включая и управление станком.
Ну-ну. Учебники они такие. Они до добра не доведут.
/*Тестер для одноэлементных батареек
тестируемая батарейка -> AO;
GND->GND
светодиод зеленый ->2 (led_green_pin) 1 горит 0 нет
GND->GND
светодиод желтый ->4 (led_yellow_pin) 1 горит 0 нет
GND->GND
светодиод красный ->6 (led_red_pin) 1 горит 0 нет
*/
const int battery_pin = A0 ; //нога измеритель батареек
float voltage = 0;
const int led_green_pin = 2 ; //зеленый светодиод "новая"
const int led_yellow_pin = 4 ; //желтый cветодиод "норма"
const int led_red_pin = 6 ; //красный светодиод "старая"
void setup() {
pinMode(led_green_pin, OUTPUT);
pinMode(led_yellow_pin, OUTPUT);
pinMode(led_red_pin, OUTPUT);
}
void loop() {
digitalWrite(led_green_pin, 0);
digitalWrite(led_yellow_pin, 0);
digitalWrite(led_red_pin, 0);
delay(1000);
voltage = analogRead(battery_pin) * 5 / 1023;
if (voltage >= 1.6) digitalWrite(led_green_pin, 1);
if (voltage < 1.6 && voltage > 1.4) digitalWrite(led_yellow_pin, 1);
if (voltage <= 1.4) digitalWrite(led_red_pin, 1);
delay(1000);
}
Вот немного подправил код. Но поймал где-то ошибку. Надо такой код комментировать в каждой стройке. Но автор забил на это видно
/* Программа написана для станка по производству резиной плитки в 2016 году
ДАТЧИКИ:
датчик положения платформы слева -> A2 (sensorY1_pin)
датчик положения платформы центр -> A3 (sensorY2_pin)
датчик положения платформы справа -> A4 (sensorY3_pin)
датчик температуры правой плиты -> A5 (sensorY4_pin)
датчик температуры центральной плиты -> A6 (sensorY5_pin)
датчик температуры левой плиты -> A7 (sensorY6_pin)
датчик левого левого положения аппарели -> 22 (S1_pin) 0 сработал / 1 нет
датчик давления -> 23 (S2_pin) 0 сработал / 1 нет
датчик левого положения лифта -> 24 (S3_pin) 0 сработал / 1 нет
датчик положения всех лифтов внижнем положении -> 25 (S4_pin) 0 сработал / 1 нет
датчик правого положения аппарели -> 26 (S5_pin) 0 сработал / 1 нет
датчик положения ВВЕРХУ СПРАВА -> 27 (S6_pin) 0 сработал / 1 нет
датчик положения КРЫШКИ ВВЕРХУ -> 28 (S7_pin) 0 сработал / 1 нет
датчик положения КРЫШКИ ВНИЗУ -> 29 (S8_pin) 0 сработал / 1 нет
КЛАПАНЫ МОТОРЫ ТЕНЫ:
клапан платформы влево ->30 (A_pin)
клапан платформы вправо ->31 (B_pin)
клапан левого цилиндра ->32 (C_pin)
клапан цилиндра верхней плиты ->33 (D_pin)
клапан цилиндра пресса ->34 (E_pin)
клапан правого цилиндра ->35 (F_pin)
клапан сброса давления ->36 (G_pin)
контактор мотора ->37 (H_pin)
выбор толщины резиновой плитки + ->38 (MOTOR1_pin) в проектировании
выбор толщины резиновой плитки - ->39 (MOTOR2_pin) в проектировании
реле тэна справа 1 ->40 (AL1_pin) в проектировании
реле тэна справа 2 ->41 (AL2_pin) в проектировании
реле тэна центр 1 ->42 (AC1_pin) в проектировании
реле тэна центр 2 ->43 (AC2_pin) в проектировании
реле тэна слева 1 ->44 (AR1_pin) в проектировании
реле тэна слева 2 ->45 (AR2_pin) в проектировании
КНОПКИ УПРАВЛЕНИЯ ЛАМПЫ СИГНАЛИЗАЦИЯ:
лампа пусковой кнопки ->46 (LAMP_pin) в проектировании
сирена окончания цикла ->47 (SIRENA_pin) в проектировании
кнопка АВАРИЙН СТОП ->48 (R_pin) в проектировании
кнопка ПУСК ->49 (R1_pin)
кнопка ПЛИТА ВВЕРХ ->50 (R2_pin)
кнопка ПЛИТА ВНИЗ ->51 (R3_pin)
*/
// ДАТЧИКИ:
const int sensorY1_pin = A2; // датчик положения лифта слева
int sensorY1; // 0 - 1023 потенциометр
const int sensorY2_pin = A3; // датчик положения платформы центр
int sensorY2; // 0 - 1023 потенциометр
const int sensorY3_pin = A4; // датчик положения платформы справа
int sensorY3; // 0 - 1023 потенциометр
const int sensorY4_pin = A5; // датчик температуры правой плиты
int sensorY4; // 0 - 1023
const int sensorY5_pin = A6; // датчик температуры центральной плиты
int sensorY5; // 0 - 1023
const int sensorY6_pin = A7; // датчик температуры левой плиты
int sensorY6; // 0 - 1023
const int S1_pin = 22; // вход сигнала левого положения аппарели
const int S2_pin = 23; // вход сигнала датчика давления
const int S3_pin = 24; // вход сигнала левого положения лифта
const int S4_pin = 25; // вход сигнала положения всех лифтов внижнем положении
const int S5_pin = 26; // вход сигнала правого положения аппарели
const int S6_pin = 27; // датчик положения ВВЕРХУ СПРАВА
const int S7_pin = 28; // вход сигнала датчика положения КРЫШКИ ВВЕРХУ
const int S8_pin = 29; // вход сигнала датчика положения КРЫШКИ ВНИЗУ
// КЛАПАНЫ МОТОРЫ ТЕНЫ:
const int A_pin = 30; // клапан платформы влево 0 вкл / 1 нет
const int B_pin = 31; // клапан платформы вправо 0 вкл / 1 нет
const int C_pin = 32; // клапан левого цилиндра 0 вкл / 1 нет
const int D_pin = 33; // клапан цилиндра верхней плиты 0 вкл / 1 нет
const int E_pin = 34; // клапан цилиндра пресса 0 вкл / 1 нет
const int F_pin = 35; // клапан правого цилиндра 0 вкл / 1 нет
const int G_pin = 36; // клапан сброса давления 0 вкл / 1 нет
const int H_pin = 37; // контактор мотора 0 вкл / 1 нет
const int MOTOR1_pin = 38; // выбор толщины резиновой плитки +
const int MOTOR2_pin = 39; // выбор толщины резиновой плитки -
const int AL1_pin = 40; // реле тэна справа 1
const int AL2_pin = 41; // реле тэна справа 2
const int AC1_pin = 42; // реле тэна центр 1
const int AC2_pin = 43; // реле тэна центр 2
const int AR1_pin = 44; // реле тэна слева 1
const int AR2_pin = 45; // реле тэна слева 2
//КНОПКИ УПРАВЛЕНИЯ ЛАМПЫ СИГНАЛИЗАЦИЯ:
const int LAMP_pin = 46; // лампа пусковой кнопки
const int SIRENA_pin = 47; // сирена окончания цикла
const int R_pin = 48; // кнопка АВАРИЙН СТОП 0 нажата / 1 нет
const int R1_pin = 49; // кнопка ПУСК 0 нажата / 1 нет
const int R2_pin = 50; // кнопка ПЛИТА ВВЕРХ 0 нажата / 1 нет
const int R3_pin = 51; // кнопка ПЛИТА ВНИЗ 0 нажата / 1 нет
unsigned char button_state; // просто вспомогательная переменная
unsigned char button_mem; // этапы программы
void setup() { // -----------------------------------------------------
Serial.begin(9600);
// ДАТЧИКИ:
pinMode(S1_pin, INPUT_PULLUP); // вход сигнала левого положения аппарели
pinMode(S2_pin, INPUT_PULLUP); // вход сигнала датчика давления
pinMode(S3_pin, INPUT_PULLUP); // вход сигнала левого положения лифта
pinMode(S4_pin, INPUT_PULLUP); // вход сигнала положения всех лифтов внижнем положении
pinMode(S5_pin, INPUT_PULLUP); // вход сигнала правого положения аппарели
pinMode(S6_pin, INPUT_PULLUP); // датчик положения ВВЕРХУ СПРАВА
pinMode(S7_pin, INPUT_PULLUP); // вход сигнала датчика положения КРЫШКИ ВВЕРХУ
pinMode(S8_pin, INPUT_PULLUP); // вход сигнала датчика положения КРЫШКИ ВНИЗУ
//КНОПКИ УПРАВЛЕНИЯ ЛАМПЫ СИГНАЛИЗАЦИЯ:
pinMode(LAMP_pin, OUTPUT);
pinMode(SIRENA_pin, OUTPUT);
pinMode(R_pin, INPUT_PULLUP); // подключить кнопку АВАРИЙН СТОП с подтянутым резистором
pinMode(R1_pin, INPUT_PULLUP);// подключить кнопку ПУСК с подтянутым резистором
pinMode(R2_pin, INPUT_PULLUP);// подключить кнопку ПЛИТА ВВЕРХ с подтянутым резистором
pinMode(R3_pin, INPUT_PULLUP);// подключить кнопку ПЛИТА ВНИЗ с подтянутым резистором
// КЛАПАНЫ МОТОРЫ ТЕНЫ:
pinMode(A_pin, OUTPUT);// клапан платформы влево
digitalWrite(A_pin, 1);// откл клапан платформы влево
pinMode(B_pin, OUTPUT);// клапан платформы враво
digitalWrite(B_pin, 1);// откл клапана платформы враво
pinMode(C_pin, OUTPUT);// клапан левого цилиндра
digitalWrite(C_pin, 1);// откл клапана левого цилиндра
pinMode(D_pin, OUTPUT);// клапан цилиндра верхней плиты
digitalWrite(D_pin, 1);// откл клапана цилиндра верхней плиты
pinMode(E_pin, OUTPUT);// клапан цилиндра пресса
digitalWrite(E_pin, 1);// откл цилиндра пресса
pinMode(F_pin, OUTPUT);// клапан правого цилиндра
digitalWrite(F_pin, 1);// откл клапана правого цилиндра
pinMode(G_pin, OUTPUT);// клапан сброса давления
digitalWrite(G_pin, 1);// откл клапана сброса давления
pinMode(H_pin, OUTPUT);// контактор мотора
digitalWrite(H_pin, 1);// откл контактор мотора
pinMode(AL1_pin, OUTPUT);// реле тэна справа 1
pinMode(AL2_pin, OUTPUT);// реле тэна справа 2
pinMode(AC1_pin, OUTPUT);// реле тэна центр 1
pinMode(AC2_pin, OUTPUT);// реле тэна центр 2
pinMode(AR1_pin, OUTPUT);// реле тэна слева 1
pinMode(AR2_pin, OUTPUT);// реле тэна слева 2
pinMode(MOTOR1_pin, OUTPUT);// выбор толщины резиновой плитки +
pinMode(MOTOR2_pin, OUTPUT);// выбор толщины резиновой плитки -
}
void loop() { // -----------------------------------------------------
sensorY1 = analogRead(sensorY1_pin); // РЕЗИСТОР положения лифта слева
sensorY2 = analogRead(sensorY2_pin); // датчик положения платформы центр
sensorY3 = analogRead(sensorY3_pin); // датчик положения платформы справа
sensorY4 = analogRead(sensorY4_pin); // датчик температуры правой плиты
sensorY5 = analogRead(sensorY5_pin); // датчик температуры центральной плиты
sensorY6 = analogRead(sensorY6_pin); // датчик температуры левой плиты
// ЗДЕСЬ УПРАВЛЕНИЕ ЦЕНТРАЛЬНОЙ КРЫШКОЙ
button_state = digitalRead(R2_pin);
if (! digitalRead(R2_pin)) { // если кнопка ПЛИТА ВВЕРХ нажата
digitalWrite(D_pin, 0); // вкл цилиндра верхней плиты
digitalWrite(H_pin, 0); // вкл контактор мотора
while (!digitalRead(R2_pin)) {}// ждать пока кнопка ПЛИТА ВВЕРХ нажата
}
button_state = digitalRead(S7_pin);
if (! digitalRead(S7_pin) ) {
digitalWrite(G_pin, 1);// откл клапана сброса давления
digitalWrite(D_pin, 1);// откл цилиндра верхней плиты
button_state = digitalRead(R3_pin);
if (! digitalRead(R3_pin) ) { // если кнопку ПЛИТА ВНИЗ нажата
digitalWrite(G_pin, 0); // вкл клапана сброса давления
digitalWrite(H_pin, 0);// вкл контактор мотора
}
}
button_state = digitalRead(S8_pin);
if (! digitalRead(S8_pin) ) { // если сработал датчик положения КРЫШКИ ВНИЗУ
digitalWrite(H_pin, 1);// откл контактор мотора
digitalWrite(D_pin, 1);// откл цилиндра верхней плиты
while (! digitalRead(R3_pin)) { // ждать пока кнопка ПЛИТА ВНИЗ нажата
//*********************************************************************************************************************************//
// ТУТ НАЧАЛО РАБОТЫ
button_state = digitalRead(R1_pin); // если кнопка ПУСК нажата
if ((button_mem == 0) && !digitalRead(R1_pin) && !button_state && !digitalRead(S4_pin) && digitalRead(S7_pin) && !digitalRead(S8_pin)) { // условие выполняется если датчик нижного положения всех лифтов активирован
digitalWrite(A_pin, 0); // вкл клапан платформы влево
digitalWrite(H_pin, 0); // вкл контактор мотора
button_mem = 1; //запомнить состояние реле
while (!digitalRead(R1_pin) ) { } // ждать пока кнопка ПУСК нажата
}
else {
button_state = digitalRead(S1_pin); //когда платформа подошла к датчику положения платформы слева
if ((button_mem == 1) && !digitalRead(S1_pin) && !button_state && digitalRead(S7_pin) && ! digitalRead(S8_pin) ) { // и при таких условиях памяти
digitalWrite(A_pin, 1); // отк клапан платформы влево
digitalWrite(E_pin, 0); // вкл цилиндра пресса
button_mem = 2; //запомнить состояние датчик положения платформы слева
while (! digitalRead(S1_pin)) {}
}
else {
button_state = digitalRead(S2_pin); //ДАТЧИК ДАВЛЕНИЯ
if ((button_mem == 2) && !digitalRead(S2_pin) && button_state ) { // сработал датчик давления центральной платформы
digitalWrite(C_pin, 0);// вкл левого цилиндра
digitalWrite(E_pin, 1);// откл цилиндра пресса
button_mem = 3; //запомнить состояние реле
while (! digitalRead(S2_pin)) {
/**********************************ЗДЕСЬ НУЖНО УСТАНОВИТЬ ТАЙМЕР КОТОРЫЙ ОПУСТИТ ВНИЗ ЦЕНТРАЛЬНУЮ ПЛИТУ***********************************************/
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*И КАК ТОЛЬКО ТАЙМЕР ОТСЧИТАЕТ , НАПРИМЕ 5 МИНУТ,
ЦЕНТРАЛЬНАЯ ПЛАТФОРМА ДОЛЖНА ПОЙТИ ВНИЗ
digitalWrite(E_pin, 0);// вкл цилиндра пресса
digitalWrite(G_pin, 0);// вкл клапана сброса давления
АКТИВИРУЕТСЯ ДАТЧИК digitalRead(S4_pin) == 0 И ПОСЛЕ АКТИВАЦИИ
digitalWrite(E_pin, 1);// откл цилиндра пресса
digitalWrite(G_pin, 1);// откл клапана сброса давления
*/
/**************************************************************************************************************/
}
}
else {
button_state = digitalRead(S3_pin); //ДАТЧИК ПОЛОЖЕНИЯ ВВЕРХУ СЛЕВА
if (button_mem == 3 && !digitalRead(S3_pin) && !button_state && digitalRead(S7_pin) && ! digitalRead(S8_pin)) {
digitalWrite(C_pin, 1);// откл левого цилиндра
digitalWrite(H_pin, 1);// откл контактор мотора
button_mem = 4; //запомнить состояние реле
while (! digitalRead(S3_pin)) {} // ТУТ ЖДЕМ НАЖАТИЯ КНОПКИ ПОКА НЕ ВЫГРУЗЯТ ПЛИТКУ
}
}
else {
button_state = digitalRead(R1_pin);// если кнопка ПУСК нажата
if ((button_mem == 4) && !digitalRead(R1_pin) && !button_state && digitalRead(S7_pin) && ! digitalRead(S8_pin)) {
digitalWrite(C_pin, 0); // вкл левого цилиндра
digitalWrite(G_pin, 0);// вкл клапана сброса давления
button_mem = 5; //запомнить состояние датчик положения платформы слева
while (! digitalRead(R1_pin)) {} // ждать пока кнопка ПУСК нажата
}
else {
button_state = analogRead(sensorY1_pin); //прочитать состояние РЕОСТАТ СЛЕВА
sensorY1 = analogRead(sensorY1_pin);//прочитать состояние
if (analogRead(sensorY1_pin) < 50 && digitalRead(S7_pin) && ! digitalRead(S8_pin)) { // СРАБОТАЛ РЕОСТАТ ЗНАЧЕНИЕ "50" УСЛОВНОЕ ОНО ДОЛЖНО ПРОГРАММИРОВАТЬСЯ ВМЕСТЕ С УСТАНОВКОЙ РАЗМЕРА ПЛИТКИ
// В ДАЛЬНЕЙШЕМ ВМЕСТО 50 ДОЛЖНА СТОЯТЬ ПЕРЕМЕННАЯ КОТОРАЯ БУДЕТ ВВОДИТСЯ И КОРРЕКТИРОВАТЬСЯ С ПРИЛОЖЕНИЯ
digitalWrite(C_pin, 1);// откл левого цилиндра
digitalWrite(G_pin, 1);// откл клапана сброса давления
}
else {
// ПОСЛЕ ЗАГРУЗКИ КРОШКИ НАЖИМАЕМ ОПЯТЬ КНОПКУ ПУСК
button_state = digitalRead(R1_pin); // если кнопка ПУСК нажата
if (button_mem == 5 && !digitalRead(R1_pin) && !button_state && digitalRead(S7_pin) && !digitalRead(S8_pin)) {
digitalWrite(C_pin, 0);// вкл левого цилиндра
digitalWrite(G_pin, 0);// вкл клапана сброса давления
button_mem = 6; //запомнить состояние датчик положения платформы слева
while (! digitalRead(R1_pin)) {} // ждать пока кнопка ПУСК нажата
}
else {
button_state = digitalRead(S4_pin ); //ДАТЧИК НИЖНЕГО ПЛОЖЕНИЯ ВСЕХ ЛИФТОВ
if (button_mem == 6 && !digitalRead(S4_pin) && ! button_state && digitalRead(S7_pin) && ! digitalRead(S8_pin)) {
// ТУТ НАДО ПОСТАВИТЬ ЕЩЕ УСЛОВИЕ ЭТО ТАЙМЕР ПОКА ОН НЕ ОТСЧИТАЕТ НАПРИМЕР 5 МИНУТ И ЦЕНТРАЛЬНАЯ ПЛАТФОРМА НЕ ОПУСТИТСЯ ВНИЗ ПЛАТФОРМА НЕ ДОЛЖНА ПОЕХАТЬ ВПРАВО
digitalWrite(C_pin, 1);// откл левого цилиндра
digitalWrite(G_pin, 1);// откл клапана сброса давления
digitalWrite(H_pin, 0);// вкл контактор мотора
digitalWrite(B_pin, 0);// вкл платформы враво
button_mem = 7; //запомнить состояние
while (! digitalRead(S4_pin)) {} // пока датчик не покажет все лифты в нижнем положении
}
else {
button_state = digitalRead(S5_pin); //ДАТЧИК ПОЛОЖЕНИЯ ПЛАТФОРМЫ СПРАВА
delay(10); // пауза для проверки дребезга
if ((button_mem == 7) && !digitalRead(S5_pin) && !button_state && digitalRead(S7_pin) && !digitalRead(S8_pin)) {
digitalWrite(B_pin, 1);// откл клапана платформы враво
digitalWrite(E_pin, 0);// вкл клапана цилиндра пресса
button_mem = 8; //запомнить состояние датчик положения платформы слева
while (! digitalRead(S5_pin)) {} // Весь цикл только в обратном порядке
}
else {
button_state = digitalRead(S2_pin); //ДАТЧИК ДАВЛЕНИЯ
if ((button_mem == 8) && !digitalRead(S2_pin) && !button_state && digitalRead(S7_pin) && !digitalRead(S8_pin)) {
digitalWrite(F_pin, 0);// вкл клапана правого цилиндра
digitalWrite(E_pin, 1);// откл клапана цилиндра пресса
button_mem = 9; //запомнить состояние реле
while (! digitalRead(S2_pin)) {}// пока датчик ДАВЛЕНИЯ не сработает
}
else {
button_state = digitalRead(S6_pin); //ДАТЧИК ПОЛОЖЕНИЯ ВВЕРХУ СПРАВА
if ((button_mem == 9) && !digitalRead(S6_pin) && !button_state && digitalRead(S7_pin) && !digitalRead(S8_pin)) {
digitalWrite(F_pin, 1);// откл правого цилиндра
digitalWrite(H_pin, 1);// откл контактор мотора
button_mem = 10; //запомнить состояние реле
while (! digitalRead(S6_pin)) {} // пока датчик ВВЕРХ СПРАВА не сработает
else {
button_state = digitalRead(R1_pin);// если кнопка ПУСК нажата
if ((button_mem == 10) && !digitalRead(R1_pin) && !button_state && digitalRead(S7_pin) && !digitalRead(S8_pin)) {
digitalWrite(F_pin, 0);// вкл правого цилиндра
digitalWrite(G_pin, 0);// вкл клапана сброса давления
button_mem = 11; //запомнить состояние датчик положения платформы слева
while (! digitalRead(R1_pin)) {}// ждать пока кнопка ПУСК нажата
}
}
else {
button_state = analogRead(sensorY3_pin); //прочитать состояние РЕОСТАТ СЛЕВА
sensorY1 = analogRead(sensorY3_pin);//прочитать состояние
if (analogRead(sensorY3_pin) < 50 && digitalRead(S7_pin) && !digitalRead(S8_pin)) { // В ДАЛЬНЕЙШЕМ ВМЕСТО 50 ДОЛЖНА СТОЯТЬ ПЕРЕМЕННАЯ КОТОРАЯ БУДЕТ ВВОДИТСЯ И КОРРЕКТИРОВАТЬСЯ С ПРИЛОЖЕНИЯ
digitalWrite(F_pin, 1);// откл правого цилиндра
digitalWrite(G_pin, 1);// откл клапана сброса давления
}
button_state = digitalRead(R1_pin);// если кнопка ПУСК нажата
if ((button_mem == 11) && !digitalRead(R1_pin) && !button_state && digitalRead(S7_pin) && !digitalRead(S8_pin)) {
digitalWrite(F_pin, 0);// вкл правого цилиндра
digitalWrite(G_pin, 0);// вкл клапана сброса давления
button_mem = 12; //запомнить состояние датчик положения платформы слева
while (! digitalRead(R1_pin)) {} // ждать пока кнопка ПУСК нажата
}
button_state = digitalRead(S4_pin); //ДАТЧИК НИЖНЕГО ПЛОЖЕНИЯ ВСЕХ ЛИФТОВ
if ((button_mem == 12) && !digitalRead(S4_pin) && !button_state && digitalRead(S7_pin) && !digitalRead(S8_pin)) {
digitalWrite(F_pin, 1);// откл правого цилиндра
digitalWrite(G_pin, 1);// откл клапана сброса давления
digitalWrite(H_pin, 0);// вкл контактор мотора
digitalWrite(A_pin, 0);// вкл клапан платформы влево
button_mem = 13; //запомнить состояние
while (!digitalRead(S4_pin)) {} // пока датчик не покажет все лифты в нижнем положении
}
button_state = digitalRead(S1_pin); //датчик положения платформы слева
if ((button_mem == 13) && ! digitalRead(S1_pin) && ! button_state && digitalRead(S7_pin) && !digitalRead(S8_pin)) {
digitalWrite(A_pin, 1);// откл клапан платформы влево
digitalWrite(E_pin, 0);// вкл цилиндра пресса
button_mem = 2; //запомнить состояние датчик положения платформы слева
while (! digitalRead(S1_pin)) {} // пока датчик не покажет аппарель слева
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
В том что выложили нет ошибки. А в том что сюда не попало могут быть русские буквы.
Вариант на разрыв.
/* *** места где произвел изменения
#1 геркон -> A2 (gercon_pin) 1 дверь открыта / 0 закрыта ***
тепловая завеса -> 13 (platten_pin) 1 тепловая завеса вкл/ 0 откл
*/
const int gercon_pin = A2;
uint8_t gercon, gercon_old; // новое и старое состояние геркона 0 откр/ 1закр
const int platten_pin = 13;
uint8_t platten; // состояние тепловой завесы 1 вкл/ 0 откр
uint8_t platten_ON = 0; //
uint8_t platten_OFF = 0; //
void setup() {
//#1
pinMode(gercon_pin, INPUT_PULLUP);
gercon = ! digitalRead(gercon_pin); // ***
pinMode(platten_pin, OUTPUT); //инициализировать
digitalWrite(platten_pin, platten = 0); // отключить тепловую занавесь
}
void loop() {
static uint32_t MILLIS ;
MILLIS = millis() ;
//#1
static uint32_t fut1 = 0 ;
static uint32_t future1 = 0 ;
if (platten_ON && MILLIS >= fut1) {
digitalWrite(platten_pin, platten = 1);; // включить тепловую занавесь
platten_ON=0;
}
if (platten_OFF && MILLIS >= fut1) {
digitalWrite(platten_pin, platten = 0);; // отключить тепловую занавесь
platten_OFF=0;
}
if (MILLIS >= future1) {
future1 = MILLIS + 200 ;
gercon_old = gercon;
gercon = ! digitalRead(gercon_pin); // ***
if (gercon_old && !gercon && !platten) {
fut1 = MILLIS + 15000; // 15000 милисекунд
platten_ON = 1;
platten_OFF=0;
}
if (!gercon_old && gercon && platten) {
fut1 = MILLIS + 30000; // 30000 милисекунд
platten_OFF = 1;
platten_ON=0;
}
}
}
Во-во. А потом отображение этих аварий на экране. Так что надо создавать мини ОС для станка, а потом уже городить. А то при каждом затыке надо будет перешивать программу. А все нюансы работы кода всегда забываются.
Спасибо за "пиво".
Помимо нормальной работы у станка еще большая куча аварийных состояний. А то что вы так бодренько накатали скетч, то его можно сразу ..
Объяснять как работает код долго. Залейте и погоняйте его.
/*
#1 геркон -> A2 (gercon_pin) 0 дверь открыта / 1 закрыта
тепловая завеса -> 13 (platten_pin) 1 тепловая завеса вкл/ 0 откл
*/
const int gercon_pin = A2;
uint8_t gercon, gercon_old; // новое и старое состояние геркона 0 откр/ 1закр
const int platten_pin = 13;
uint8_t platten; // состояние тепловой завесы 1 вкл/ 0 откр
uint8_t platten_ON = 0; //
uint8_t platten_OFF = 0; //
void setup() {
//#1
pinMode(gercon_pin, INPUT_PULLUP);
gercon = digitalRead(gercon_pin);
pinMode(platten_pin, OUTPUT); //инициализировать
digitalWrite(platten_pin, platten = 0); // отключить тепловую занавесь
}
void loop() {
static uint32_t MILLIS ;
MILLIS = millis() ;
//#1
static uint32_t fut1 = 0 ;
static uint32_t future1 = 0 ;
if (platten_ON && MILLIS >= fut1) {
digitalWrite(platten_pin, platten = 1);; // включить тепловую занавесь
platten_ON=0;
}
if (platten_OFF && MILLIS >= fut1) {
digitalWrite(platten_pin, platten = 0);; // отключить тепловую занавесь
platten_OFF=0;
}
if (MILLIS >= future1) {
future1 = MILLIS + 200 ;
gercon_old = gercon;
gercon = digitalRead(gercon_pin);
if (gercon_old && !gercon && !platten) {
fut1 = MILLIS + 15000; // 15000 милисекунд
platten_ON = 1;
platten_OFF=0;
}
if (!gercon_old && gercon && platten) {
fut1 = MILLIS + 30000; // 30000 милисекунд
platten_OFF = 1;
platten_ON=0;
}
}
}
Да и еще замечание "=" это присвоение а=в+с; А вот "==" это уже условие.if (a==b+c){};
и еще if ((x = y) = (y>3)) это бред. Скорее всего так if(x==y && y>3)
//#1 энкодер
const int reset_pin=6; // кнопка сброса показаний 0 нажата /1 нет
volatile int place_enc; // количество импульсов
const int enc_A_pin = 2;// нога на энкодер фазы A прерывание 0
const int enc_B_pin = 3; // нога на энкоде фазы B.
void scan_enc1() { // функция работающая по прерыванию 0 подсчет импульсов
if(digitalRead(enc_B_pin))place_enc++;
else place_enc--;
}
void scan_enc2() { // функция работающая по прерыванию 0 подсчет импульсов
if(digitalRead(enc_B_pin))place_enc--;
else place_enc++;
}
//#2 экран
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
void setup(){
//#1 энкодер
pinMode(reset_pin, INPUT_PULLUP); // настройка кнопки сбоса показаний
pinMode(enc_A_pin, INPUT);
pinMode(enc_B_pin, INPUT);
attachInterrupt(0, scan_enc1, FALLING); //прерывание INT0. 1>0
attachInterrupt(0, scan_enc2, RISING); //прерывание INT0. 0>1
//#2 экран
lcd.begin(16, 2);
}
void loop(){
//#1 энкодер
if (!digitalRead(reset_pin)) place_enc = 0; //сброс счетчика импульсов
//#2 экран обновление раз в 1 секунда
static uint32_t future2 = 0 ;
if (millis() >= future2) {
future2 = millis() + 1000 ;
lcd.setCursor(0,0) ; //курсор.
lcd.print("Place=") ; //выводит текст.
lcd.print(place_enc) ; //выводит значение переменной P.
lcd.print(" ") ; //выводит выводит пробел.
}
}
разберем это attachInterrupt(0, scan_enc, FALLING);
Консультируемся по этому. http://arduino.ru/Reference/AttachInterrupt
0 это interrupt: номер прерывания то есть на ноге 2
scan_enc это обработчик прерываний.
FALLING прерывание вызывается только при смене значения на порту с HIGH на LOW
Итого по перепаду на выводе 2 с 1 в 0 вызывается программа прерывания scan_enc. А так как у энкодера 2 вывода сдвинутые по фазе . То второй вывод и есть вывод направления в + или в -. И да если идет вибрация может быть ошибки. Программно их не устранить.
Конечно можно написать 2 функцию attachInterrupt(0, scan_enc2, RISING); Но где гарантия что во время одного обработчика прерываний не вызовут другой.
if(digitalRead(enc_B_pin)) аналог этого if(digitalRead(enc_B_pin)==1) . То есть спрашивает состояние на другом выводе от прерывания.
void scan_enc2() { // функция работающая по прерыванию 0 подсчет импульсов
if(digitalRead(enc_B_pin))place_enc--;
else place_enc++;
}
вызывается прерыванием attachInterrupt(0, scan_enc2, RISING);
goodspeedmen А чем вам это не подошло?
//#1 энкодер
const int reset_pin=6; // кнопка сброса показаний 0 нажата /1 нет
volatile int place_enc; // количество импульсов
const int enc_A_pin = 2;// нога на энкодер фазы A прерывание 0
const int enc_B_pin = 3; // нога на энкоде фазы B.
void scan_enc() { // функция работающая по прерыванию 0 подсчет импульсов
if(digitalRead(enc_B_pin))place_enc++;
else place_enc--;
}
//#2 экран
#include <Wire.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
void setup(){
//#1 энкодер
pinMode(reset_pin, INPUT_PULLUP); // настройка кнопки сбоса показаний
pinMode(enc_A_pin, INPUT);
pinMode(enc_B_pin, INPUT);
attachInterrupt(0, scan_enc, FALLING); //прерывание INT0. 1>0
//#2 экран
lcd.begin(16, 2);
}
void loop(){
//#1 энкодер
if (!digitalRead(reset_pin)) place_enc = 0; //сброс счетчика импульсов
//#2 экран обновление раз в 0,5 секунды
static uint32_t future2 = 0 ;
if (millis() >= future2) {
future2 = millis() + 500 ;
lcd.setCursor(0,0) ; //курсор.
lcd.print("Place=") ; //выводит текст.
lcd.print(place_enc) ; //выводит значение переменной P.
lcd.print(" ") ; //выводит выводит пробел.
}
}
Я не скажу ничего нового. Я просто предлогаю метод решения этого задания. Во первых мы можем разделить весь сигнал на участки.
1 ждать сигнал с вывода; 2 прямой участок (уровень A2 и длительностью T2); 3 косой участок ( от уровня A2 до A4 длительностью Т3) 4 прямой участок (уровень A4 и длительностью T4); 5 косой участок ( от уровня A4 до 0 длительностью Т5) . Причем если сигнал на входе будет 1 то перейти на участок 2.
ПС: Это всем ясно. От этого алгоритма и будем плясать.
у меня Leonardo пока пишет так
C:\Users\Администратор\Desktop\sketch_sep23a\sketch_sep23a.ino:13:19: fatal error: Timer.h: No such file or directory
Пишет что надо поставить библиотеку в систему. И кроме вас никто не сможет это сделать. Потому что надо руками.
Эскиз ->include library -> menage libraries ну и там ищи .