#1 2020-12-22 15:34:50

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

Помогите доделать простой скетч за денежку

Друзья, кто и за сколько денег поможет мне допилить несложную функцию в скетч, я не учил C++ и пока не планирую, делаю скетчи при помощи библиотек и методом научного тыка, но тут уже без знаний никуда. Использовал библиотеку Гайвера обработки кнопок, есть 3 кнопки - load, unload и motorstop. В скетче расписаны разные варианты отработки нажатий кнопки - просто клик isClick, одиночное нажатие isSingle, двойное нажатие isDouble и тройное isTriple, удержание кнопки isHold, функция isStep - выдача серии сообщений с заданным интервалом пока держишь кнопку.

Значит что требуется допилить:

- При клике на кнопку load  (событие load.isClick) в сериал должна запуститься выдача сообщения "StartLoad" с периодичностью например 100ms максимум на время например 1 минута, но при клике на кнопку motorstop - (событие motorstop.isClick) выдача сообщений "StartLoad" должна прекратиться и 1 раз выдается сообщение "LoadStop", также эта серия должна остановиться при длительном нажатии на кнопку load (событие load.isStep) и пока держишь кнопку должна отрабатываться выдача сообщений "LoadStep" в соответствии с этой функцией библиотеки.

- то же самое надо сделать и по отношению к кнопке unload - клик unload.isClick - запуск серии сообщений "StartUnload" интервал 100ms на 1 минуту, остановить серию преждевременно можно кликом на motorstop (событие motorstop.isClick) с однократной выдачей "UnloadStop" или же долгим нажатием на кнопку unload (unload.isStep)  с выдачей "UnloadStep" в соответствии с заданным в библиотеке или настройках интервалом.

Требуется сделать это все без применения delay. Код должен быть простым и правильным))
Что-то мне там люди советовали это делать при помощи флагов, но я в этом ниче не шурупаю и нет сил разбираться, сделал запуск серии при помощи for (;;) , но мне сказали  так неправильно и не все из задуманного таким образом получилось реализовать, поэтому жду Ваших предложений.

#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip

GButton load;
GButton unload;
GButton motorstop;

void setup() {
  Serial.begin(9600);
  load.setStepTimeout(81);
  unload.setStepTimeout(81);
}
void loop() {
  int analog = analogRead(7);
  motorstop.tick(analog < 940 && analog > 865); //2
  load.tick(analog < 1024 && analog > 940); //1
  unload.tick(analog < 865 && analog > 800); //3
  if (motorstop.isSingle()) Serial.println("mStopSingle");
  if (motorstop.isHold()) Serial.println("mStopHold");
  if (motorstop.isDouble()) Serial.println("mStopDouble");
  if (motorstop.isTriple()) Serial.println("mStopTriple");
  
  motorstop.resetStates();
 if (unload.isStep()) {Serial.println("UnLoadStep");}
  if (unload.isClick()) {
  Serial.println("StartLoad");
  }
  if (load.isStep()) {Serial.println("loadStep");}
  if (load.isClick()) {
  Serial.println("StartUnload");
  }
}

Неактивний

#2 2020-12-22 15:44:50

renoshnik
Учасник
Зареєстрований: 2017-04-03
Повідомлень: 819

Re: Помогите доделать простой скетч за денежку

martinways пише:

Друзья, кто и за сколько денег поможет мне ...

Лучше озвучь сразу сумму которую готов потратить на помощь, так дело пойдет веселее...

Неактивний

#3 2020-12-22 15:56:15

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

Re: Помогите доделать простой скетч за денежку

А я откуда знаю расценки? Блин, ну я понимаю, что это не супер-сложная задача для тех, кто в теме. Делаю устройство для себя. 200грн например.

Неактивний

#4 2020-12-22 16:07:26

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

Re: Помогите доделать простой скетч за денежку

