#76 Re: Програмування Arduino » Необходима помощь в создании скетча » 2017-01-15 21:33:21

Правильный ответ : НЕТ. Обычный двигатель постоянного тока с инкрементным энкодером в остановленном состоянии не зафиксирован. Нужен еще электромагнитный тормоз.

#77 Re: Програмування Arduino » добавить автономности роботу проблемы » 2017-01-05 20:37:25

Какие шутки. Первое что надо сделать сделать класс мотор.

/*
#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 моторы

}

#78 Re: Програмування Arduino » При компилировании выдает ошибку » 2017-01-05 19:05:55

glory24 пише:

BasicStepperDriver.ino:12:32: error: BasicStepperDriver.h: No such file or directory

Название файла .ino и файла .h не должны совпадать.
No such file or directory - переводчик в руки- нет файла или директории.
А дальше следсвие.

#79 Re: Програмування Arduino » добавить автономности роботу проблемы » 2017-01-05 18:25:43

Самая большая проблема не в этом. Если вы сложили шалаш, это не значит что вы сможете сложить не то что небоскреб, но и двух этажный дом.  Рассказывать вам про систему реального времени и millis() ,как машинные часы в системе реального времени. Это долго. Да и мне не зачем.

#81 Re: Програмування Arduino » Помогите доработать цикл » 2016-12-06 21:36:11

Блин. Что там вставлять. Да и код все же оформите вставкой , если приводите его на форуме.

/* генератор вспышек
#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 ;
  }
}

#82 Re: Програмування Arduino » Помогите доработать цикл » 2016-12-05 18:46:48

Разберешься и сможешь применить, то все Ок.

/* генератор вспышек
светодиод -> 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 ;
  }
}

#83 Re: Програмування Arduino » Ошибка - macro names must be identifiers » 2016-11-24 00:15:37

Если глаза болят ,тогда бросайте и программирование. Потому что форумы и гугл это основные источники информации.
А также вам прийдется собирать свою библиотеку проверенных решений на все случаи жизни.

#84 Re: Програмування Arduino » Ошибка - macro names must be identifiers » 2016-11-23 20:32:18

Выкинь на (цензура) эту книжку.

    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 // а вот так нет ;)

#85 Re: Програмування Arduino » Не получается тестер батареек » 2016-11-23 00:23:52

Нет . У вас проблемы в схемотехнике. 1 - на батарейку надо дать нагрузку. Хотя бы 1 кОм паралельно батарейке. 2 - бреадбоард тоже не лучший вариант. Там тоже контакты гуляют.

ПС: Из фундаментального. На батарейке не стабильное напряжение. Внутреняя ЭДС, внутренее сопротивление. Нужна какая-то наргузка. А аналоговый вход Ардуины такой нагрузки не дает. Тем более там АЦП одно и оно переключается по аналоговым выходам.

#86 Re: Програмування Arduino » Помогите создать скетч для станка » 2016-11-22 20:30:05

NoName. Ну да произвел обратный инженеринг. Но когда я это сделал, то понял, что тут надо переделывать всю программу, включая и управление станком.

#87 Re: Програмування Arduino » Не получается тестер батареек » 2016-11-22 20:07:49

Ну-ну. Учебники они такие. Они до добра не доведут.

/*Тестер для одноэлементных батареек
тестируемая батарейка -> 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);
}

#88 Re: Програмування Arduino » Помогите создать скетч для станка » 2016-11-20 15:29:33

Вот немного подправил код. Но поймал где-то ошибку. Надо такой код комментировать в каждой стройке. Но автор забил на это видно

/* Программа написана для станка по производству резиной плитки в 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)) {} // пока датчик не покажет аппарель слева
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

#89 Re: Програмування Arduino » Не получается цикл for » 2016-11-19 19:25:16

В том что выложили нет ошибки. А в том что сюда не попало могут быть русские буквы.

#90 Re: Програмування Arduino » Включение выключение нагрузки с отсрочкой » 2016-10-28 19:37:43

Вариант на разрыв.

/*      ***   места где произвел изменения
#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;
    }
  }
}

#91 Re: Програмування Arduino » Помогите создать скетч для станка » 2016-10-20 17:20:18

Во-во. А потом отображение этих аварий на экране. Так что надо создавать мини ОС для станка, а потом уже городить. А то при каждом затыке надо будет перешивать программу. А все нюансы работы кода всегда забываются.

#93 Re: Програмування Arduino » Помогите создать скетч для станка » 2016-10-19 22:57:02

Помимо нормальной работы у станка еще большая куча аварийных состояний. А то что вы так бодренько накатали скетч, то его можно сразу ..

#94 Re: Програмування Arduino » Включение выключение нагрузки с отсрочкой » 2016-10-19 22:41:22

Объяснять как работает код долго. Залейте и погоняйте его.

/*
#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;
    }
  }
}

#95 Re: Програмування Arduino » Математика. » 2016-10-15 13:04:25

Да и еще замечание "=" это присвоение  а=в+с; А вот "==" это уже условие.if (a==b+c){};
и еще if ((x = y) = (y>3))  это бред. Скорее всего так if(x==y && y>3)

#96 Re: Програмування Arduino » энкодер » 2016-10-03 19:42:14

//#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("         ")   ; //выводит выводит пробел.           
     }        
} 

#97 Re: Програмування Arduino » энкодер » 2016-10-03 19:32:07

разберем это 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);

#98 Re: Програмування Arduino » энкодер » 2016-10-03 18:15:50

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("         ")   ; //выводит выводит пробел.           
     }        
} 

#99 Re: Програмування Arduino » Управление PWM в определенном алгоритме » 2016-09-24 20:50:58

Я не скажу ничего нового. Я просто предлогаю метод решения этого задания.  Во первых мы можем разделить весь сигнал на участки.
1 ждать сигнал с вывода; 2 прямой участок (уровень A2 и длительностью T2); 3 косой участок ( от уровня A2 до A4 длительностью Т3) 4 прямой участок (уровень A4 и длительностью T4); 5 косой участок ( от уровня A4 до 0 длительностью Т5) . Причем если сигнал на входе будет 1 то перейти на участок 2.
ПС: Это всем ясно. От этого алгоритма и будем плясать.

#100 Re: Програмування Arduino » Управление PWM в определенном алгоритме » 2016-09-23 22:05:21

marov.a пише:

у меня Leonardo пока пишет так

C:\Users\Администратор\Desktop\sketch_sep23a\sketch_sep23a.ino:13:19: fatal error: Timer.h: No such file or directory

Пишет что надо поставить библиотеку в систему. И кроме вас никто не сможет это сделать. Потому что надо руками.

Эскиз ->include library -> menage libraries ну и там ищи .

Підвал форуму