создание программы и оплата

alexdm181202
Offline
Зарегистрирован: 10.06.2019

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

Коротко о проекте: это мобильный счетчик количества объектов, созданный на базе ардуино и датчиком расстояния. Оно измеряет расстояние до объекта и расстояние после объекта(по этому плотно стоящие коробки не сможет подсчитать). Код с комментариями и отдельным файлом описания имеется, схема и ранние варианты кода тоже

-NMi-
Offline
Зарегистрирован: 20.08.2018

Дам литр + банка огурцов )))

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

-NMi- пишет:
Дам литр + банка огурцов )))

Я даже столько не дам.

Пользуясь случаем.
Имею в наличии порядка нескольких сотен скетчей написанных как для души , так и на заказ.
Есть всякие разные , под разные дисплеи,датчики и прочие объекты.
Продам :-)

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Kakmyc пишет:
Пользуясь случаем

По чём за штуку? А если оптом (десяток) или крупный оптом (сотню) скидка будет? :D

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

Оптом по 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);
    };    
}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Ура, конкурс! - "обосрем код".

правильно я понял? :)

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

b707 пишет:

Ура, конкурс! - "обосрем код".

правильно я понял? :)

 

Жги

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Строка 179 )))

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

BOOM пишет:

Строка 179 )))

Думаю компилятор и без меня с ней справится

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

1) Код не выровнен;

2) Дефайн "бяка";

3) Объявление переменных "кто в лес, а кто по дрова".

Ну это так, для юмору.

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

1. Это у меня болезнь такая. Пишу с телефона , там с этим туго.
2. "#define Бяка" когда он описан слишком элементарно.
А так думаю вряд-ли в какой то библиотеке(а тут она одна), может быть использованы такие имена.
3. Переменные стараюсь описывать максимально приближенно к стандартам (которые знаю плоховато).
Невнятно описаны только указатели на экземпляры обьектов класса кнопка. Я хз как такое правильно описывать

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

Ну это просто "культура производства".
Я давеча на кухне проводку переразводил - поразился тогдашней культуре электриков-шабашников. 5+!)

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

Kakmyc пишет:
Жги

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

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

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

qwone пишет:

Kakmyc пишет:
Жги

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

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

то-есть переводя на работу кишечника надо добавлять побольше воды и клетчатки )))

Logik
Offline
Зарегистрирован: 05.08.2014

BOOM пишет:

Строка 179 )))

А меня глубже за душу взяла стр.059. Даже не знаю, как усну сегодня после такого. Кнопка на пине в режиме не INPUT... Это может на OUTINPUT? Как? Зачем? Она светится? А если в коде все кнопки таки на INPUT, так к чему все это? Может к деньгам?

 

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

Logik пишет:

BOOM пишет:

Строка 179 )))

А меня глубже за душу взяла стр.059. Даже не знаю, как усну сегодня после такого. Кнопка на пине в режиме не INPUT... Это может на OUTINPUT? Как? Зачем? Она светится? А если в коде все кнопки таки на INPUT, так к чему все это? Может к деньгам?

 

Ну тут всё просто.
Этот кусок выдернут из библиотеки.
_state принимает значения INPUT (0x00) или INPUT_PULLUP(0x02), ну и написан этот кусок исходя из этой логики.
!_state?//в данном случае будет как if(_state==INPUT)

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

Как то так :-)

Logik
Offline
Зарегистрирован: 05.08.2014

Выходит при _state==INPUT делаем button=digitalRead(_pin), а  иначе, т.е. при предполагаемом INPUT_PULLUP  делаем button=!digitalRead(_pin)?  Т.е. включение или отключение внутренней подтяжки пина задает... полярность сигнала с кнопки 8)))

То, что _state не равен INPUT еще не означает что он равен INPUT_PULLUP, оставим это на совести библиотекаря ;)

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

Получается, что вне зависимости от того, как организован вход пина INPUT/INPUT_PULLUP , переменная button будет принимать значение true при нажатой кнопке.

b707
Offline
Зарегистрирован: 26.05.2017

Kakmyc пишет:
Получается, что вне зависимости от того, как организован вход пина INPUT/INPUT_PULLUP , переменная button будет принимать значение true при нажатой кнопке.

ну это смотря как подключишь :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Нинаю, я прям в конструкторе своей кнопки всегда указываю, какой уроень будет активный, LOW или HIGH, (по умолчанию LOW, я отношусь к секте активного нуля). Если LOW, то пин прям там же в конструкторе настраивается на INPUT_PULLUP, если HIGH, то просто INPUT.  Причём, кнопка это просто частный случай DigitalSensor-а, наследник, тасазать. 

Logik
Offline
Зарегистрирован: 05.08.2014

b707 пишет:

Kakmyc пишет:
Получается, что вне зависимости от того, как организован вход пина INPUT/INPUT_PULLUP , переменная button будет принимать значение true при нажатой кнопке.

ну это смотря как подключишь :)

Так на INPUT можно подключить с подтяжкой к земле и  к питанию. На INPUT_PULLUP  в общем тоже. Причем режим пина к полярности подтяжки?