Есть вот мой вариант скетча на основе запуска FOR, но в нем 3 проблемы - не получается добавить в void runLoad() и void runUnload()  остановку при помощи load.isStep или unload.isStep (пробовал дописывать условие else if, но не работает, может неправильно дописывал), а также если запустил серию кликом load.isClick, то если еще раз сделать клик на нее, то она уже не останавливается одним нажатием motorstop, просто проскакивает сообщение StopLoad, а серия продолжается и только по второму нажатию motorstop срабатывает остановка, ну и нет ограничения по времени. Может будет дешевле и проще доделать этот полурабочий скетч и фиг с ними уже с этими  флагами

#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip

GButton load;
GButton unload;
GButton motorstop;

long previousMillis = 0;
long interval = 100;
void runLoad(){
  for (;;){  
  int analog = analogRead(7);
  load.tick(analog < 1024 && analog > 940); //1
  motorstop.tick(analog < 940 && analog > 865);//2
  if (motorstop.isClick()){
   Serial.println("LoadStop");
   break;
  }
  else {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) 
  {
  previousMillis = currentMillis;
  Serial.println("StartLoad");
  }
}
}
}

void runUnload(){
  for (;;){  
  int analog = analogRead(7);
  unload.tick(analog < 865 && analog > 800); //3
  motorstop.tick(analog < 940 && analog > 865);//2
  if (motorstop.isClick()){
   Serial.println("UnloadStop");
   break;
  }
  else {
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > interval) 
  {
  previousMillis = currentMillis;
  Serial.println("StartUnload");
  }
}
}
}

void setup() {
  Serial.begin(9600);
  load.setStepTimeout(81);
  unload.setStepTimeout(81);
}
void loop() {
  int analog = analogRead(7);
  motorstop.tick(analog < 940 && analog > 865); //2
  load.tick(analog < 1024 && analog > 940); //1
  unload.tick(analog < 865 && analog > 800); //3
  if (motorstop.isSingle()) Serial.println("mStopSingle");
  if (motorstop.isHold()) Serial.println("mStopHold");
  if (motorstop.isDouble()) Serial.println("mStopDouble");
  if (motorstop.isTriple()) Serial.println("mStopTriple");
  
  motorstop.resetStates();
 if (load.isStep()) {Serial.println("LoadStep");}
  if (load.isClick()) {
  Serial.println("StartLoad");
  runLoad();
  }
  if (unload.isStep()) {Serial.println("UnloadStep");}
  if (unload.isClick()) {
  Serial.println("StartUnload");
  runUnload();
  }
}

Остання редакція martinways (2020-12-22 16:41:26)

Неактивний

#5 2020-12-22 18:16:02

Honey
Учасник
З Киев
Зареєстрований: 2020-09-26
Повідомлень: 41

Re: Помогите доделать простой скетч за денежку

Вот пример, как пользоваться флагами:

uint8_t flag1;
uint32_t mil1, mil1end;
for (;;) {
    if (клик1) {
        flag1 = 1;
        mil1 = millis();
        mil1end = mil1 + 60*1000;
    }
    if (степ1) {
        flag1 = 0;
        принт("степ1");
    }
    if (клик2) {
        flag1 = 0;
        принт("стоп");
    }
    if (flag1 && millis() >= mil1) {
        принт("старт1");
        mil1 += 200;
        if (mil1 > mil1end) {
            flag1 = 0;
        }
    }
}

Неактивний

#6 2020-12-22 19:04:08

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

Re: Помогите доделать простой скетч за денежку

Подставил свои значения и вставил это все в void runUnload() , но не работает... Что за 200грн никто не хочет помочь? На дороге 200 не валяются, а если и валяются, то недолго))

#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip

GButton load;
GButton unload;
GButton motorstop;


