#1 2016-08-08 21:01:45

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Программа с кнопкой (короткое нажатие и длиное нажатие)

Нажимаешь коротко сообщение "Short press" длиное "Long press".

Это яндекс диск с программой http://yadi.sk/d/B-xRa1fXu3aEq

const int buttonPin=2;// вывод кнопки 0 нажата 1 нет
uint32_t last_millis; // переменные: последний  millis

uint8_t botton(){
  if (digitalRead(buttonPin) == 1){ // кнопка не нажата     
     last_millis = millis();
     return 0;}
   delay(30);
   while (digitalRead(buttonPin) == 0);
   delay(30);
   if (last_millis+65 > millis()){ // ложное срабатывание
     //Serial.println(millis()-last_millis);
     last_millis = millis();
     return 0;}
   if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
     //Serial.println(millis()-last_millis);
     last_millis = millis();
     return 1;}
   //Serial.println(millis()-last_millis);
   last_millis = millis(); // длинное нажатие больше 0.30 сек
   return 2;
};


void setup() 
{  
  Serial.begin(9600); // Запускаем последовательный порт
  pinMode(buttonPin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром 
  last_millis = millis();  
}
void loop()
 {
   switch (botton()) {
      case 1:  Serial.println("Short press");
         break;
     case 2:  Serial.println("Long press");
         break;
   } 
 }

Неактивний

#2 2016-08-08 23:39:29

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

А теперь тоже самое но на базе Енкодера http://www.banggood.com/ru/KY-040-Rotar … 14010.html

"Короткое нажатие" "длиное нажатие" "по часовой" и "против часовой".

Код на диске http://yadi.sk/d/iZ7XcUs-u3ss7

// обработчик кнопки
const int buttonPin=A0;// вывод кнопки 0 нажата 1 нет
uint32_t last_millis; // переменные: последний  millis

uint8_t botton(){
  if (digitalRead(buttonPin) == 1){ // кнопка не нажата     
     last_millis = millis();
     return 0;}
   delay(30);
   while (digitalRead(buttonPin) == 0);
   delay(30);
   if (last_millis+65 > millis()){ // ложное срабатывание
     //Serial.println(millis()-last_millis);
     last_millis = millis();
     return 0;}
   if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
     //Serial.println(millis()-last_millis);
     last_millis = millis();
     return 1;}
   //Serial.println(millis()-last_millis);
   last_millis = millis(); // длинное нажатие больше 0.30 сек
   return 2;
};
// обработчик энкодера
const int CLK_Pin=A2;// вывод CLK кнопки 0 нажата 1 нет
const int DT_Pin=A1; // вывод DT  кнопки 0 нажата 1 нет
uint8_t statCLK,statCLK_old; // переменные: состояние CLK вывода сейчас и раньше

uint8_t Encoder(){
  statCLK = digitalRead(CLK_Pin);  
  if ((statCLK == 0)&&(statCLK_old ==1 )){ //  счет по фронту
     statCLK_old=statCLK;
     return (digitalRead(DT_Pin)+1);
    };
  statCLK_old=statCLK; 
  return 0;
};

void setup() 
{  
  Serial.begin(9600); // Запускаем последовательный порт
  pinMode(buttonPin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром 
  last_millis = millis();
  pinMode(CLK_Pin, INPUT);
  pinMode(DT_Pin, INPUT); 
  statCLK_old = digitalRead(CLK_Pin);   
}
void loop()
 {
   switch (botton()) {
      case 1:  Serial.println("Short press");
         break;
     case 2:  Serial.println("Long press");
         break;
   } 
   switch (Encoder()) {
      case 1:  Serial.println("clockwise");
         break;
     case 2:  Serial.println("counter-clockwise");
         break;
   } 
 }

Неактивний

#3 2016-08-09 15:25:03

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Фигня

Неактивний

#4 2016-08-09 21:57:21

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Продолжаю программы с использование короткого и длиного нажатия
С помощью этого джойстика http://greenchip.com.ua/23-0-146-0.html и программы можно подавать команды на 9 устройств(левовверх-0 ,, правовниз 8) Для примера 8 устройство это светодиод 13 короткое включить длиное выключить

Место для скачки программы https://yadi.sk/d/SYEYuaJ0u5mAr

// == Устройство 0 =================================================
const int Dev0_Pin=2;//  вывод устройствa 0
void Dev0_ini(){ //  инициализация устройствa 0
}
void Dev0_Short(){ //  действие  устройствa 0 при коротком нажатии
Serial.println("Short press 0");
}
void Dev0_Long(){ //  инициализация устройствa 0 при длином нажатии
Serial.println("Long press 0");
}
// == Устройство 1 ==================================================
const int Dev1_Pin=3;//  вывод устройствa 1
void Dev1_ini(){ //  инициализация устройствa 1
}
void Dev1_Short(){ //  действие  устройствa 1 при коротком нажатии
Serial.println("Short press 1");
}
void Dev1_Long(){ //  инициализация устройствa 1 при длином нажатии
Serial.println("Long press 1");
}
// == Устройство 2 ===================================================
const int Dev2_Pin=4;//  вывод устройствa 2
void Dev2_ini(){ //  инициализация устройствa 2
}
void Dev2_Short(){ //  действие  устройствa 2 при коротком нажатии
Serial.println("Short press 2");
}
void Dev2_Long(){ //  инициализация устройствa 2 при длином нажатии
Serial.println("Long press 2");
}
// == Устройство 3 ==================================================
const int Dev3_Pin=5;//  вывод устройствa 3
void Dev3_ini(){ //  инициализация устройствa 3
}
void Dev3_Short(){ //  действие  устройствa 3 при коротком нажатии
Serial.println("Short press 3");
}
void Dev3_Long(){ //  инициализация устройствa 3 при длином нажатии
Serial.println("Long press 3");
}
// == Устройство 4 ==================================================
const int Dev4_Pin=6;//  вывод устройствa 4
void Dev4_ini(){ //  инициализация устройствa 4
}
void Dev4_Short(){ //  действие  устройствa 4 при коротком нажатии
Serial.println("Short press 4");
}
void Dev4_Long(){ //  инициализация устройствa 4 при длином нажатии
Serial.println("Long press 4");
}
// == Устройство 5 ===================================================
const int Dev5_Pin=7;//  вывод устройствa 5
void Dev5_ini(){ //  инициализация устройствa 5
}
void Dev5_Short(){ //  действие  устройствa 5 при коротком нажатии
Serial.println("Short press 5");
}
void Dev5_Long(){ //  инициализация устройствa 5 при длином нажатии
Serial.println("Long press 5");
}
// == Устройство 6 ===================================================
const int Dev6_Pin=8;//  вывод устройствa 6
void Dev6_ini(){ //  инициализация устройствa 6
}
void Dev6_Short(){ //  действие  устройствa 6 при коротком нажатии
Serial.println("Short press 6");
}
void Dev6_Long(){ //  инициализация устройствa 6 при длином нажатии
Serial.println("Long press 6");
}
// == Устройство 7 ====================================================
const int Dev7_Pin=9;//  вывод устройствa 7
void Dev7_ini(){ //  инициализация устройствa 7
}
void Dev7_Short(){ //  действие  устройствa 7 при коротком нажатии
 Serial.println("Short press 7");
}
void Dev7_Long(){ //  инициализация устройствa 7 при длином нажатии
 Serial.println("Long press 7");
}
// == Устройство 8 ====================================================
const int Dev8_Pin=13;//  вывод устройствa 8
void Dev8_ini(){ //  инициализация устройствa 8
  pinMode(Dev8_Pin, OUTPUT);
}
void Dev8_Short(){ //  действие  устройствa 8 при коротком нажатии
 digitalWrite(Dev8_Pin, HIGH); 
 Serial.println("Short press 8");
}
void Dev8_Long(){ //  инициализация устройствa 8 при длином нажатии
 digitalWrite(Dev8_Pin, LOW);
 Serial.println("Long press 8");
}
// === функция обработки аналоговой части джойстика Arduino  ===
const int VRx_Pin=A0;// аналоговый вывод VRx джойстика Arduino
const int VRy_Pin=A1;// аналоговый вывод VRy джойстика Arduino
uint16_t VRx;
uint16_t VRy;
uint8_t AnalogRd(){
  VRx = analogRead(VRx_Pin);
  VRy = analogRead(VRy_Pin);
  return((VRx>340)+(VRx>680)+3*(VRy>340)+3*(VRy>680));
};
void DoShort(){ // делать при коротком нажатии
  switch (AnalogRd()) {
    case 0:  Dev0_Short() ;//делать когда  равно 0
      break;
    case 1:  Dev1_Short();      //делать когда  равно 1
      break;
    case 2:  Dev2_Short();      //делать когда  равно 2
      break;
    case 3:  Dev3_Short();      //делать когда  равно 3
      break;
    case 4:  Dev4_Short();      //делать когда  равно 4
      break;
    case 5:  Dev5_Short();      //делать когда  равно 5
      break;
    case 6:  Dev6_Short();     //делать когда  равно 6
      break;
    case 7:  Dev7_Short();      //делать когда  равно 7
      break;
    case 8:  Dev8_Short();      //делать когда  равно 8
      break;                  
  }
}
void DoLong(){ // делать при длином нажатии
  switch (AnalogRd()) {
    case 0:  Dev0_Long();      //делать когда  равно 0
      break;
    case 1:  Dev1_Long();      //делать когда  равно 1
      break;
    case 2:  Dev2_Long();      //делать когда  равно 2
      break;
    case 3:  Dev3_Long();      //делать когда  равно 3
      break;
    case 4:  Dev4_Long();      //делать когда  равно 4
      break;
    case 5:  Dev5_Long();      //делать когда  равно 5
      break;
    case 6:  Dev6_Long();      //делать когда  равно 6
      break;
    case 7:  Dev7_Long();      //делать когда  равно 7
      break;
    case 8:  Dev8_Long();      //делать когда  равно 8
      break;                  
  }  
}
// === antidelay замена обычного delay  ===
void antidelay(uint32_t timing){
timing += millis();
while(millis()<=timing);
};
// === функция обработки кнопки джойстика Arduino ===
const int SW_Pin=A2;// вывод SW кнопки  джойстика Arduino 0 нажата 1 нет
uint32_t last_millis; // переменные: последний  millis

uint8_t botton(){
  if (digitalRead(SW_Pin) == 1){ // кнопка не нажата     
     last_millis = millis();
     return 0;}
   antidelay(30);
   while (digitalRead(SW_Pin) == 0);
   antidelay(30);
   if (last_millis+65 > millis()){ // ложное срабатывание
     //Serial.println(millis()-last_millis);
     last_millis = millis();
     return 0;}
   if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
     //Serial.println(millis()-last_millis);
     last_millis = millis();
     return 1;}
   //Serial.println(millis()-last_millis);
   last_millis = millis(); // длинное нажатие больше 0.30 сек
   return 2;
};

