Ви не увійшли.
Друзья, кто и за сколько денег поможет мне допилить несложную функцию в скетч, я не учил 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");
}
}
Неактивний
А я откуда знаю расценки? Блин, ну я понимаю, что это не супер-сложная задача для тех, кто в теме. Делаю устройство для себя. 200грн например.
Неактивний
Есть вот мой вариант скетча на основе запуска 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)
Неактивний
Вот пример, как пользоваться флагами:
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;
}
}
}
Активний
Подставил свои значения и вставил это все в 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)
Неактивний
То есть 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)
Неактивний
Дорогой друг Honey, я понимаю, что Вы подсказываете загадками, чтобы я понял принцип и чему-то научился, благодарен Вам за это, но в данный момент для меня в приоритете затраченное время, мне просто нужно получить рабочий код, который я буду внедрять в гораздо бОльший скетч управления устройством, которое я задумал. Не могу себе позволить изучать сейчас C++ ради одного устройства, я не планирую становиться программистом))
Неактивний
Дорогой друг Honey, я понимаю, что Вы подсказываете загадками
Мне кажется он вам пытается сказать, что
клавиша = прочитать_клавишу();
у вас выполняется только один раз. Все остальное время вы висите в for (;;)
И все что внутри for (;;) не знает о том, что нажималась другая клавиша
Неактивний
Сомневаюсь что за 200 грн. кто-то согласится копаться в чужом коде да еще и в Гэ-библиотеках. Распиши нормально алгоритм что нужно сделать, а исполнитель,если найдется, сам решит как делать.
Звернись на https://freelancehunt.ua/ там швидко допоможуть.
А тут что меньше чем за 100$ никто не помогает?
Остання редакція martinways (2020-12-23 10:04:11)
Неактивний
Здесь помогут и совершенно бесплатно, я Вам набросал алгоритм именно по Вашему ТЗ, Вам нужно только понять принцип работы и Вы без труда напишете и для второй кнопки. Возможно кто-то, у кого появится свободное время, поможет уже с написанием программы, если уж Вы так принципиально не хотите изучать язык программирования.
Активний
мне просто нужно получить рабочий код, который я буду внедрять в гораздо бОльший скетч управления устройством, которое я задумал. Не могу себе позволить изучать сейчас C++ ради одного устройства, я не планирую становиться программистом))
и как вы собираетесь внедрять, если не знаете и не умеете...
Неактивний
martinways пише:мне просто нужно получить рабочий код, который я буду внедрять в гораздо бОльший скетч управления устройством, которое я задумал. Не могу себе позволить изучать сейчас C++ ради одного устройства, я не планирую становиться программистом))
и как вы собираетесь внедрять, если не знаете и не умеете...
Я же писал выше - метод научного тыка)) У меня получается иногда лепить скетчи из кусков чужих и дописывать по аналогии, плюс библиотеки, инструкции к которым есть. Смотрю какие куски кода примерно за что отвечают, изменяю под себя и вроде получается. Уже сделал так несколько уникальных и полезных для себя устройств.
Остання редакція martinways (2020-12-23 11:48:38)
Неактивний
Я же писал выше - метод научного тыка)) У меня получается иногда лепить скетчи из кусков чужих и дописывать по аналогии, плюс библиотеки, инструкции к которым есть. Смотрю какие куски кода примерно за что отвечают, изменяю под себя и вроде получается. Уже сделал так несколько уникальных и полезных для себя устройств.
А в чем смысл позиции "не хочу изучать язык программирования"? Он Вам нужен чтобы облегчить жизнь себе самому.
Активний
Нет на это моральных сил и времени))
Я и так уже фотошопер, веб-дизайнер, электронщик, конструктор, 3д-печатник, медик, предприниматель. Конечно же я не супер-специалист во всех этих сферах, но тем не менее мозг и терпение не резиновые)))
Может и возьмусь за Си, но пока в данный момент нет.
Остання редакція martinways (2020-12-23 12:28:11)
Неактивний
realsoft3d@gmail.com но токо не за 200 грн )) если договоримся, распишу код с комментами на понятном для тебя уровне, дальше сможешь по этой методике делать много чего, уже самостоятельно.
Неактивний
realsoft3d@gmail.com но токо не за 200 грн )) если договоримся, распишу код с комментами на понятном для тебя уровне, дальше сможешь по этой методике делать много чего, уже самостоятельно.
Спасибо за предложение, но меня удивляет почему программисты в основном не называют цену? Я же понятия не имею сколько это может стоить, также не хочу, чтобы меня разводили на круглую сумму за услугу, которая стоит гораздо дешевле. Это знаете то же самое если бы Вы хотели купить в магазине какую-то конкретную вещь, а продавец цену не говорит, а спрашивает "Сколько Вы готовы за нее заплатить", и если вы не отвечаете или называете сумму которая продавца не устраивает, то он посылает вас в другое место.
Остання редакція martinways (2020-12-23 14:13:09)
Неактивний
Такая работа у нас, именно работа, а не разводилово на бОльшие чем положено суммы как всем кажется))
Я считаю, что заниматься разбором кода и подробными обучающими комментариями не имеет смысла, если за день не добавится хотя бы 1300 грн. Вот отсюда и считаем, всё по-честному ))
Неактивний
Такая работа у нас, именно работа, а не разводилово на бОльшие чем положено суммы как всем кажется))
Я считаю, что заниматься разбором кода и подробными обучающими комментариями не имеет смысла, если за день не добавится хотя бы 1300 грн. Вот отсюда и считаем, всё по-честному ))
1300 за такую фиговенькую функцию.... ну прекрасно, что Вы себя так высоко цените. Никаких претензий. Ваше дело предложить, мое дело отказаться. Пойду лучше намотаю пару помпончиков))))
Остання редакція martinways (2020-12-23 14:46:00)
Неактивний
Объясните подробней что это значит
пока держишь кнопку должна отрабатываться выдача сообщений "LoadStep" в соответствии с этой функцией библиотеки.
Какой функции и какой библиотеки?
Неактивний
Объясните подробней что это значит
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)
Неактивний