void runUnload(){
  uint8_t flag1;
uint32_t mil1, mil1end;
int analog = analogRead(7);
  unload.tick(analog < 865 && analog > 800); //3
  motorstop.tick(analog < 940 && analog > 865); //2
for (;;) {
    if (unload.isClick()) {
        flag1 = 1;
        mil1 = millis();
        mil1end = mil1 + 60*1000;
    }
    if (unload.isStep()) {
        flag1 = 0;
        Serial.println("UnloadStep");
    }
    if (motorstop.isClick()) {
        flag1 = 0;
        Serial.println("UnLoadStop");
    }
    if (flag1 && millis() >= mil1) {
        Serial.println("StartUnload");
        mil1 += 200;
        if (mil1 > mil1end) {
            flag1 = 0;
        }
    }
}
}

void setup() {
  Serial.begin(9600);
  load.setStepTimeout(81);
  unload.setStepTimeout(81);
}
void loop() {
  int analog = analogRead(7);
  motorstop.tick(analog < 940 && analog > 865); //2
  load.tick(analog < 1024 && analog > 940); //1
  unload.tick(analog < 865 && analog > 800); //3
  if (motorstop.isSingle()) Serial.println("mStopSingle");
  if (motorstop.isHold()) Serial.println("mStopHold");
  if (motorstop.isDouble()) Serial.println("mStopDouble");
  if (motorstop.isTriple()) Serial.println("mStopTriple");
  
  motorstop.resetStates();
 if (load.isStep()) {Serial.println("LoadStep");}
  if (load.isClick()) {
  Serial.println("StartLoad");

  }
  if (unload.isStep()) {Serial.println("UnloadStep");}
  if (unload.isClick()) {
  Serial.println("StartUnload");
  runUnload();
  }
}

Остання редакція martinways (2020-12-22 19:16:29)

Неактивний

#7 2020-12-22 19:11:55

Honey
Учасник
З Киев
Зареєстрований: 2020-09-26
Повідомлень: 41

Re: Помогите доделать простой скетч за денежку

То, что в for(;;) {}, должно быть в Вашем void loop() {}. Удалите все и начните писать с нуля, отлаживая поэтапно.

Неактивний

#8 2020-12-22 19:17:38

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

Re: Помогите доделать простой скетч за денежку

То есть void runUnload вообще не нужно применять? Поместил все в Loop, тогда вообще все не работает, это тыкать пальцем в небо.... Еще что-то рабочее я могу изменить под себя, а с нуля эт сильно вряд ли..

#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip

GButton load;
GButton unload;
GButton motorstop;



void setup() {
  Serial.begin(9600);
  load.setStepTimeout(81);
  unload.setStepTimeout(81);
}
void loop() {
  int analog = analogRead(7);
  motorstop.tick(analog < 940 && analog > 865); //2
  load.tick(analog < 1024 && analog > 940); //1
  unload.tick(analog < 865 && analog > 800); //3
  if (motorstop.isSingle()) Serial.println("mStopSingle");
  if (motorstop.isHold()) Serial.println("mStopHold");
  if (motorstop.isDouble()) Serial.println("mStopDouble");
  if (motorstop.isTriple()) Serial.println("mStopTriple");
  
  motorstop.resetStates();
 if (load.isStep()) {Serial.println("LoadStep");}
  if (load.isClick()) {
  Serial.println("StartLoad");

  }
  if (unload.isStep()) {Serial.println("UnloadStep");}
  if (unload.isClick()) {
  Serial.println("StartUnload");
  }
  
uint8_t flag1;
uint32_t mil1, mil1end;
for (;;) {
    if (unload.isClick()) {
        flag1 = 1;
        mil1 = millis();
        mil1end = mil1 + 60*1000;
    }
    if (unload.isStep()) {
        flag1 = 0;
        Serial.println("UnloadStep");
    }
    if (motorstop.isClick()) {
        flag1 = 0;
        Serial.println("UnLoadStop");
    }
    if (flag1 && millis() >= mil1) {
        Serial.println("StartUnload");
        mil1 += 200;
        if (mil1 > mil1end) {
            flag1 = 0;
        }
    }
}
}

Остання редакція martinways (2020-12-22 19:23:27)

Неактивний

#9 2020-12-22 19:45:42