// === главная часть программы ===
void setup() 
{  
  Serial.begin(9600); // Запускаем последовательный порт
  Dev0_ini(); //  инициализация устройствa 0
  Dev1_ini(); //  инициализация устройствa 1
  Dev2_ini(); //  инициализация устройствa 2
  Dev3_ini(); //  инициализация устройствa 3
  Dev4_ini(); //  инициализация устройствa 4
  Dev5_ini(); //  инициализация устройствa 5
  Dev6_ini(); //  инициализация устройствa 6
  Dev7_ini(); //  инициализация устройствa 7
  Dev8_ini(); //  инициализация устройствa 8
  pinMode(SW_Pin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром 
  last_millis = millis();

  
}
void loop()
 {
   switch (botton()) {
      case 1: // Serial.println("Short press");
         DoShort();
         break;
     case 2: // Serial.println("Long press");
         DoLong();
         break;
   } 
 }

Неактивний

#5 2016-08-09 23:32:56

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Фигня

Неактивний

#6 2016-08-10 07:21:34

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

lkj , думаешь меня интересует мнение трепла.

Неактивний

#7 2016-08-10 15:06:24

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

qwone, Смотри на свой бред и исправляй. Если тебе нравиться, то можешь оставить.
А пока это ты “трепло”.

Неактивний

#8 2016-08-10 18:35:46

vvr
Учасник
Зареєстрований: 2015-04-12
Повідомлень: 878

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

lkj пише:

qwone, Смотри на свой бред и исправляй. Если тебе нравиться, то можешь оставить.
А пока это ты “трепло”.

ты не прав...
если чел выкладывает свои наработки - спасибо ему.
а использовать их или нет - дело сугубо личное.

ну а если хаять хочется то покажи что то лучшее или правильнее, иначе пустая трепня))))

Неактивний

#9 2016-08-10 21:04:16

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Продолжаю выкладывать программу. Конечно лучше для некоторых выложить готовую. Но я показываю, как писать структурированые программы, и модульное проектирование. Это лучше, чем сделать "простыню салата", а потом орать на форуме:"найдите ошибку в программе"

Яндекс диск. http://yadi.sk/d/5ZM2ROz6u7g3A

