создание программы и оплата
- Войдите на сайт для отправки комментариев
Здравствуйте, у меня пару лет назад случилась такая проблема. У меня заказали один проект и я его сделал, показал пробную версию, сделал описание и снял видео пример об этом. Но как случается меня кинули и получается заказчик не получил свой продукт до конца и я не получил своих денег. И вот у я наткнулся на свою разработку еще раз и хочу ее продать, где ее можно продать и как это сделать подскажите пожалуйста.
Коротко о проекте: это мобильный счетчик количества объектов, созданный на базе ардуино и датчиком расстояния. Оно измеряет расстояние до объекта и расстояние после объекта(по этому плотно стоящие коробки не сможет подсчитать). Код с комментариями и отдельным файлом описания имеется, схема и ранние варианты кода тоже
Дам литр + банка огурцов )))
Я даже столько не дам.
Пользуясь случаем.
Имею в наличии порядка нескольких сотен скетчей написанных как для души , так и на заказ.
Есть всякие разные , под разные дисплеи,датчики и прочие объекты.
Продам :-)
По чём за штуку? А если оптом (десяток) или крупный оптом (сотню) скидка будет? :D
Оптом по 100р/шт отдам
Для затравки
//пины кнопок и конечных выключателей, должны быть подтянуты к gnd резисторами ~10К enum DIR{STOP,RISE,FALL}; DIR motor1state=STOP; DIR motor2state=STOP; DIR motor3state=STOP; void DeviceAction(struct device *stepper); #define LIMIT_1_UP 2 #define LIMIT_1_DOWN 3 #define LIMIT_2_UP 4 #define LIMIT_2_DOWN 5 #define LIMIT_3_UP 6 #define LIMIT_3_DOWN 7 #define BTN_1_UP 8 #define BTN_1_DOWN 9 #define BTN_2_UP 10 #define BTN_2_DOWN 11 #define BTN_3_UP 12 #define BTN_3_DOWN 13 #define DIR_1 A0 #define STEP_1 A1 #define DIR_2 A2 #define STEP_2 A3 #define DIR_3 A4 #define STEP_3 A5 #include <AccelStepper.h> AccelStepper motor_1(AccelStepper::DRIVER,STEP_1,DIR_1); AccelStepper motor_2(AccelStepper::DRIVER,STEP_2,DIR_2); AccelStepper motor_3(AccelStepper::DRIVER,STEP_3,DIR_3); #define MOTOR_1_SPEED 1200 #define MOTOR_2_SPEED 1200 #define MOTOR_3_SPEED 1200 //=========обработчик кнопок======== #define _bounce_time 50 class btn {public: btn(byte pin,byte state,byte val); byte read(); private: byte _pin,_state,_val; uint16_t start_press; uint16_t pressTime; boolean pressFlag; byte press_one; byte num,_num,button; }; byte btn::read(){ uint16_t _millis=millis(); !_state?button=digitalRead(_pin):button=!digitalRead(_pin); if(!button){num=0;} if(button&&!pressFlag) {_millis-start_press>=_bounce_time; pressFlag=1; num=1; } if(!button){ start_press=_millis; pressFlag=0; } _num=num; num=0; return _num; } btn::btn(byte pin,byte state,byte val) {_pin = pin; _state=state; _val=val; pinMode(pin,_state); } //========================= //объявление экземпляров кнопок btn Up1Btn(BTN_1_UP,INPUT,1); btn Down1Btn(BTN_1_DOWN,INPUT,1); btn Up2Btn(BTN_2_UP,INPUT,1); btn Down2Btn(BTN_2_DOWN,INPUT,1); btn Up3Btn(BTN_3_UP,INPUT,1); btn Down3Btn(BTN_3_DOWN,INPUT,1); //описание структуры управления двигателем struct device{ AccelStepper *motor;//экземпляр двигателя int limitUpPin;//пин конечника верх int limitDownPin;//пин коннчника низ DIR motorState;//состояние двигателя int motorSpeed;//скорость двигателя btn *UPBTN;//указатель на экземпляр кнопки вверх btn *DOWNBTN;//указатель на экземпляр кнопки вниз }; //объявление экземпляров двигателей device MOTOR1={ &motor_1, LIMIT_1_UP, LIMIT_1_DOWN, motor1state, MOTOR_1_SPEED, &Up1Btn, &Down1Btn }; device MOTOR2={ &motor_2, LIMIT_2_UP, LIMIT_2_DOWN, motor2state, MOTOR_2_SPEED, &Up2Btn, &Down2Btn }; device MOTOR3={ &motor_3, LIMIT_3_UP, LIMIT_3_DOWN, motor3state, MOTOR_3_SPEED, &Up3Btn, &Down3Btn }; device *MOTOR[3]={&MOTOR1,&MOTOR2,&MOTOR3}; //функция управления двигателями void DeviceAction(struct device *stepper){ switch(stepper->motorState){ case STOP: if(stepper->UPBTN->read()&&!digitalRead(stepper->limitUpPin))stepper->motorState=RISE; if(stepper->DOWNBTN->read()&&!digitalRead(stepper->limitDownPin))stepper->motorState=FALL; break; case RISE: stepper->motor->setSpeed(stepper->motorSpeed); if(!digitalRead(stepper->limitUpPin)){ stepper->motor->runSpeed(); } else{ stepper->motorState=STOP; } break; case FALL: stepper->motor->setSpeed(-stepper->motorSpeed); if(!digitalRead(stepper->limitDownPin)){ stepper->motor->runSpeed(); } else{ stepper->motorState=STOP; } break; } } void setup(){ pinMode(DIR_1,OUTPUT); pinMode(STEP_1,OUTPUT); pinMode(DIR_2,OUTPUT); pinMode(STEP_2,OUTPUT); pinMode(DIR_3,OUTPUT); pinMode(STEP_3,OUTPUT); motor_1.setMaxSpeed(2000); motor_2.setMaxSpeed(2000); motor_3.setMaxSpeed(2000); } void loop(){ for(auto &i:MOTOR){ DeviceAction(i); }; }Ура, конкурс! - "обосрем код".
правильно я понял? :)
Ура, конкурс! - "обосрем код".
правильно я понял? :)
Жги
Строка 179 )))
Строка 179 )))
Думаю компилятор и без меня с ней справится
1) Код не выровнен;
2) Дефайн "бяка";
3) Объявление переменных "кто в лес, а кто по дрова".
Ну это так, для юмору.
1. Это у меня болезнь такая. Пишу с телефона , там с этим туго.
2. "#define Бяка" когда он описан слишком элементарно.
А так думаю вряд-ли в какой то библиотеке(а тут она одна), может быть использованы такие имена.
3. Переменные стараюсь описывать максимально приближенно к стандартам (которые знаю плоховато).
Невнятно описаны только указатели на экземпляры обьектов класса кнопка. Я хз как такое правильно описывать
Ну это просто "культура производства".
Я давеча на кухне проводку переразводил - поразился тогдашней культуре электриков-шабашников. 5+!)
Вот и у вас как раз вариант идеальной программы. Достаточно прямо написано что бы работать, и достаточно криво написано, что бы в случае допилинга к новым требованиям, то обратились к вам и вы потребовали деньги. Другие попросят больше. ;))
Вот и у вас как раз вариант идеальной программы. Достаточно прямо написано что бы работать, и достаточно криво написано, что бы в случае допилинга к новым требованиям, то обратились к вам и вы потребовали деньги. Другие попросят больше. ;))
то-есть переводя на работу кишечника надо добавлять побольше воды и клетчатки )))
Строка 179 )))
А меня глубже за душу взяла стр.059. Даже не знаю, как усну сегодня после такого. Кнопка на пине в режиме не INPUT... Это может на OUTINPUT? Как? Зачем? Она светится? А если в коде все кнопки таки на INPUT, так к чему все это? Может к деньгам?
Строка 179 )))
А меня глубже за душу взяла стр.059. Даже не знаю, как усну сегодня после такого. Кнопка на пине в режиме не INPUT... Это может на OUTINPUT? Как? Зачем? Она светится? А если в коде все кнопки таки на INPUT, так к чему все это? Может к деньгам?
Ну тут всё просто.
Этот кусок выдернут из библиотеки.
_state принимает значения INPUT (0x00) или INPUT_PULLUP(0x02), ну и написан этот кусок исходя из этой логики.
!_state?//в данном случае будет как if(_state==INPUT)
Как то так :-)
Выходит при _state==INPUT делаем button=digitalRead(_pin), а иначе, т.е. при предполагаемом INPUT_PULLUP делаем button=!digitalRead(_pin)? Т.е. включение или отключение внутренней подтяжки пина задает... полярность сигнала с кнопки 8)))
То, что _state не равен INPUT еще не означает что он равен INPUT_PULLUP, оставим это на совести библиотекаря ;)
Получается, что вне зависимости от того, как организован вход пина INPUT/INPUT_PULLUP , переменная button будет принимать значение true при нажатой кнопке.
ну это смотря как подключишь :)
Нинаю, я прям в конструкторе своей кнопки всегда указываю, какой уроень будет активный, LOW или HIGH, (по умолчанию LOW, я отношусь к секте активного нуля). Если LOW, то пин прям там же в конструкторе настраивается на INPUT_PULLUP, если HIGH, то просто INPUT. Причём, кнопка это просто частный случай DigitalSensor-а, наследник, тасазать.
ну это смотря как подключишь :)
Так на INPUT можно подключить с подтяжкой к земле и к питанию. На INPUT_PULLUP в общем тоже. Причем режим пина к полярности подтяжки?