Honey
Учасник
З Киев
Зареєстрований: 2020-09-26
Повідомлень: 41

Re: Помогите доделать простой скетч за денежку

Сейчас Ваша программа выглядит примерно вот так:

loop() {
    клавиша = прочитать_клавишу();
    for (;;) {
        if (клавиша == значение) {
            принт("нажата клавиша значение");
        }
    }
}

Неактивний

#10 2020-12-22 19:54:13

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

Re: Помогите доделать простой скетч за денежку

Дорогой друг Honey, я понимаю, что Вы подсказываете загадками, чтобы я понял принцип и чему-то научился, благодарен Вам за это, но в данный момент для меня в приоритете затраченное время, мне просто нужно получить рабочий код, который я буду внедрять в гораздо бОльший скетч управления устройством, которое я задумал. Не могу себе позволить изучать сейчас C++ ради одного устройства, я не планирую становиться программистом))

Неактивний

#11 2020-12-22 22:45:01

Сергій_П
Учасник
Зареєстрований: 2020-02-08
Повідомлень: 18

Re: Помогите доделать простой скетч за денежку

Звернись на https://freelancehunt.ua/ там швидко допоможуть.

Неактивний

#12 2020-12-23 00:14:10

luminofor
Учасник
Зареєстрований: 2020-01-28
Повідомлень: 37

Re: Помогите доделать простой скетч за денежку

martinways пише:

Дорогой друг Honey, я понимаю, что Вы подсказываете загадками

Мне кажется он вам пытается сказать, что

клавиша = прочитать_клавишу();

у вас выполняется только один раз. Все остальное время вы висите в for (;;)
И все что внутри for (;;) не знает о том, что нажималась другая клавиша

Неактивний

#13 2020-12-23 09:35:38

г0сть
Гість

Re: Помогите доделать простой скетч за денежку

Сомневаюсь что за 200 грн. кто-то согласится копаться в чужом коде да еще и в Гэ-библиотеках. Распиши нормально алгоритм что нужно сделать, а исполнитель,если найдется, сам решит как делать.

#14 2020-12-23 09:41:15

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

Re: Помогите доделать простой скетч за денежку

Сергій_П пише:

Звернись на https://freelancehunt.ua/ там швидко допоможуть.

А тут что меньше чем за 100$ никто не помогает?

Остання редакція martinways (2020-12-23 10:04:11)

Неактивний

#15 2020-12-23 11:31:58

Honey
Учасник
З Киев
Зареєстрований: 2020-09-26
Повідомлень: 41

Re: Помогите доделать простой скетч за денежку

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

Неактивний

#16 2020-12-23 11:42:22

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

Re: Помогите доделать простой скетч за денежку

martinways пише:

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


и как вы собираетесь внедрять, если не знаете и не умеете...

Неактивний

#17 2020-12-23 11:47:13

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

Re: Помогите доделать простой скетч за денежку

vvr пише:
martinways пише:

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


и как вы собираетесь внедрять, если не знаете и не умеете...

Я же писал выше - метод научного тыка)) У меня получается иногда лепить скетчи из кусков чужих и дописывать по аналогии, плюс библиотеки, инструкции к которым есть. Смотрю какие куски кода примерно за что отвечают, изменяю под себя и вроде получается. Уже сделал так несколько уникальных и полезных для себя устройств.

Остання редакція martinways (2020-12-23 11:48:38)

Неактивний

#18 2020-12-23 12:04:01

Honey
Учасник
З Киев
Зареєстрований: 2020-09-26
Повідомлень: 41

Re: Помогите доделать простой скетч за денежку

martinways пише:

Я же писал выше - метод научного тыка)) У меня получается иногда лепить скетчи из кусков чужих и дописывать по аналогии, плюс библиотеки, инструкции к которым есть. Смотрю какие куски кода примерно за что отвечают, изменяю под себя и вроде получается. Уже сделал так несколько уникальных и полезных для себя устройств.

А в чем смысл позиции "не хочу изучать язык программирования"? Он Вам нужен чтобы облегчить жизнь себе самому.

