Помогите дописать скетч для 2 кнопок и реле

martinways
Offline
Зарегистрирован: 25.09.2020

Друзья, помогите доделать скетч, так как я в программировании "ардуин" чуть менее чем 0, методом тыка пытался поменять под себя скетч из соседних тем, но не получается. Значит есть 2 кнопки без фиксации типа "микрик" и 2 реле.

Итак, хочу возить  картошку и цемент на Lamborghini, так как лень паять такой функционал из транзисторов-триггеров.

Суть работы скетча. Дефолтное состояние - relay1, LOW и relay2, LOW. Вариант событий 1 - При замыкании кнопки 1 на минус (Button1 LOW) должно стать relay1, HIGH, при отпускании кнопки так и должно оставаться relay1, HIGH. Вариант событий 2 - При нажатии второй кнопки (Button2 LOW) высокие уровни должны становиться на обеих выходах (relay1, HIGH и relay2, HIGH), а при отпускании этой кнопки (возвращение её на высокий уровень) реле должны вернуться в дефолтное состояние, то есть relay1, LOW и relay2, LOW. Вот и всё. Вот мой скетч, но реле  работают только когда зажата кнопка, а мне нужно, чтобы реле1 работало и после отпускания кнопки1, а вот при нажатии и отпускании кнопки2 все реле отключались.

int button1 = 10; // кнопка1
int button2 = 11; // кнопка2
int relay1 = 12; // реле1
int relay2 = 13; // реле2
 
void setup() {
   pinMode(button1, INPUT_PULLUP);
   pinMode(button2, INPUT_PULLUP);
   pinMode(relay1, OUTPUT);
   pinMode(relay2, OUTPUT);
}
void loop()
{
  if (digitalRead(button1) == LOW)    
    {
        digitalWrite(relay1, HIGH);
    }
 if (digitalRead(button2) == LOW)    
    {
        digitalWrite(relay2, HIGH);
        digitalWrite(relay1, HIGH);  
    }

 

}
qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это какое-то не серьезное задание. Вот если такое: В устройстве есть две кнопочки. При нажатии на первую кнопку на карточку капает 100 рублей,при нажатию на вторую 200 рублей. Очень нужное и полезное для народу это устройство. Можно даже без дисплея и всяких реле, но капать должно на мою карточку.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020
#include <shButton> // https://github.com/VAleSh-Soft/shButton

#define button1 10 // кнопка1
#define button2 11 // кнопка2
#define relay1 12  // реле1
#define relay2 13  // реле2

shButton btn1(button1);
shButton btn2(button2);

void setup() 
{
   pinMode(relay1, OUTPUT);
   pinMode(relay2, OUTPUT);
}

void loop()
{
  switch (btn1.getButtonState())
  {
  case BTN_DOWN:
    digitalWrite(relay1, HIGH);
    break;
  }
  switch (btn2.getButtonState())
  {
  case BTN_DOWN:
    digitalWrite(relay1, HIGH);
    digitalWrite(relay2, HIGH);
    break;
  }
  case BTN_UP:
    digitalWrite(relay1, LOW);
    digitalWrite(relay2, LOW);
    break;
  }
}

 

martinways
Offline
Зарегистрирован: 25.09.2020

Спасибо, друг! но при проверке выдает ошибку 

Arduino: 1.8.10 (Windows 10), Плата:"Arduino Nano, ATmega328P (Old Bootloader)"
 
sketch_sep24a:1:10: error: shButton: No such file or directory
 
compilation terminated.
 
exit status 1
shButton: No such file or directory
 
v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020
#include <shButton.h>

Расширение не дописал

И лишнюю скобку написал. Так правильно будет

#include <shButton.h> // https://github.com/VAleSh-Soft/shButton

#define button1 10 // кнопка1
#define button2 11 // кнопка2
#define relay1 12  // реле1
#define relay2 13  // реле2

shButton btn1(button1);
shButton btn2(button2);

void setup()
{
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
}