/* Программа : Разработка Модульного и структурного строительства программ
 * Система: 9 экранов или 1+4+4 экрана разумеется 
 *  Написал : qwone. Не для своей гордыни, а так что бы люди знали с кого спрашивать за это.
 *  
 *  Схема подключения
 *  Ардуино джойстик  GND -> GND
                      +5V -> +5V
                      VRx -> A0
                      VRy -> A1
                      SW  -> A2

 I2C LCD1602          GND -> GND 
                      +5V -> +5V
                      SDA -> A4(SDA)
                      SCL -> A5(SCL)

 пьезопищалку          -  -> GND 
                       +  -> не подключен
                       S  -> pin 12                  
                      
  Устройство 0        PIN -> 2
  Устройство 1        PIN -> 3
  Устройство 2        PIN -> 4
  Устройство 3        PIN -> 5
  Устройство 4        PIN -> 6
  Устройство 5        PIN -> 7 
  Устройство 6        PIN -> 8
  Устройство 7        PIN -> 9 
  Устройство 8        PIN -> 13
*/
// ============= Подключение пьезопищалку =====================
const int Beep_Pin=12;//  вывод пьезопищалки S
void Short_press_Beep(){
  tone(Beep_Pin,700,100);
}
void Long_press_Beep(){
  tone(Beep_Pin,1000,100); 
}
void alarm_Beep(){
 tone(Beep_Pin,2000, 1000);
}
// ============= Подключение LCD1602 по I2C =====================
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
void LCD_ini(){ //  инициализация устройствa 0
  lcd.init();                     
  lcd.backlight(); // Включаем подсветку дисплея
  lcd.print("system 1+4+4");
  lcd.setCursor(0, 1);
  lcd.print("qwone");
}
// ================ Устройство 0 =================================
const int Dev0_Pin=2;//  вывод устройствa 0
void Dev0_ini(){ //  инициализация устройствa 0
  
}
void Dev0_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("Device 0");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev0_Short(){ //  действие  устройствa 0 при коротком нажатии
 Dev0_viev();
 Serial.println("Short press 0");
}
void Dev0_Long(){ //  инициализация устройствa 0 при длином нажатии
Serial.println("Long press 0");
}
// ============= Устройство 1 =====================================
const int Dev1_Pin=3;//  вывод устройствa 1
void Dev1_ini(){ //  инициализация устройствa 1
}
void Dev1_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("Device 1");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev1_Short(){ //  действие  устройствa 1 при коротком нажатии
  Dev1_viev();
  Serial.println("Short press 1");
}
void Dev1_Long(){ //  инициализация устройствa 1 при длином нажатии
  Serial.println("Long press 1");
}
// ================ Устройство 2 ===================================
const int Dev2_Pin=4;//  вывод устройствa 2
void Dev2_ini(){ //  инициализация устройствa 2
}
void Dev2_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("Device 2");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev2_Short(){ //  действие  устройствa 2 при коротком нажатии
  Dev2_viev();
  Serial.println("Short press 2");
}
void Dev2_Long(){ //  инициализация устройствa 2 при длином нажатии
  Serial.println("Long press 2");
}
// ================ Устройство 3 ====================================
const int Dev3_Pin=5;//  вывод устройствa 3
void Dev3_ini(){ //  инициализация устройствa 3
}
void Dev3_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("Device 3");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev3_Short(){ //  действие  устройствa 3 при коротком нажатии
  Dev3_viev();
  Serial.println("Short press 3");
}
void Dev3_Long(){ //  инициализация устройствa 3 при длином нажатии
  Serial.println("Long press 3");
}
// =========== Устройство 4 ========================================
const int Dev4_Pin=6;//  вывод устройствa 4
void Dev4_ini(){ //  инициализация устройствa 4
}
void Dev4_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("General screen");
  lcd.setCursor(0, 1);
  lcd.print("Device 4");
}
void Dev4_Short(){ //  действие  устройствa 4 при коротком нажатии
  Dev4_viev();
  Serial.println("Short press 4");
}
void Dev4_Long(){ //  инициализация устройствa 4 при длином нажатии
  Serial.println("Long press 4");
}
// ============= Устройство 5 ======================================
const int Dev5_Pin=7;//  вывод устройствa 5
void Dev5_ini(){ //  инициализация устройствa 5
}
void Dev5_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("Device 5");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev5_Short(){ //  действие  устройствa 5 при коротком нажатии
  Dev5_viev();
  Serial.println("Short press 5");
}
void Dev5_Long(){ //  инициализация устройствa 5 при длином нажатии
Serial.println("Long press 5");
}
// =============== Устройство 6 =====================================
const int Dev6_Pin=8;//  вывод устройствa 6
void Dev6_ini(){ //  инициализация устройствa 6
}
void Dev6_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("Device 6");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev6_Short(){ //  действие  устройствa 6 при коротком нажатии
  Dev6_viev();
  Serial.println("Short press 6");
}
void Dev6_Long(){ //  инициализация устройствa 6 при длином нажатии
  Serial.println("Long press 6");
}
// ================== Устройство 7 ====================================
const int Dev7_Pin=9;//  вывод устройствa 7
void Dev7_ini(){ //  инициализация устройствa 7
}
void Dev7_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("Device 7");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev7_Short(){ //  действие  устройствa 7 при коротком нажатии
  Dev7_viev();
  Serial.println("Short press 7");
}
void Dev7_Long(){ //  инициализация устройствa 7 при длином нажатии
  Serial.println("Long press 7");
}
// ====================== Устройство 8 ==================================
const int Dev8_Pin=13;//  вывод устройствa 8
void Dev8_ini(){ //  инициализация устройствa 8
  pinMode(Dev8_Pin, OUTPUT);
}
void Dev8_viev(){//  экран устройствa 0
  lcd.clear();
  lcd.print("Device 8");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev8_Short(){ //  действие  устройствa 8 при коротком нажатии
  Dev8_viev();
  digitalWrite(Dev8_Pin, HIGH);
  Serial.println("Short press 8");
}
void Dev8_Long(){ //  инициализация устройствa 8 при длином нажатии
  digitalWrite(Dev8_Pin, LOW);
  Serial.println("Long press 8");
}
// ============ функция обработки аналоговой части джойстика Arduino  =====
const int VRx_Pin=A0;// аналоговый вывод VRx джойстика Arduino
const int VRy_Pin=A1;// аналоговый вывод VRy джойстика Arduino
uint16_t VRx;
uint16_t VRy;
uint8_t AnalogRd(){
  VRx = analogRead(VRx_Pin);
  VRy = analogRead(VRy_Pin);
  return((VRx>340)+(VRx>680)+3*(VRy>340)+3*(VRy>680));
};
void DoShort(){ // делать при коротком нажатии
  switch (AnalogRd()) {
    case 0:  Dev0_Short();//делать когда  равно 0
      break;
    case 1:  Dev1_Short();//делать когда  равно 1
      break;
    case 2:  Dev2_Short();//делать когда  равно 2
      break;
    case 3:  Dev3_Short();//делать когда  равно 3
      break;
    case 4:  Dev4_Short();//делать когда  равно 4
      break;
    case 5:  Dev5_Short();//делать когда  равно 5
      break;
    case 6:  Dev6_Short();//делать когда  равно 6
      break;
    case 7:  Dev7_Short();//делать когда  равно 7
      break;
    case 8:  Dev8_Short();//делать когда  равно 8
      break;                  
  }
}
void DoLong(){ // делать при длином нажатии
  switch (AnalogRd()) {
    case 0:  Dev0_Long();//делать когда  равно 0
      break;
    case 1:  Dev1_Long();//делать когда  равно 1
      break;
    case 2:  Dev2_Long();//делать когда  равно 2
      break;
    case 3:  Dev3_Long();//делать когда  равно 3
      break;
    case 4:  Dev4_Long();//делать когда  равно 4
      break;
    case 5:  Dev5_Long();//делать когда  равно 5
      break;
    case 6:  Dev6_Long();//делать когда  равно 6
      break;
    case 7:  Dev7_Long();//делать когда  равно 7
      break;
    case 8:  Dev8_Long();//делать когда  равно 8
      break;                  
  }  
}
// ================== antidelay замена обычного delay  =================
void antidelay(uint32_t timing){
timing += millis();
while(millis()<=timing);
};
// === функция обработки кнопки джойстика Arduino ===
const int SW_Pin=A2;// вывод SW кнопки  джойстика Arduino 0 нажата 1 нет
uint32_t last_millis; // переменные: последний  millis

uint8_t botton(){
  if (digitalRead(SW_Pin) == 1){ // кнопка не нажата     
     last_millis = millis();
     return 0;}
   antidelay(30);
   while (digitalRead(SW_Pin) == 0);
   antidelay(30);
   if (last_millis+65 > millis()){ // ложное срабатывание
     last_millis = millis();
     return 0;}
   if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
     last_millis = millis();
     return 1;}
   last_millis = millis(); // длинное нажатие больше 0.30 сек
   return 2;
};

