Простая машинка с разными вариантами управления

Тема в разделе "Глядите, что я сделал", создана пользователем 3f(x), 27 сен 2019.

  1. 3f(x)

    3f(x) Нерд

    100 руб). ?
     
  2. NikitOS

    NikitOS Король шутов Администратор

    1000
     
  3. SergeiL

    SergeiL Оракул Модератор

    Ну или вариант меню из 2007-го, от термостата:
    Код (C++):
    #define KEY_1 2   // Back
    #define KEY_2 3      // Enter
    #define KEY_3 0      // UP
    #define KEY_4 1      // Down
    #define KEY_5 5      // Power

    typedef struct _menuItem    {
                char flash      * itemText;
                signed char   * Cur_Val;
                signed char     Esc_Val;
                signed char     Min_Val;
                signed char        Max_Val;
                signed char   * eep_addr;
                void            (*itemFunction)(void);
                }
    MenuItem;

    void MenuProcess(char key);
    void MenuOpen(void);
    void MenuClose(void);

    static flash char    _Contrast_str[]        = "Contrast",
                         _Backlight_str[]    = "LED Ligh",
                        _Gisteresis_str[]    = "Gisteres",
                        _NetAddr_str[]        = "Net Addr",
                        _AntiFrTemp_str[]    = "AF Temp.",
                        _AntiFrOnOff_str[]    = " A.F.On ",
                        _KeyBeepOnOff_str[]    = "Key Beep",
                        _AutoDimOnOff_str[]    = "Auto Dim",
                        _Date_Year_str[]    = "  Year  ",
                        _Date_Month_str[]    = "  Month ",
                        _Date_Day_str[]        = "  Day   ",
                        _Time_Hour_str[]    = "  Hour  ",
                        _Time_Min_str[]        = " Minute "
                        ;

    void Key_1_1(void)
    {
          Mode=0;
    }

    void Key_1_2(void)
    {
         if (Heating_ON_OFF==HEATING_ON)
            Heating_ON_OFF=HEATING_OFF;
        else
            Heating_ON_OFF=HEATING_ON;
                                           
        ChangeDataFlag|=CHG_TERMOSTAT;
        EEPROM_WRITE((int)&eep_Heating_ON_OFF, Heating_ON_OFF);
    }
    void Key_2_1(void)
    {
       if (Mode<NUM_OF_MODE-1)
             Mode++;
       else
          Mode=0;

       ChangeDataFlag|=CHG_MENUMODE;
    }
    void Key_2_2(void)
    {
       if (Mode>0)
             Mode--;
       else
          Mode=NUM_OF_MODE-1;
       MenuOpen();
       ChangeDataFlag|=CHG_MENUMODE;
    }
    void Key_3_1(void)
    {
       if (Mode==0 && Heating_ON_OFF == HEATING_ON)
             IncTermostatVal();
    }
    void Key_4_1(void)
    {
       if (Mode==0 && Heating_ON_OFF == HEATING_ON)
             DecTermostatVal();
    }
    void Key_4_2(void)
    {
        switch(Mode)
        {
            case 1:
                TempMinVal=125;
            break;
            case 2:
                TempMaxVal=-55;
            break;
            case 3:
                 Min_Voltage=Cur_Voltage;
                 Max_Voltage=Cur_Voltage;
            break;
            case 4:
                HeaterTime.Year=0;
                HeaterTime.Month=0;
                HeaterTime.Day=0;
                HeaterTime.Hour=0;
                HeaterTime.Min=0;
                HeaterTime.Sec=0;

            break;
        }
    }
                     
    void  (*MMFTab[5][2])(void)= {   {Key_3_1, NULL},
                                        {Key_4_1, Key_4_2},
                                       {Key_1_1, Key_1_2},
                                       {Key_2_1, Key_2_2},
                                       {Key_1_2, NULL}  };

                     
    void SetContrast(void)
    {
       OCR1AL=(Contrast*5)+155;
    }                  
    void SetBacklight()
    {
       OCR1BL =((21-LED)*12)+3;
    }                


    void SetTime()
    {
         TempMinVal=125;
         TempMaxVal=-55;
    }                
    void SetTimeMin()
    {
        CurTime.Sec=0;
        SetTime();
    }
                 
    static MenuItem
        MenuItems[] =    {
                _Contrast_str,      &Contrast,       0,0,   20,  &eep_Contrast,       &SetContrast,
                _Backlight_str,   &LED,            0,0,   20,  &eep_LED,            &SetBacklight,
                _Gisteresis_str,  &Gister,           0,0,   10,  &eep_Gister,         NULL,
                _NetAddr_str,      &NetAddr,        0,2,   99,  &eep_NetAddr,        NULL,
                _AntiFrTemp_str,  &AntiFrTemp,     0,0,      20,  &eep_AntiFrTemp,     NULL,
                _AntiFrOnOff_str, &AntiFrOnOff,    0,0,       1,  &eep_AntiFrOnOff,    NULL,
                _KeyBeepOnOff_str,&KeyBeepOnOff,   0,0,    1,  &eep_KeyBeepOnOff,   NULL,
                _AutoDimOnOff_str,&AutoDimOnOff,   0,0,       1,  &eep_AutoDimOnOff,   NULL,
                _Date_Year_str,   &CurTime.Year,   0,1,      99,  NULL,                  &SetTime,
                _Date_Month_str,  &CurTime.Month,  0,1,      12,  NULL,                  &SetTime,
                _Date_Day_str,    &CurTime.Day,    0,1,      31,  NULL,                  &SetTime,
                _Time_Hour_str,   &CurTime.Hour,   0,0,      23,  NULL,                  &SetTime,
                _Time_Min_str,    &CurTime.Min,    0,0,      59,  NULL,                  &SetTimeMin,
                };

         
    MenuItem     *_mptr = MenuItems;
    MenuItem     *_mptr_choiced = NULL;    
    unsigned char SubMenu_choiced = 0;


    void MenuOpen(void)
    {
    SubMenu_choiced=1;
    _mptr_choiced = NULL;
    }

    void MenuClose(void)
    {
    Mode=0;
    SubMenu_choiced=0;
    _mptr_choiced = NULL;
    }

    void MainMenuProcess(char key)
    {
        unsigned char num=Key_Mode[key];
        void (*function)(void);
     
         ChangeDataFlag |= CHG_MENUMODE;

        function=MMFTab[key][num-1];
     
        if (*function)
           (*function)();
    }

    void MenuProcess(char key)
    {
         ChangeDataFlag |= CHG_MENUMODE;
        switch (key)
        {
            case  KEY_1:
                  if(_mptr_choiced)
                  {
                      *(_mptr->Cur_Val) = _mptr->Esc_Val;
                   
                      if(_mptr->itemFunction)
                              (*_mptr->itemFunction)();

                      _mptr_choiced = NULL;

                  }
                  else if (SubMenu_choiced)
                  {
                   MenuClose();
                  }
               
            break;
     
            case  KEY_2:
                  if(_mptr_choiced)
                  {
                       if (_mptr->itemFunction)
                       (*_mptr->itemFunction)();
               
                    if (_mptr->eep_addr)
                        EEPROM_WRITE((int)(_mptr->eep_addr), *(_mptr->Cur_Val));
                    _mptr_choiced = NULL;
                  }
                  else if (SubMenu_choiced)
                  {
                          _mptr_choiced = _mptr;
                       _mptr->Esc_Val= *(_mptr->Cur_Val);
                  }
     
            break;
     
            case  KEY_3:
                  if(_mptr_choiced)
                  {
                         if (*(_mptr->Cur_Val) < _mptr->Max_Val)
                      {
                           (*(_mptr->Cur_Val))++;
                         if(_mptr->itemFunction)
                              (*_mptr->itemFunction)();
                      }
                  }
                  else if (SubMenu_choiced)
                  {          
                          if (--_mptr < MenuItems)
                             _mptr = &MenuItems[(sizeof MenuItems)/(sizeof (struct _menuItem)) - 1];
                  }
     
            break;
            case  KEY_4:
                  if(_mptr_choiced)
                  {
                         if (*(_mptr->Cur_Val) > _mptr->Min_Val)
                      {
                           (*(_mptr->Cur_Val))--;
                         if(_mptr->itemFunction)
                               (*_mptr->itemFunction)();
                      }
                  }
                  else if (SubMenu_choiced)
                  {      
                          if (++_mptr > &MenuItems[(sizeof MenuItems)/(sizeof (struct _menuItem)) - 1])  
                       _mptr = MenuItems;
                  }
            break;

        }
    }
    Тоже на Си.
     
  4. 3f(x)

    3f(x) Нерд

    фигасе хде скидки то), я ведь и сам его могу написать это -50%, и меня то не надо опрашивать это еще -50%, да если еще подумать то мож и до 62.5 можно дойти) в личку то скинь и как ты монетоприемник сделал, или предложил аналог ?)
     
  5. issaom

    issaom Гуру

    Кароч ты понял в какой раздел форума нужно перенести эту тему ;) - не удаляй тока ;)
     
  6. NikitOS

    NikitOS Король шутов Администратор

    Зачем делать, когда есть готовые?
    Ну ты это, для символики бабла дай, а то ТС платил, а ты...
     
  7. 3f(x)

    3f(x) Нерд

    Код (C++):
    Servo servo;
    int val;
    void setup() {
      Serial.begin(9600);
      servo.attach(8); }
    void loop() {
      if (Serial.available())
      {
        val = Serial.read();
        if (val == '1') { servo.write(0); }
        if (val == '0') { servo.write(180);}
      }
    }
    вот именно у мя уже свой готовый,) чисто символически отправлю на киви), давай показывай скеч
     
  8. NikitOS

    NikitOS Король шутов Администратор

    Начнем с того, что там замок не с серво
    И управление не через Serial
     
  9. 3f(x)

    3f(x) Нерд

    а что моторчик ? потом еще окажется что у него и не два провода а 5)
    что ты как заказчик себя ведешь) приходится вытаскивать из тебя инфу, да еще и за бесплатно)
    писать лень и из нета копировать тоже,) представь что мой монетоприемник с помощь магии отправляет цифры 0 и 1 в монитор порта и все)
    давай свой скеч показывай, твой критиковать будем)
     
  10. NikitOS

    NikitOS Король шутов Администратор

  11. 3f(x)

    3f(x) Нерд

  12. NikitOS

    NikitOS Король шутов Администратор

    Дык купи XD
     
  13. 3f(x)

    3f(x) Нерд

    заказов нет, и денег нет, все ты забрал)
     
  14. NikitOS

    NikitOS Король шутов Администратор

    Ничего не могу поделать :)

    Вот код, раз так интересно
    Код (Text):
    #include <Arduino.h>

    #define lockPin            2        //Пин замка
    #define cAPin              4        //Пин монетоприемника

    int delayTime = 6000;   //Время, пока дверь открыта. 6000 - 6 секунд

    void setup() {
        pinMode(lockPin, OUTPUT);         //Пин замка - выход
        pinMode(cAPin, INPUT);            //Пин монетоприемника - вход

        digitalWrite(lockPin, 0);      //Открываем замок...
    }

    void loop() {
      if(digitalRead(cAPin)) {
        digitalWrite(lockPin, 1);   //Открываем замок...
        delay(delayTime);           //...ждем...
        digitalWrite(lockPin, 0);   //...закрываем замок...
      }
    }
     
  15. SergeiL

    SergeiL Оракул Модератор

    Я же выложил код, ответа - нет...
     
  16. 3f(x)

    3f(x) Нерд

    не я его писал под конкретную задачу
     
  17. SergeiL

    SergeiL Оракул Модератор

    Кого его?
    Код, что я запостил. :)
     
  18. 3f(x)

    3f(x) Нерд

    да его, разбирайся еще в нем для чего в он,) и я предлагал скеч для моторов, я знаю вроде около 10 способов, как написать код для управления ими

    хочется придраться а не к чему) правда не могу представить как должен выглядить механизм)
     
    Последнее редактирование модератором: 29 сен 2019
  19. issaom

    issaom Гуру

    А машинка за хлебом в магаз уже уехала ?
     
  20. NikitOS

    NikitOS Король шутов Администратор

    По схеме догадайся
     

    Вложения:

    • drawing.png
      drawing.png
      Размер файла:
      129,7 КБ
      Просмотров:
      287