void loop()
{
  switch (btn1.getButtonState())
  {
    case BTN_DOWN:
      digitalWrite(relay1, HIGH);
      break;
  }
  switch (btn2.getButtonState())
  {
    case BTN_DOWN:
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      break;
    case BTN_UP:
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      break;
  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Не при проверке, а при тупой копипасте без включения головы. В первой строке для кого ссылка?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

sadman41 пишет:
Не при проверке, а при тупой копипасте без включения головы. В первой строке для кого ссылка?

Да не, там я тоже косякнул - писал от руки и расширение не поставил ))

martinways
Offline
Зарегистрирован: 25.09.2020

Так и не проходит проверку, это нужно будет вручную библиотеку скопировать с гитхаба и вставить или что? Сорри, ребята, я дундук в этом))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Да, скачать и добавить в папку libraries. Ардуину после этого перезапустить

martinways
Offline
Зарегистрирован: 25.09.2020

Ура-ура! Ламборгини завелась и уже готова возить картошку!

Спасибо, друзья, пусть ваши светлые головы генерируют только самые полезные и прибыльные для вас идеи 100лет и больше!

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

С тебя пять баксов 

martinways
Offline
Зарегистрирован: 25.09.2020

Если это не штука, то напиши как оплатить, а то я из Украины и могу только картой, пайпал и вестерн юнион.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Шутка, шутка, это не платный раздел ))

martinways
Offline
Зарегистрирован: 25.09.2020

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

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Так при нажатии или отпускании?

martinways
Offline
Зарегистрирован: 25.09.2020

Нажал button3 - включилось реле3, отпустил button3 - реле3 осталось включенным. Потом если еще раз нажать button3  - реле3 выключилось, отпустил button3 - реле осталось выключенным. И так по кругу)) Ну типа включение и выключение чего-либо кнопкой без фиксации.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Попробуй сам ))

в начале скетча по аналогии в дефайнах определи третью кнопку и третье реле, затем чуть ниже добавь третью кнопку (btn3), затем в сетапе задай режим пину третьего реле. Потом в луп добавь вот это

  switch (btn3.getButtonState())
  {
    case BTN_DOWN:
      digitalWrite(relay3, !digitalRead(relay3));
      break;
  }

Код инвертирует состояние третьего реле при каждом нажатии на третью кнопку

martinways
Offline
Зарегистрирован: 25.09.2020

Скомпилировалось и прошилось, сейчас буду припаивать и проверять как работает.

martinways
Offline
Зарегистрирован: 25.09.2020

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

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Эти простыни здесь спрятаны в библиотеке, потому и просто. Если писать с нуля - без простыней не обойтись ))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

v258 пишет:

Эти простыни здесь спрятаны в библиотеке, потому и просто. Если писать с нуля - без простыней не обойтись ))

Спорим без библиотек напишу тоже самое, но короче ?

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Короче чего? ))

Green
Offline
Зарегистрирован: 01.10.2015

Ну так и кого короче?)

martinways
Offline
Зарегистрирован: 25.09.2020

Дружище, а как сделать управление шаговиком вместо реле4, то есть пин 9 должен работать в режиме шагов, а кнопка4 должна переключать 4 режима скорости с каждым последующим нажатием по кругу, например по умолчанию скорость первая, нажал кнопку4 - включился второй режим скорости, еще раз нажал - третий режим, еще раз - 4-й режим, потом снова первый. При включении ардуины уже должна быть включена первая скорость. другие же уже реализованные функции включения\выключения реле подключу к входам драйвера шаговика ENA и DIR, так что их специально не нужно прописывать в коде, а только STP, Каждую скорость выставить от балды, а я уже подберу цифры экспериментально подключив к двигателю, а то я не знаю какое количество шагов за секунду надо. Надо чтобы импульсы шагов шли постоянно, а не какое-то определенное количество шагов.