// ======================= главная часть программы ========================
void setup() 
{  
  Serial.begin(9600); // Запускаем последовательный порт
  LCD_ini(); //  инициализация LCD1602 по I2C
  Dev0_ini(); //  инициализация устройствa 0
  Dev1_ini(); //  инициализация устройствa 1
  Dev2_ini(); //  инициализация устройствa 2
  Dev3_ini(); //  инициализация устройствa 3
  Dev4_ini(); //  инициализация устройствa 4
  Dev5_ini(); //  инициализация устройствa 5
  Dev6_ini(); //  инициализация устройствa 6
  Dev7_ini(); //  инициализация устройствa 7
  Dev8_ini(); //  инициализация устройствa 8
  pinMode(SW_Pin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром 
  last_millis = millis();

  
}
void loop()
 {
   switch (botton()) {
      case 1: Short_press_Beep();
         DoShort();
         break;
     case 2:  Long_press_Beep();
         DoLong();
         break;
   } 
 }

Неактивний

#10 2016-08-11 00:23:22

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

qwone, никак не пойму что это за "странный"  roll antidelay?  Нафиг он вообще такой? Чем обычный delay не угодил lol ?

Неактивний

#11 2016-08-11 00:32:57

Nazar
Учасник
З Пирятин, Украина
Зареєстрований: 2016-02-23
Повідомлень: 11

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Nefreemen пише:

qwone, никак не пойму что это за "странный"  roll antidelay?  Нафиг он вообще такой? Чем обычный delay не угодил lol ?

delay(); останавливает программу на заданное кол-во времени(Именно останавливает). Если программа сложная, и должна работать быстро, то delay(); явно не вариант!

Неактивний

#12 2016-08-11 06:37:56

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

delay () рубит прерывание. antidelay() этого не делает,просто делает задержку.Хотя в даном случае программа работает и так и так. Может кому-то понадобиться делать прерывание.Вот я и воткнул  antidelay(). Продолжаю писать программу.
Яндекс диск https://yadi.sk/d/mP2rplQNu868x
Ну и сам текст. И да появился еще один трюк. Так что собирайте схему, загружайте программу и разбирайтесь если кому интересно. А если нет, то и делать этого не надо.

/* Программа : Разработка Модульного и структурного строительства программ
 * Система: 9 экранов или 1+4+4 экрана разумеется 
 *  Написал : qwone. Не для своей гордыни, а так что бы люди знали с кого спрашивать за это.
 *  
 *  Схема подключения
 *  Ардуино джойстик  GND -> GND
                      +5V -> +5V
                      VRx -> A0
                      VRy -> A1
                      SW  -> A2

 I2C LCD1602          GND -> GND 
                      +5V -> +5V
                      SDA -> A4(SDA)
                      SCL -> A5(SCL)

 пьезопищалку          -  -> GND 
                       +  -> не подключен
                       S  -> pin 12                  
                      
  Устройство 0        PIN -> 2
  Устройство 1        PIN -> 3
  Устройство 2        PIN -> 4
  Устройство 3        PIN -> 5
  Устройство 4        PIN -> 6
  Устройство 5        PIN -> 7 
  Устройство 6        PIN -> 8
  Устройство 7        PIN -> 9 
  Устройство 8        PIN -> 13
*/
// ========== базовый класс   "согласовки" ==================
class qw_basic {            
  public:  
    qw_basic(uint32_t span);
    virtual uint8_t go();
protected:    
    uint32_t span;         // интервал гашения или включения
    uint32_t future;     // время сменить состояние гашения или включения    
};
qw_basic::qw_basic(uint32_t span){
    this->span = span ;
    future = span +  millis();
}
uint8_t qw_basic::go() {           // конструктор qw_basic
    if (millis() < future) return 1;
    future  = span + millis();
    return 0;
}
qw_basic Time_per_500msec(500); // создание объекта представителя Делать раз в 0.5 сек

// ============= Подключение пьезопищалку =====================
const int Beep_Pin=12;//  вывод пьезопищалки S
void Short_press_Beep(){
  tone(Beep_Pin,700,100);
}
void Long_press_Beep(){
  tone(Beep_Pin,1000,100); 
}
void alarm_Beep(){
 tone(Beep_Pin,2000, 1000);
}
// ============= Подключение LCD1602 по I2C =====================
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
uint8_t N_screen; // номер текущего демонстрируемого окна
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
void LCD_ini(){ //  инициализация устройствa 0
  N_screen = 9; // сделать показать главное окно (окно 4)
  lcd.init();                     
  lcd.backlight(); // Включаем подсветку дисплея
}
void Start_viev(){ // Показать заставку
  lcd.clear();
  lcd.print("system 1+4+4");
  lcd.setCursor(0, 1);
  lcd.print("qwone");
}
// ================ Устройство 0 =================================
const int Dev0_Pin=2;//  вывод устройствa 0
void Dev0_ini(){ //  инициализация устройствa 0
  
}
void Dev0_viev(){// показать экран устройствa 0
  lcd.clear();
  lcd.print("Device 0");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev0_Short(){ //  действие  устройствa 0 при коротком нажатии
 N_screen = 0 ; // установить экран устройства 0
 Serial.println("Short press 0");
}
void Dev0_Long(){ //  инициализация устройствa 0 при длином нажатии
 N_screen = 0 ; // установить экран устройства 0
 Serial.println("Long press 0");
}
// ============= Устройство 1 =====================================
const int Dev1_Pin=3;//  вывод устройствa 1
void Dev1_ini(){ //  инициализация устройствa 1
}
void Dev1_viev(){// показать  экран устройствa 1
  lcd.clear();
  lcd.print("Device 1");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev1_Short(){ //  действие  устройствa 1 при коротком нажатии
  N_screen = 1 ; // установить экран устройства 1
  Serial.println("Short press 1");
}
void Dev1_Long(){ //  инициализация устройствa 1 при длином нажатии
  N_screen = 1 ; // установить экран устройства 1
  Serial.println("Long press 1");
}
// ================ Устройство 2 ===================================
const int Dev2_Pin=4;//  вывод устройствa 2
void Dev2_ini(){ //  инициализация устройствa 2
}
void Dev2_viev(){// показать экран устройствa 2
  lcd.clear();
  lcd.print("Device 2");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev2_Short(){ //  действие  устройствa 2 при коротком нажатии
  N_screen = 2 ; // установить экран устройства 2 
  Serial.println("Short press 2");
}
void Dev2_Long(){ //  инициализация устройствa 2 при длином нажатии
    N_screen = 2 ; // установить экран устройства 2
  Serial.println("Long press 2");
}
// ================ Устройство 3 ====================================
const int Dev3_Pin=5;//  вывод устройствa 3
void Dev3_ini(){ //  инициализация устройствa 3
}
void Dev3_viev(){// показать экран устройствa 3
  lcd.clear();
  lcd.print("Device 3");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev3_Short(){ //  действие  устройствa 3 при коротком нажатии
  N_screen = 3 ; // установить экран устройства 3
  Serial.println("Short press 3");
}
void Dev3_Long(){ //  инициализация устройствa 3 при длином нажатии
  N_screen = 3 ; // установить экран устройства 3
  Serial.println("Long press 3");
}
// =========== Устройство 4 ========================================
const int Dev4_Pin=6;//  вывод устройствa 4
void Dev4_ini(){ //  инициализация устройствa 4
}
void Dev4_viev(){// показать экран устройствa 4
  lcd.clear();
  lcd.print("General screen");
  lcd.setCursor(0, 1);
  lcd.print("Device 4");
}
void Dev4_Short(){ //  действие  устройствa 4 при коротком нажатии
  N_screen = 4 ; // установить экран устройства 4
  Serial.println("Short press 4");
}
void Dev4_Long(){ //  инициализация устройствa 4 при длином нажатии
  N_screen = 4 ; // установить экран устройства 4
  Serial.println("Long press 4");
}
// ============= Устройство 5 ======================================
const int Dev5_Pin=7;//  вывод устройствa 5
void Dev5_ini(){ //  инициализация устройствa 5
}
void Dev5_viev(){// показать экран устройствa 5
  lcd.clear();
  lcd.print("Device 5");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev5_Short(){ //  действие  устройствa 5 при коротком нажатии
  N_screen = 5 ; // установить экран устройства 5
  Serial.println("Short press 5");
}
void Dev5_Long(){ //  инициализация устройствa 5 при длином нажатии
  N_screen = 5 ; // установить экран устройства 5
  Serial.println("Long press 5");
}
// =============== Устройство 6 =====================================
const int Dev6_Pin=8;//  вывод устройствa 6
void Dev6_ini(){ //  инициализация устройствa 6
}
void Dev6_viev(){// показать экран устройствa 6
  lcd.clear();
  lcd.print("Device 6");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev6_Short(){ //  действие  устройствa 6 при коротком нажатии
  N_screen = 6 ; // установить экран устройства 6
  Serial.println("Short press 6");
}
void Dev6_Long(){ //  инициализация устройствa 6 при длином нажатии
  N_screen = 6 ; // установить экран устройства 6
  Serial.println("Long press 6");
}
// ================== Устройство 7 ====================================
const int Dev7_Pin=9;//  вывод устройствa 7
void Dev7_ini(){ //  инициализация устройствa 7
}
void Dev7_viev(){//показать  экран устройствa 7
  lcd.clear();
  lcd.print("Device 7");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev7_Short(){ //  действие  устройствa 7 при коротком нажатии
  N_screen = 7 ; // установить экран устройства 7
  Serial.println("Short press 7");
}
void Dev7_Long(){ //  инициализация устройствa 7 при длином нажатии
  N_screen = 7 ; // установить экран устройства 7
  Serial.println("Long press 7");
}
// ====================== Устройство 8 ==================================
const int Dev8_Pin=13;//  вывод устройствa 8
void Dev8_ini(){ //  инициализация устройствa 8
  pinMode(Dev8_Pin, OUTPUT);
}
void Dev8_viev(){// показать экран устройствa 8
  lcd.clear();
  lcd.print("Device 8");
  lcd.setCursor(0, 1);
  lcd.print("none");
}
void Dev8_Short(){ //  действие  устройствa 8 при коротком нажатии
  N_screen = 8 ; // установить экран устройства 8
  digitalWrite(Dev8_Pin, HIGH);
  Serial.println("Short press 8");
}
void Dev8_Long(){ //  инициализация устройствa 8 при длином нажатии
  N_screen = 8 ; // установить экран устройства 8
  digitalWrite(Dev8_Pin, LOW);
  Serial.println("Long press 8");
}
// ============ функция обработки аналоговой части джойстика Arduino  =====
const int VRx_Pin=A0;// аналоговый вывод VRx джойстика Arduino
const int VRy_Pin=A1;// аналоговый вывод VRy джойстика Arduino
uint16_t VRx;
uint16_t VRy;
uint8_t AnalogRd(){
  VRx = analogRead(VRx_Pin);
  VRy = analogRead(VRy_Pin);
  return((VRx>340)+(VRx>680)+3*(VRy>340)+3*(VRy>680));
};
void DoShort(){ // делать при коротком нажатии
  switch (AnalogRd()) {
    case 0:  Dev0_Short();//делать когда  равно 0
      break;
    case 1:  Dev1_Short();//делать когда  равно 1
      break;
    case 2:  Dev2_Short();//делать когда  равно 2
      break;
    case 3:  Dev3_Short();//делать когда  равно 3
      break;
    case 4:  Dev4_Short();//делать когда  равно 4
      break;
    case 5:  Dev5_Short();//делать когда  равно 5
      break;
    case 6:  Dev6_Short();//делать когда  равно 6
      break;
    case 7:  Dev7_Short();//делать когда  равно 7
      break;
    case 8:  Dev8_Short();//делать когда  равно 8
      break;                  
  }
}
void DoLong(){ // делать при длином нажатии
  switch (AnalogRd()) {
    case 0:  Dev0_Long();//делать когда  равно 0
      break;
    case 1:  Dev1_Long();//делать когда  равно 1
      break;
    case 2:  Dev2_Long();//делать когда  равно 2
      break;
    case 3:  Dev3_Long();//делать когда  равно 3
      break;
    case 4:  Dev4_Long();//делать когда  равно 4
      break;
    case 5:  Dev5_Long();//делать когда  равно 5
      break;
    case 6:  Dev6_Long();//делать когда  равно 6
      break;
    case 7:  Dev7_Long();//делать когда  равно 7
      break;
    case 8:  Dev8_Long();//делать когда  равно 8
      break;                  
  }  
}
// ================== antidelay замена обычного delay  =================
void antidelay(uint32_t timing){
timing += millis();
while(millis()<=timing);
};
// === функция обработки кнопки джойстика Arduino ===
const int SW_Pin=A2;// вывод SW кнопки  джойстика Arduino 0 нажата 1 нет
uint32_t last_millis; // переменные: последний  millis

uint8_t botton(){
  if (digitalRead(SW_Pin) == 1){ // кнопка не нажата     
     last_millis = millis();
     return 0;}
   antidelay(30);
   while (digitalRead(SW_Pin) == 0);
   antidelay(30);
   if (last_millis+65 > millis()){ // ложное срабатывание
     last_millis = millis();
     return 0;}
   if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
     last_millis = millis();
     return 1;}
   last_millis = millis(); // длинное нажатие больше 0.30 сек
   return 2;
};

// ======================= главная часть программы ========================
void setup() 
{  
  Serial.begin(9600); // Запускаем последовательный порт
  LCD_ini() ; //  инициализация LCD1602 по I2C
  Dev0_ini(); //  инициализация устройствa 0
  Dev1_ini(); //  инициализация устройствa 1
  Dev2_ini(); //  инициализация устройствa 2
  Dev3_ini(); //  инициализация устройствa 3
  Dev4_ini(); //  инициализация устройствa 4
  Dev5_ini(); //  инициализация устройствa 5
  Dev6_ini(); //  инициализация устройствa 6
  Dev7_ini(); //  инициализация устройствa 7
  Dev8_ini(); //  инициализация устройствa 8
  pinMode(SW_Pin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром 
  last_millis = millis();

  
}
void loop()
 {
   if ( ! Time_per_500msec.go()) {  // выполнять под условием раз 0.5 сек
    switch (N_screen) {
      case 0:Dev0_viev(); // показать экран устройствa 0
        break;
      case 1:Dev1_viev(); // показать экран устройствa 1
        break;
      case 2:Dev2_viev(); // показать экран устройствa 2
        break;
      case 3:Dev3_viev(); // показать экран устройствa 3
        break;
      case 4:Dev4_viev(); // показать экран устройствa 4
        break;
      case 5:Dev5_viev(); // показать экран устройствa 5
        break;
      case 6:Dev6_viev(); // показать экран устройствa 6
        break;
      case 7:Dev7_viev(); // показать экран устройствa 7
        break;
      case 8:Dev8_viev(); // показать экран устройствa 8
        break;
      case 9:Start_viev();// показать заставку 
        break;                        
    }
   }
   switch (botton()) {
      case 1: Short_press_Beep();
         DoShort();
         break;
     case 2:  Long_press_Beep();
         DoLong();
         break;
   } 
 }

Неактивний

#13 2016-08-11 11:01:27

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

qwone пише:

delay () рубит прерывание

В капусту? А ежели букварь почитать?

Неактивний

#14 2016-08-11 11:02:41

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Объясните пожилому человеку, чего то я уже вообще умом слаб стал roll , некоторые вещи. Какое прерывание "рубит" delay()? И еще, вот просмотрел ( именно "просмотрел" особо не вникая ) скетч, возникает естественный вопрос что же это за чудо "структурированная" программа? Что в построении этого скетча такого использовано что можно даже термин дать "структурированная" от всех остальных "скатертей салата"  big_smile ?

Неактивний

#15 2016-08-11 11:55:00

Green
Учасник
Зареєстрований: 2015-11-08
Повідомлень: 593

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Просто, много писателей развелось. Вот и пишут чего непопадя.

Неактивний

#16 2016-08-11 14:59:36

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Green пише:

Просто, много писателей развелось. Вот и пишут чего непопадя.

Пусть пишут  smile это лучше чем пить пиво где непопадя  wink . Просто надо немножко "направлять", что бы допустим не путали  прерывание и паузу, объяснить что:
// === antidelay замена обычного delay  ===
void antidelay(uint32_t timing){
timing += millis();
while(millis()<=timing);
};
Это просто та же пауза, только не понятно зачем написана если есть delay(). Ну подумаешь человек не совсем улавливает разницу между понятием interrupts и delay big_smile . Подвести к пониманию что если не "поцепить" кнопку на пин INT0 или INT1 то пользы от его скетча 0 целых фиг десятых. Для этого и надо задавать "правильные" вопросы big_smile.

Остання редакція Nefreemen (2016-08-11 15:00:25)

Неактивний

#17 2016-08-12 21:09:58

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

/* Программа : Разработка Модульного и структурного строительства программ
 * Система: 9 экранов или 1+4+4 экрана разумеется 
 *  Написал : qwone. Не для своей гордыни, а так что бы люди знали с кого спрашивать за это.
 *  
 *  Схема подключения
 *  Ардуино джойстик  GND -> GND
                      +5V -> +5V
                      VRx -> A0
                      VRy -> A1
                      SW  -> A2

 I2C LCD1602          GND -> GND 
                      +5V -> +5V
                      SDA -> A4(SDA)
                      SCL -> A5(SCL)

 пьезопищалку          -  -> GND 
                       +  -> не подключен
                       S  -> pin 12                  
                      
  Устройство 1        PIN -> 2
  Устройство 2        PIN -> 3
  Устройство 3        PIN -> 13

*/

// ============= Переменные  ====================================
// системные переменые
uint8_t mode_viev     ; // 1 режим показа / 0 режим редактирования 
uint8_t N_screen      ; // номер текущего демонстрируемого окна
uint8_t botton_data   ; // результат функции botton()
uint8_t AnalogRd_data ; // результат функции AnalogRd();
// технологические переменые

uint8_t Var_V1     = 50  ; // Переменная 1
const uint8_t Var_V1_min = 0    ; // Переменная 1 min
const uint8_t Var_V1_max = 100  ; // Переменная 1 maх
void Var_V1_inc(){
  if (Var_V1 < Var_V1_max) Var_V1++;
};
void Var_V1_dec(){
  if (Var_V1 > Var_V1_min) Var_V1--;
};

uint8_t Var_V2     = 50  ; // Переменная 2
const uint8_t Var_V2_min = 0    ; // Переменная 2 min
const uint8_t Var_V2_max = 100  ; // Переменная 2 maх
void Var_V2_inc(){
  if (Var_V2 < Var_V2_max) Var_V2++;
};
void Var_V2_dec(){
  if (Var_V2 > Var_V2_min) Var_V2--;
};

uint8_t Var_V3     = 50  ; // Переменная 3
uint8_t Var_V3_min = 0    ; // Переменная 3 min
uint8_t Var_V3_max = 100  ; // Переменная 3 maх
void Var_V3_inc(){
  if (Var_V3 < Var_V3_max) Var_V3++;
};
void Var_V3_dec(){
  if (Var_V3 > Var_V3_min) Var_V3--;
};
// ============= Устройство 1 =====================================
const int Dev1_Pin = 3 ;    //  вывод устройствa 1
void Dev1_ini(){            //  инициализация устройствa 1
}  
// ============= Устройство 2 =====================================
const int Dev2_Pin = 4 ;    //  вывод устройствa 2
void Dev2_ini(){            //  инициализация устройствa 2
}  
// ============= Устройство 3 =====================================
const int Dev3_Pin = 13;    //  нога устройствa 3
uint8_t   Dev3_stat ;   // состояние светодиода
void      Dev3_ini(){            //  инициализация устройствa 3
  pinMode(Dev3_Pin, OUTPUT);
  Dev3_stat =0;
  digitalWrite(Dev3_Pin, Dev3_stat);  
} 
void Dev3_com(){            //  исполнение команды  устройством 3
    Dev3_stat = !Dev3_stat;
  digitalWrite(Dev3_Pin, Dev3_stat); 
} 

// === функция обработки кнопки джойстика Arduino ===
const int SW_Pin=A2;// вывод SW кнопки  джойстика Arduino 0 нажата 1 нет
uint32_t last_millis; // переменные: последний  millis
uint8_t botton(){
  if (digitalRead(SW_Pin) == 1){ // кнопка не нажата     
     last_millis = millis();
     return 0;}
   antidelay(30);
   while (digitalRead(SW_Pin) == 0);
   antidelay(30);
   if (last_millis+65 > millis()){ // ложное срабатывание
     last_millis = millis();
     return 0;}
   if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
     last_millis = millis();
     return 1;}
   last_millis = millis(); // длинное нажатие больше 0.30 сек
   return 2;
};
void Edit_Short(){ // действие  режим редактирование короткое нажатие
 Serial.println(AnalogRd_data+9*N_screen);
 switch (AnalogRd_data+9*N_screen) {
    case 0:                 // 0 экран влево-вверх
      break;
    case 1:                 // 0 экран вверх
      break;
    case 2:                 // 0 экран вправо-вверх
      break;
    case 3:  Var_V1_dec();   // 0 экран влево
      break;
    case 4:  Var_V1_inc();   // 0 экран центр
      break;
    case 5:  Var_V1_inc();  // 0 экран вправо
      break;
    case 6:                 // 0 экран влево-вниз
      break;
    case 7:                 // 0 экран вниз:
      break;
    case 8:                 // 0 экран вправо-вниз
      break;
    case 9:     // 1 экран влево-вверх
      break;
    case 9+3: Var_V2_dec();   // 1 экран влево
      break;
    case 9+4: Var_V2_inc();   // 1 экран центр
      break;
    case 9+5: Var_V2_inc();   // 1 экран вправо 
      break; 
    case 18+3: Var_V3_dec();   // 2 экран влево
      break;
    case 18+4: Var_V3_inc();   // 2 экран центр 
      break;
    case 18+5: Var_V3_inc();   // 2 экран вправо 
      break; 
     case 76: Dev3_com();   // 8 экран центр 
      break;                              
  }

}


// ============= Подключение LCD1602 по I2C =====================
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

void LCD_ini(){ //  инициализация дисплея
  mode_viev = 1; // установить режим показа
  N_screen  = 4; // показать экран 4
  lcd.init();                     
  lcd.backlight(); // Включаем подсветку дисплея
}
// ================ Экран 0 =======================================
void Screen0_viev(){// показать экран  0
  lcd.clear();
  if (mode_viev) lcd.print(" ");   // показ значка обычный режим
            else lcd.print("E");   // показ значка  режим редактирования  
  lcd.print(" V1 ") ;
  lcd.print(Var_V1) ;
  lcd.setCursor(0, 1) ;
  lcd.print(N_screen)  ;
  lcd.print(" ") ;
}
// ================ Экран 1 =================================
void Screen1_viev(){// показать  экран  1
  lcd.clear();
  if (mode_viev) lcd.print(" ");   // показ значка обычный режим
            else lcd.print("E");   // показ значка  режим редактирования
  lcd.print(" V2 ") ;
  lcd.print(Var_V2) ;
  lcd.setCursor(0, 1);
  lcd.print(N_screen)  ;
  lcd.print(" ");
}
// ================ Экран 2 ===================================
void Screen2_viev(){// показать экран  2
  lcd.clear();
  if (mode_viev) lcd.print(" ");   // показ значка обычный режим
            else lcd.print("E");   // показ значка  режим редактирования 
   lcd.print(" V3 ") ;
  lcd.print(Var_V3) ;
  lcd.setCursor(0, 1);
  lcd.print(N_screen)  ;
  lcd.print(" ");
}
// ================ Экран 3 ====================================
void Screen3_viev(){// показать экран  3
  lcd.clear();
  if (mode_viev) lcd.print(" ");
            else lcd.print("E"); 
  lcd.print(" *** ");
  lcd.setCursor(0, 1);
  lcd.print(N_screen)  ;
  lcd.print(" ");
}
// ================ Экран 3 ====================================
void Screen4_viev(){// показать экран  4
  lcd.clear();
  if (mode_viev) lcd.print(" ");
            else lcd.print("E"); 
  lcd.print(" *** ");
  lcd.setCursor(0, 1);
  lcd.print(N_screen)  ;
  lcd.print(" ");
}

// ============= Экран 5 ======================================
void Screen5_viev(){// показать экран устройствa 5
  lcd.clear();
  if (mode_viev) lcd.print(" ");
            else lcd.print("E"); 
  lcd.print(" *** ");
  lcd.setCursor(0, 1);
  lcd.print(N_screen)  ;
  lcd.print("  ");
}

// =============== Экран 6 =====================================
void Screen6_viev(){        // показать экран устройствa 6
  lcd.clear();
  if (mode_viev) lcd.print(" ");
            else lcd.print("E"); 
  lcd.print(" *** ");
  lcd.setCursor(0, 1);
  lcd.print(N_screen)  ;
  lcd.print(" ");
}

// ================== Экран 7 ====================================
void Screen7_viev(){              //показать  экран устройствa 7
  lcd.clear();
  if (mode_viev) lcd.print(" ");
            else lcd.print("E"); 
  lcd.print(" *** ");
  lcd.setCursor(0, 1);
  lcd.print(N_screen)  ;
  lcd.print(" ");
}

// ====================== Экран 8 ==================================
void Screen8_viev(){// показать экран устройствa 8
  lcd.clear();
  if (mode_viev) lcd.print(" ");
            else lcd.print("E"); 
  lcd.print(" *** ");
  lcd.setCursor(0, 1);
  lcd.print(N_screen)  ;
  lcd.print(" VD13 ");
  lcd.print(Dev3_stat);
}
// ============= Подключение пьезопищалку =====================
const int Beep_Pin=12;//  вывод пьезопищалки S
void Short_press_Beep(){
  tone(Beep_Pin,700,100);
}
void Long_press_Beep(){
  tone(Beep_Pin,1000,100); 
}
void alarm_Beep(){
 tone(Beep_Pin,2000, 1000);
}
// ========== базовый класс   "согласовки" ==================
class qw_basic {            
  public:  
    qw_basic(uint32_t span);
    virtual uint8_t go();
protected:    
    uint32_t span;         // интервал гашения или включения
    uint32_t future;     // время сменить состояние гашения или включения    
};
qw_basic::qw_basic(uint32_t span){
    this->span = span ;
    future = span +  millis();
}
uint8_t qw_basic::go() {           // конструктор qw_basic
    if (millis() < future) return 1;
    future  = span + millis();
    return 0;
}
qw_basic Time_per_500msec(500); // создание объекта представителя Делать раз в 0.5 сек

// ============ функция обработки аналоговой части джойстика Arduino  =====
const int VRx_Pin=A0;// аналоговый вывод VRx джойстика Arduino
const int VRy_Pin=A1;// аналоговый вывод VRy джойстика Arduino
uint16_t VRx;
uint16_t VRy;
uint8_t AnalogRd(){
  VRx = analogRead(VRx_Pin);
  VRy = analogRead(VRy_Pin);
  return((VRx>340)+(VRx>680)+3*(VRy>340)+3*(VRy>680));
};
// ================== antidelay замена обычного delay  =================
void antidelay(uint32_t timing){
timing += millis();
while(millis()<=timing);
};


// ======================= главная часть программы ========================
void setup() 
{  
  Serial.begin(9600); // Запускаем последовательный порт
  LCD_ini() ; //  инициализация LCD1602 по I2C
  Dev1_ini(); //  инициализация устройствa 1
  Dev2_ini(); //  инициализация устройствa 2
  Dev3_ini(); //  инициализация устройствa 3
  pinMode(SW_Pin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром 
  last_millis = millis();
}
void loop(){
   if ( ! Time_per_500msec.go()) {  // выполнять под условием раз 0.5 сек
    switch (N_screen) {
      case 0:Screen0_viev();break; // показать экран устройствa 0
      case 1:Screen1_viev();break;  // показать экран устройствa 1
      case 2:Screen2_viev();break;  // показать экран устройствa 2
      case 3:Screen3_viev();break;  // показать экран устройствa 3
      case 4:Screen4_viev();break;  // показать экран устройствa 4
      case 5:Screen5_viev();break;  // показать экран устройствa 5
      case 6:Screen6_viev();break;  // показать экран устройствa 6
      case 7:Screen7_viev();break;  // показать экран устройствa 7
      case 8:Screen8_viev();break;  // показать экран устройствa 8
    }
   }
   botton_data = botton(); // 0 не нажата / 1 короткое нажатие / 2 длиное нажатие
   // mode_viev 1 режим показа / 0 режим редактирования
   AnalogRd_data = AnalogRd();
   if ( botton_data == 1 )Short_press_Beep();
   if ( botton_data == 2 ) Long_press_Beep();
   if (mode_viev){      // mode_viev  =1 режим показа / 0 режим редактирования
        if (botton_data == 1 )  N_screen = AnalogRd_data;
        if ((botton_data == 2 )&& (AnalogRd_data == 7))  mode_viev = 0 ; 
      }
      else {
        if (botton_data == 1 )  Edit_Short() ;
        if ((botton_data == 2 )&& (AnalogRd_data == 7))  mode_viev = 1 ;       
      };  
}
 /*  Выбор экрана - положение джойстика + короткое нажатие
  *  Вход в режим редактирования - джойстик вниз  + длиноеое нажатие
  *  Редактирование  джойстик влево + короткое нажатие = декримент
  *  Редактирование  джойстик центр + короткое нажатие = инкремент
  *  Выход из режима редактирования - джойстик вниз + длиное нажатие
  */

Неактивний

#18 2016-08-12 22:55:55

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Я тихо плакаль...qwone, умерьте все таки  гордыню, уберите хотя бы ляпы...Сколько Вам можно намекать. Может Вам прямо сказать: ваш антиделай глупость, кнопка не на прерывании глупость.

Неактивний

#19 2016-08-12 23:25:55

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Мне эта команда не мешает.
Тем более она короче при компиляции.
голый загрузчик   450 байт 
antidelay()    552 байт
delay()  612 байт

Остання редакція qwone (2016-08-12 23:33:03)

Неактивний

#20 2016-08-12 23:41:45

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

vvr пише:
lkj пише:

qwone, Смотри на свой бред и исправляй. Если тебе нравиться, то можешь оставить.
А пока это ты “трепло”.

ты не прав...
если чел выкладывает свои наработки - спасибо ему.
а использовать их или нет - дело сугубо личное.

ну а если хаять хочется то покажи что то лучшее или правильнее, иначе пустая трепня))))

Вы, наверное, прикалываетесь smile

Неактивний

#21 2016-08-13 00:50:46

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Nazar пише:
Nefreemen пише:

qwone, никак не пойму что это за "странный"  roll antidelay?  Нафиг он вообще такой? Чем обычный delay не угодил lol ?

delay(); останавливает программу на заданное кол-во времени(Именно останавливает). Если программа сложная, и должна работать быстро, то delay(); явно не вариант!

// === antidelay замена обычного delay  ===
void antidelay(uint32_t timing){
timing += millis();
while(millis()<=timing);
};
А по Вашему в пустом цикле она что то делает  lol ? Наверное скорость набирает  lol  lol .

Остання редакція Nefreemen (2016-08-13 01:08:05)

Неактивний

#22 2016-08-13 01:19:06

Nefreemen
Учасник
З Киев
Зареєстрований: 2015-12-19
Повідомлень: 716

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

qwone пише:

Мне эта команда не мешает.
Тем более она короче при компиляции.
голый загрузчик   450 байт 
antidelay()    552 байт
delay()  612 байт

Толи Вася грузчик голый roll толи голая команда загрузчиков roll. Но однозначно то, что кто то из них имеет покороче lol . И это им явно не мешает  lol .

Остання редакція Nefreemen (2016-08-13 01:29:28)

Неактивний

#23 2016-08-13 11:16:38

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

qwone пише:

Нажимаешь коротко сообщение "Short press" длиное "Long press".

const int buttonPin=2; // вывод кнопки 0 нажата 1 нет
uint32_t last_millis; // переменные: последний  millis

uint8_t botton(){

    /* Обратите внимание!  При первом вызове этой функции last_millis = millis() в Setup 
	потом в last_millis будет запоминаться прошедшее время для нового отсчета в этой       
        функции при
        выходе из функции */

    // Правильнее запоминать в самом начале этой функции  last_millis = millis()
	
    if (digitalRead(buttonPin) == 1){ //если кнопка не нажата, 
	 last_millis = millis();	           //то запоминаем время и    
	return 0;}					   //выход из функции с возвратом кода 0
	
	/* запоминать прошедшее время для нового отсчета  не следует при выходе из функции,
	    потому что будет сильно отставать от millis()
            т.е last_millis = millis() в то время как millis() увеличивает свое значение 
            в loop или в другой функции
            до вызова botton() соответственно всегда будет millis() больше last_millis
	
	/* Получается, в данном коде, для корректной работы перед вызовом botton() нужно 
            запоминать текущее время last_millis = millis(), иначе значение millis() будет больше
	    и условие не сработает
	    if (last_millis+300 > millis()) */
	
	//предполагаем, что кнопка нажата
	delay(30); / * приостановить программу на 30 миллисекунд 
                            это будет программное подавление дребезга кнопки */
	/* в цикле while подождать пока не будет отжата а кнопка,
            но кнопка  может быть нажата сколько угодно долго */
	while (digitalRead(buttonPin) == 0); 
	delay(30); /* приостановить программу на 30 миллисекунд это будет программное подавление 
                           дребезга после отжатия кнопки */
	//Кнопка уже отжата, delay - лишнее
	//поэтому  это условие не сработает, еще 2 х delay(30) дадут задержку 60 миллисекунд 
	
	if (last_millis+65 > millis()){ // ложное срабатывание
		//Serial.println(millis()-last_millis);
		last_millis = millis();
	return 0;}
	
	//не правильное условие, что если last_millis+300 > millis() будет меньше  
	if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
		//Serial.println(millis()-last_millis);
		last_millis = millis();
	return 1;}
	//Serial.println(millis()-last_millis);
	last_millis = millis(); // длинное нажатие больше 0.30 сек
	return 2;
};

void setup()
{
	Serial.begin(9600); // Запускаем последовательный порт
	pinMode(buttonPin, INPUT_PULLUP); // вывод на ввод с подтягивающим резистром
	last_millis = millis();   
}

void loop()
{
  switch (botton()) {
	  case 1:  Serial.println("Short press");
	  break;
	  case 2:  Serial.println("Long press");
	  break;
  }

}

Неактивний

#24 2016-08-13 14:54:28

qwone
Учасник
Зареєстрований: 2016-07-25
Повідомлень: 143

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

Я не понял, что вы хотели сказать в последнем сообщении?

Неактивний

#25 2016-08-13 17:03:40

lkj
Учасник
Зареєстрований: 2016-02-03
Повідомлень: 104

Re: Программа с кнопкой (короткое нажатие и длиное нажатие)

qwone пише:

Я не понял, что вы хотели сказать в последнем сообщении?

Для отчета времени вы пишите last_millis = millis() при выходе из функции опроса кнопки.
Получается, если кнопка не нажата или нажата, то вы запоминаете время  last_millis = millis() и выходите из функции. Где-то в коде после вызова нескольких функций вы снова вызываете botton() для определения нажатой кнопки. В то время значение счетчика millis()  уже  больше по сравнению last_millis.
……..
while (digitalRead(buttonPin) == 0);
delay(30);
……..
Цикл while будет выполняться до тех пор пока не будет отжата кнопка,  выход из цикла будет, когда кнопка отжата, т.е состояние кнопки было уже прочитано в цикле, поэтому
delay(30)  лишнее

за это время счетчик  millis() также увеличится и его значение будет больше

last_millis содержит меньшее значение времени по сравнению к millis(), потому что время было  записано при выходе из функции
……..
if (last_millis+300 > millis()){ // короткое нажатие меньше 0.30 сек
    //Serial.println(millis()-last_millis);
    last_millis = millis();
    return 1;}
last_millis = millis(); // длинное нажатие больше 0.30 сек
    return 2;
……..
Это условие не корректное, потому что если  (last_millis+300 > millis()) будет меньше, чем  millis(), то выполняется return 2, это будет считаться “длиное” нажатие кнопки, а было на самом деле “короткое” нажатие кнопки.

Правильнее запоминать в самом начале этой функции  last_millis = millis(), а в условии прошедшее время вычитать из текущего millis().

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

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