Неактивний

#19 2020-12-23 12:22:11

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

Re: Помогите доделать простой скетч за денежку

Нет на это моральных сил и времени))
Я и так уже фотошопер, веб-дизайнер, электронщик, конструктор, 3д-печатник, медик, предприниматель. Конечно же я не супер-специалист во всех этих сферах, но тем не менее мозг и терпение не резиновые)))
Может и возьмусь за Си, но пока в данный момент нет.

Остання редакція martinways (2020-12-23 12:28:11)

Неактивний

#20 2020-12-23 13:21:19

Sergio
Учасник
З Харьков
Зареєстрований: 2020-10-22
Повідомлень: 13

Re: Помогите доделать простой скетч за денежку

realsoft3d@gmail.com   но токо не за 200 грн )) если договоримся, распишу код с комментами на понятном для тебя уровне, дальше сможешь по этой методике делать много чего, уже самостоятельно.

Неактивний

#21 2020-12-23 14:03:12

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

Re: Помогите доделать простой скетч за денежку

Sergio пише:

realsoft3d@gmail.com   но токо не за 200 грн )) если договоримся, распишу код с комментами на понятном для тебя уровне, дальше сможешь по этой методике делать много чего, уже самостоятельно.

Спасибо за предложение, но меня удивляет почему программисты в основном не называют цену? Я же понятия не имею сколько это может стоить, также не хочу, чтобы меня разводили на круглую сумму за услугу, которая стоит гораздо дешевле. Это знаете то же самое если бы Вы хотели купить в магазине какую-то конкретную вещь, а продавец цену не говорит, а спрашивает "Сколько Вы готовы за нее заплатить", и если вы не отвечаете или называете сумму которая продавца не устраивает, то он посылает вас в другое место.

Остання редакція martinways (2020-12-23 14:13:09)

Неактивний

#22 2020-12-23 14:28:03

Sergio
Учасник
З Харьков
Зареєстрований: 2020-10-22
Повідомлень: 13

Re: Помогите доделать простой скетч за денежку

Такая работа у нас, именно работа, а не разводилово на бОльшие чем положено суммы как всем кажется))
Я считаю, что заниматься разбором кода и подробными обучающими комментариями не имеет смысла, если за день не добавится хотя бы 1300 грн. Вот отсюда и считаем, всё по-честному ))

Неактивний

#23 2020-12-23 14:42:56

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

Re: Помогите доделать простой скетч за денежку

Sergio пише:

Такая работа у нас, именно работа, а не разводилово на бОльшие чем положено суммы как всем кажется))
Я считаю, что заниматься разбором кода и подробными обучающими комментариями не имеет смысла, если за день не добавится хотя бы 1300 грн. Вот отсюда и считаем, всё по-честному ))

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

Остання редакція martinways (2020-12-23 14:46:00)

Неактивний

#24 2020-12-23 14:51:32

ard125
Учасник
Зареєстрований: 2019-01-30
Повідомлень: 82

Re: Помогите доделать простой скетч за денежку

Объясните подробней что это значит

martinways пише:

пока держишь кнопку должна отрабатываться выдача сообщений "LoadStep" в соответствии с этой функцией библиотеки.

Какой функции и какой библиотеки?

Неактивний

#25 2020-12-23 14:54:48

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

Re: Помогите доделать простой скетч за денежку

ard125 пише:

Объясните подробней что это значит

martinways пише:

пока держишь кнопку должна отрабатываться выдача сообщений "LoadStep" в соответствии с этой функцией библиотеки.

Какой функции и какой библиотеки?

#include "GyverButton.h" /// https://github.com/AlexGyver/GyverLibs/releases/download/GyverButton/GyverButton.zip

Вот инструкции к библиотеке https://alexgyver.ru/gyverbutton/

Вы что не смотрели самый первый скетч, там же все есть.

Остання редакція martinways (2020-12-23 14:58:12)

Неактивний

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

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

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