#include <shButton.h> // <a href="https://github.com/VAleSh-Soft/shButton" title="https://github.com/VAleSh-Soft/shButton" rel="nofollow">https://github.com/VAleSh-Soft/shButton</a>

#define button1 5 // кнопка1
#define button2 6 // кнопка2
#define button3 7 // кнопка3
#define button4 8 // кнопка4
#define relay1 12  // реле1
#define relay2 11  // реле2
#define relay3 10  // реле3
#define relay4 9  // реле4

shButton btn1(button1);
shButton btn2(button2);
shButton btn3(button3);
shButton btn4(button4);

void setup()
{
  pinMode(relay1, OUTPUT);
  pinMode(relay2, OUTPUT);
  pinMode(relay3, OUTPUT);
  pinMode(relay4, OUTPUT);
}

void loop()
{
  switch (btn1.getButtonState())
  {
    case BTN_DOWN:
      digitalWrite(relay1, HIGH);
      break;
  }
  switch (btn2.getButtonState())
  {
    case BTN_DOWN:
      digitalWrite(relay1, HIGH);
      digitalWrite(relay2, HIGH);
      break;
    case BTN_UP:
      digitalWrite(relay1, LOW);
      digitalWrite(relay2, LOW);
      break;
  }
  switch (btn3.getButtonState())
{
  case BTN_DOWN:
    digitalWrite(relay3, !digitalRead(relay3));
    break;
}
  switch (btn4.getButtonState())
{
  case BTN_DOWN:
    digitalWrite(relay4, !digitalRead(relay4));
    break;
}
}

 

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Во-первых, там одним пином не обойтись, во-вторых, для шаговика нужен драйвер и в-третьих, я с шаговиками не разбирался ;)

Посмотри, например, здесь. Только там с Delay(), а это не очень правильно.

Режим по клику кнопки меняется примерно так

  static byte mode = 0;
  switch (btn4.getButtonState())
  {
  case BTN_DOWN:
    mode++;
    if (mode > 2)
      mode = 0;
    break;
  }

Где mode - номер режима от нуля до двух

Вот еще похожая тема - http://arduino.ru/forum/programmirovanie/plavnoe-uvelichenie-skorosti-vr...

martinways
Offline
Зарегистрирован: 25.09.2020

Первая ссылка чет не открывается, да и я думаю, что вряд ли справлюсь, может ты разберешься с кодом для генерации импульсов и переключения частоты импульсов для изменения скорости вращения двигла и сделаешь этот скетч? Я заплачу, скажи сколько. Драйвер и мотор конечно же есть, просто у меня был до этого подключен специализированный генератор импульсов с резистором-крутилкой для регулировки скорости, функцию включения-выключения и направления двигателя я с твоей помощью уже реализовал на ардуине, а тут возникла мысль повесить функцию генератора импульсов на эту же ардуинку и избавиться от аппаратного генератора, плюс еще и скорости на ардуине чтобы переключались. К ардуине я подключаю радио-выключатель на 4 реле и хочу с радиопульта управлять двигателем и его скоростью.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

в кнопкобиблиотеке в файле Readme в конце есть адрес электронки - пиши

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

v258 пишет:

Попробуй сам ))

в начале скетча по аналогии в дефайнах определи третью кнопку и третье реле, затем чуть ниже добавь третью кнопку (btn3), затем в сетапе задай режим пину третьего реле. Потом в луп добавь вот это

  switch (btn3.getButtonState())
  {
    case BTN_DOWN:
      digitalWrite(relay3, !digitalRead(relay3));
      break;
  }

Код инвертирует состояние третьего реле при каждом нажатии на третью кнопку

Дед такое в одну строку писал )))

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Дед - это глыбища ))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ua6em пишет:
Дед такое в одну строку писал )))

И зря. Если бы Деду платили за каждую написанную строку, то он раз в 6 богаче был. Хотя могут быть варианты.

Урок математики в одесской школе.
Учитель:
— Сколько будет дважды два?
Отличник с первой парты:
— А мы покупаем или продаём?