Помогите отредактировать код точечной сварки

Тема в разделе "Arduino & Shields", создана пользователем Andrei brest, 10 июл 2016.

  1. Andrei brest

    Andrei brest Нерд

    #define DATA_PIN 5
    #define LATCH_PIN 6
    #define CLOCK_PIN 7
    #define RELAY 8 // пин выхода управляющего сигнала
    #define BUTTON_START 9 // кнопка запуска чего-то
    #define BUTTON_MODE 10 // кнопка переключения режимов, подключается между пином и GND
    #define MAX_INDEX 10 // количество режимов

    byte number[MAX_INDEX] = {0b01000000, 0b01111001, 0b00100100, 0b00110000, 0b00011001, 0b00010010, 0b00000010, 0b01111000, 0b00000000, 0b00010000,};
    enum { MODE_1, MODE_2, MODE_3, MODE_4, MODE_5, MODE_6, MODE_7, MODE_8, MODE_9, END}; // названия режимов, последняя метка всегда END
    byte currentMode; // текущий режим работы семисегментного диода
    byte CurrentMode; // режим работы
    void setup()
    {
    pinMode(BUTTON_MODE, INPUT_PULLUP);
    pinMode(BUTTON_START, INPUT_PULLUP);
    pinMode(RELAY, OUTPUT);
    pinMode(LATCH_PIN,OUTPUT);
    pinMode(CLOCK_PIN,OUTPUT);
    pinMode(DATA_PIN,OUTPUT);
    currentMode = 0; // режим по умолчанию (при включении питания)
    CurrentMode = MODE_1;
    }

    void loop()
    {
    if(!digitalRead(BUTTON_MODE)) // нажата кнопка переключения цифр
    {
    currentMode++; // увеличиваем счетчик (переключаемся на следующию цифру)
    if(currentMode == MAX_INDEX - 1) currentMode = 0; // зацикливаем счетчик
    }


    //}


    if(!digitalRead(BUTTON_MODE)) // нажата кнопка переключения режимов
    {
    byte timeout; // переменная для хранения времени отключения
    currentMode++; // увеличиваем счетчик

    if(!digitalRead(BUTTON_START)) // принудительный запуск
    {
    digitalWrite(RELAY, HIGH); // подаем импульс
    delay(timeout * 1000);
    digitalWrite(RELAY, LOW);
    }





    if(CurrentMode == END) currentMode = MODE_1; // зацикливаем счетчик
    switch(currentMode) // задаем параметры для каждого режима
    {
    case MODE_1: timeout = 1; break; // ставим задержку в 1 сек
    case MODE_2: timeout = 2; break;
    case MODE_3: timeout = 4; break;
    case MODE_4: timeout = 5; break;
    case MODE_5: timeout = 10; break;
    case MODE_6: timeout = 15; break;
    case MODE_7: timeout = 20; break;
    case MODE_8: timeout = 30; break;
    case MODE_9: timeout = 60; break;
    }
    byte value = number[currentMode];
    digitalWrite(LATCH_PIN, LOW);
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, value);
    digitalWrite(LATCH_PIN,HIGH);
    delay (200);
    }
    }
     
  2. Andrei brest

    Andrei brest Нерд

    Есть несколько проблем
    1 при вкл не показывает режим работы 0
    2 при переключении режимов не показывает цифру 9
    3 не срабатывают режимы
     
  3. alex-prog

    alex-prog Гик

  4. Andrei brest

    Andrei brest Нерд

    Я просто хотел подключить к ардуине реле и семисегментный диод(для отображения режима работы) кнопкой выбрать режим работы (продолжительность включения) нажать на другую кнопку и в зависимости от режима реле вкл и по истечению времени выкл ,после этого остается в этом режиме
    Дальше можно переключить на другой или продолжать работать с этим
     
  5. Andrei brest

    Andrei brest Нерд

    цифры от 0 -8 отображаются а цифра 9 нет
     
  6. alex-prog

    alex-prog Гик

    Я Вам по-моему, на это и дал ссылку. Можете собрать тот урок, и сразу поймете, в чём у Вас ошибка, если нет, тогда можете сюда написать.

    Код сильно разбросан, есть предположение, что до девяти у Вас идет обработка, поэтому 9 нажатие обнуляет.
     
  7. Andrei brest

    Andrei brest Нерд

    если залить код с ручным в водо цифр то работает
     
  8. Andrei brest

    Andrei brest Нерд

    ок папробую
     
  9. alex-prog

    alex-prog Гик

    Удачи, если что-то не получится, отпишите сюда...
     
  10. Andrei brest

    Andrei brest Нерд

    во первых у меня не правильно подключён диод к 74nc а=1 и=2 у меня а там по другому
     
  11. alex-prog

    alex-prog Гик

    Так разобраться получилось, или что-то не так?
     
  12. Andrei brest

    Andrei brest Нерд

    я напишу когда переделаю код
     
  13. alex-prog

    alex-prog Гик

    Удачи!
     
  14. ZAZ-965

    ZAZ-965 Гуру

    @Andrei brest, по-моему перечисление должно быть объявлено так
    Код (C++):
    enum CurrentModeEnum { MODE_1, MODE_2, MODE_3, MODE_4, MODE_5, MODE_6, MODE_7, MODE_8, MODE_9, END}; // названия режимов, последняя метка всегда END
    CurrentModeEnum CurrentMode; // режим работы
    http://playground.arduino.cc/Code/Enum
     
  15. alex-prog

    alex-prog Гик

    Я бы ещё byte number[MAX_INDEX] перепроверил, по-моему, 0b00010000 что-то не то, хотя может там сегментный дисплей специфический...
     
  16. Andrei brest

    Andrei brest Нерд

    семисегментный диод с общим анодом и подключон к 74nc595 произвольно , буду переделывать согласно урока 14
     
  17. Andrei brest

    Andrei brest Нерд

    подключил семисегметнный диод по схеме урока 14 показывает все цифры
     
  18. Andrei brest

    Andrei brest Нерд

    #define RELAY 8 // пин выхода реле
    #define BUTTON_START 9 // кнопка запуска реле
    #define BUTTON_PIN 10 // кнопка выбора режима
    #define CLOCK_PIN 11 // пин такта (англ. clock)
    #define LATCH_PIN 12 // пин строба (англ. latch)
    #define DATA_PIN 13 // пин данных (англ. data)

    int clicks = 0;
    boolean buttonWasUp = true;
    byte segments[10] = {
    0b00000010, 0b01011011, 0b00000101, 0b00001001, 0b01011000,
    0b00101000, 0b00100000, 0b00011011, 0b00000000, 0b00001000};
    enum newMode {
    MODE_0, MODE_1, MODE_2, MODE_3, MODE_4, MODE_5, MODE_6,
    MODE_7, MODE_8, MODE_9, END}; // названия режимов, последняя метка всегда END

    byte newMode; // переменая режим работы

    //**************************************************************************************************************************
    void setup()
    {
    pinMode(DATA_PIN, OUTPUT); // выход
    pinMode(CLOCK_PIN, OUTPUT); // выход
    pinMode(LATCH_PIN, OUTPUT); // выход
    pinMode(BUTTON_PIN, INPUT_PULLUP); // Вход Подтягиваем резистор 20 Ком
    pinMode(BUTTON_START, INPUT_PULLUP); // Вход Подтягиваем резистор 20 Ком
    newMode=MODE_0; // режим по умолчанию (при включении питания)

    }

    void loop()
    {
    byte timeout; // переменная для хранения времени отключения

    // считаем клики кнопки
    if (buttonWasUp && !digitalRead(BUTTON_PIN)) {
    delay(10);
    if (!digitalRead(BUTTON_PIN)){
    // clicks = (clicks + 1)% 10;// %10 зацикливаем на значении 10
    newMode = (newMode==END)%10;
    switch(newMode) // задаем параметры для каждого режима
    {
    case MODE_0: timeout = 0; break;
    case MODE_1: timeout = 1; break; // ставим задержку в 1 сек
    case MODE_2: timeout = 2; break;
    case MODE_3: timeout = 4; break;
    case MODE_4: timeout = 5; break;
    case MODE_5: timeout = 10; break;
    case MODE_6: timeout = 15; break;
    case MODE_7: timeout = 20; break;
    case MODE_8: timeout = 30; break;
    case MODE_9: timeout = 60; break;}
    }
    buttonWasUp = digitalRead(BUTTON_PIN);
    digitalWrite(LATCH_PIN, LOW);// для записи в 74HC595 нужно притянуть пин строба к земле
    shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]); // задвигаем (англ. shift out) байт-маску бит за битом,
    digitalWrite(LATCH_PIN, HIGH);// чтобы переданный байт отразился на выходах Qx, нужно подать на пин строба высокий сигнал






    if(!digitalRead(BUTTON_START)) // принудительный запуск
    {
    digitalWrite(RELAY, HIGH); // подаем импульс
    delay(timeout * 1000); // ждем n секунд
    digitalWrite(RELAY, LOW);
    // currentMode = MODE_1; // задаем режим 1 после срабатывания
    }


    }
    }
     
  19. Andrei brest

    Andrei brest Нерд

    не работает отдельно диод переключается а с режимам нет
     
  20. alex-prog

    alex-prog Гик

    Зачем нужно использовать тип перечисления? Лишнюю волокиту создаёте сами себе.

    Используйте SWITCH для целочисленного типа, и будет проще.
    На переполнение, проверять можно так, чтобы понимать ход программы:
    Код (C++):
    newMode++;
    if (newMode > maxMode) newMode = 0;
    при нажатии кнопки...

    Можно конечно, и остаток от деления оставить, если понимаете логику, что там происходит...

    Далее, Вы clicks заменили на newMode, а пишите:
    Код (C++):
    shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, segments[clicks]);
    Тогда либо и clicks пересчитывайте рядом с newMode, либо всё на newMode замените, и преведите его к целочисленному типу, чтобы не путаться...

    P. S. При таком количестве режимов, удобнее либо две кнопки использовать (+ и -), или уже потенциометр добавить, для ускорения процесса переключения.
     
    Последнее редактирование: 11 июл 2016