Помогите объединить два и более скетчей в один

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем CasperSimfer, 7 дек 2014.

  1. roni

    roni Нерд

    ДА ЛУЧШЕ КАК ВЫ ДУМОЛИ :)
     
  2. Alex19

    Alex19 Гуру

    Там код, он прост и читаем.

    Но для этого надо учиться, очень хорошие материалы, сам когда-то с них начинал - http://wiki.amperka.ru/видеоуроки:джереми-блюм. Все на русском, для начала хороший старт, а дальше сами будете понимать, что почить и т.д.
     
  3. roni

    roni Нерд

    ОГРОМНОЕ СПОСИБО Аlex19:)
     
  4. Здравствуйте помогите пожалуйста!!!Мне нужно чтоб часть фиксировалось,а другая часть работала по удержанию.
     

    Вложения:

    • ду.txt
      Размер файла:
      3,7 КБ
      Просмотров:
      28
  5. #include <IRremote.h> // это скачанная библиотека

    int RECV_PIN = 11; //вход ИК приемника

    IRrecv irrecv(RECV_PIN);

    decode_results results;

    //eventTime, для паузы, вместо delay,будем использовать функцию millis.

    unsigned long eventTime=0;

    //индикация таймера

    int timer = 12;

    int L13 = 13; //пины управляющие моторами, светодиодами, или реле, чем угодно.

    int L2 = 2;

    int L3 = 3;

    int L4 = 4;

    int L5 = 5;

    int L6 = 6;

    int L7 = 7;

    int L8 = 8;

    void setup(){

    irrecv.enableIRIn(); // включить приемник

    pinMode(L13, OUTPUT); // назначаем пины как выходы

    pinMode(L2, OUTPUT);

    pinMode(L3, OUTPUT);

    pinMode(L4, OUTPUT);

    pinMode(L5, OUTPUT);

    pinMode(L6, OUTPUT);

    pinMode(L7, OUTPUT);

    pinMode(L8, OUTPUT);

    pinMode(timer, OUTPUT);

    }

    void loop() {

    // Эта конструкция нужна чтобы конвертировать пульсирующий (-) с (ИК) преемника сигнал в постоянный.

    //После появление и пропадания сигнала, состояние сразу не меняется! а ждет 100 миллисекунд.

    //Если 100 миллисекунд не прошло, и поступил еще один сигнал с пульта, тогда таймер заново запускается на 100 миллисекунд.

    //Проще говоря, пока кнопка на пульте нажата таймерПИН остается вКлюченным, если кнопка на пульте отпущена таймерПИН вЫключен.

    // Читаем данные с (ИК) преемника. В момент приема данных у (ИК) приемника на выходе появляется пульсирующий (-)отрицательный сигнал

    if (digitalRead(RECV_PIN) == LOW)

    // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);

    eventTime=millis(),digitalWrite(timer, HIGH);

    // Продолжительность работы таймера >100 миллисекунд. И ТаймерПИН выключаем //(timer, LOW)
    if(millis()-eventTime>100) digitalWrite(timer, LOW)

    // и вЫключаем все

    ,digitalWrite(L13, LOW),digitalWrite(L2, LOW),digitalWrite(L3, LOW)

    ,digitalWrite(L4, LOW),digitalWrite(L5, LOW),digitalWrite(L6, LOW),digitalWrite(L7, LOW),digitalWrite(L8, LOW);

    if (irrecv.decode(&results)) {

    //ВАЖНО !!! ( 1000809 ) это код кнопки №1 - моего (ИК)! (инфракрасного пульта)!, -

    //-у вашего пульта будет другой код, замените на свой!

    // У моего пульта при нажатии на одну и ту же кнопку, могут отсылаться два разных (КОДА) сигнала, чтобы обойти эту проблему

    //я использовал Логический оператор "или" (||) if (results.value == 0x1000809 || results.value == 0xF7283C77

    // Теперь неважно какой код отправлен с кнопки пульта, первый или второй

    // Если ваша кнопка пульта не страдает раздвоением личности, можете написать так if (results.value == 0x1000809

    //Только при условии если, (Одновременно),Обнаружен поступивший код кнопки

    // и выключен ТаймерПИН,"и" "&&" (digitalRead(timer) == HIGH)

    // включаем нужный нам pin, digitalWrite(L13, HIGH);

    if (results.value == 0x1000809 || results.value == 0xF7283C77 && (digitalRead(timer) == HIGH) )digitalWrite(L13, HIGH);

    if (results.value == 0x1008889 || results.value == 0x757FB4DF && (digitalRead(timer) == HIGH) )digitalWrite(L2, HIGH);

    if (results.value == 0x1004849 || results.value == 0xB33B4597 && (digitalRead(timer) == HIGH) )digitalWrite(L3, HIGH);

    if (results.value == 0x100C8C9 || results.value == 0x3C03E507 && (digitalRead(timer) == HIGH) )digitalWrite(L4, HIGH);

    if (results.value == 0x1002829 || results.value == 0xE705551F && (digitalRead(timer) == HIGH) )digitalWrite(L5, HIGH);

    if (results.value == 0x100A8A9 || results.value == 0xA4A58EC7 && (digitalRead(timer) == HIGH) )digitalWrite(L6, HIGH);

    if (results.value == 0x1006869 || results.value == 0xE2E45F7F && (digitalRead(timer) == HIGH) )digitalWrite(L7, HIGH);

    if (results.value == 0x100E8E9 || results.value == 0x6BACFEEF && (digitalRead(timer) == HIGH) )digitalWrite(L8, HIGH);

    irrecv.resume();

    }

    }
     
  6. Добрый вечер. В теме ардуино я совсем новичок.

    Созрела идея сделать метеостанцию с передачей данных на народный мониторинг. До самой передачи данных еще далековато, т.к. банально пока что не получается объединить пару скетчей в 1.

    Имеется 2 датчика BMP180 и SI7021. Все это прицепил на Arduino UNO. По отдельности каждый датчик свою функцию выполняет при помощи таких скетчей:

    Код (C++):
    // Distributed with a free-will license.
    // Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
    // SI7021
    // This code is designed to work with the SI7021_I2CS I2C Mini Module available from ControlEverything.com.
    // https://www.controleverything.com/content/Humidity?sku=SI7021_I2CS#tabs-0-product_tabset-2

    #include <Wire.h>

    // SI7021 I2C address is 0x40(64)
    #define Addr 0x40

    void setup()
    {
      // Initialise I2C communication as MASTER
      Wire.begin();
      // Initialise serial communication, set baud rate = 9600
      Serial.begin(9600);

      // Start I2C transmission
      Wire.beginTransmission(Addr);
      // Stop I2C transmission
      Wire.endTransmission();
      delay(300);
    }

    void loop()
    {
      unsigned int data[2];

      // Start I2C transmission
      Wire.beginTransmission(Addr);
      // Send humidity measurement command, NO HOLD MASTER
      Wire.write(0xF5);
      // Stop I2C transmission
      Wire.endTransmission();
      delay(500);
     
      // Request 2 bytes of data
      Wire.requestFrom(Addr, 2);

      // Read 2 bytes of data
      // humidity msb, humidity lsb
      if(Wire.available() == 2)
      {
        data[0] = Wire.read();
        data[1] = Wire.read();
      }
     
      // Convert the data
      float humidity  = ((data[0] * 256.0) + data[1]);
      humidity = ((125 * humidity) / 65536.0) - 6;

      // Start I2C transmission
      Wire.beginTransmission(Addr);
      // Send temperature measurement command, NO HOLD MASTER
      Wire.write(0xF3);
      // Stop I2C transmission
      Wire.endTransmission();
      delay(500);
     
      // Request 2 bytes of data
      Wire.requestFrom(Addr, 2);

      // Read 2 bytes of data
      // temp msb, temp lsb
      if(Wire.available() == 2)
      {
        data[0] = Wire.read();
        data[1] = Wire.read();
      }

      // Convert the data
      float temp  = ((data[0] * 256.0) + data[1]);
      float cTemp = ((175.72 * temp) / 65536.0) - 46.85;
      float fTemp = cTemp * 1.8 + 32;
     
      // Output data to serial monitor
      Serial.print("Влажность : ");
      Serial.print(humidity);
      Serial.println(" % RH");
      Serial.print("Температура : ");
      Serial.print(cTemp);
      Serial.println(" C");
       delay(30000);
    }


    Код (C++):
    #include <Wire.h>
    #include <Adafruit_BMP085.h>

    #define one_wire-bus 2

    Adafruit_BMP085 bmp;

    void setup() {
      Serial.begin(9600);
       if (!bmp.begin()) {
        Serial.println("Could not find a valid BMP085 sensor, check wiring!");
        while (1) {}
      }
    }

    void loop() {
        Serial.print("Temperature = ");
        Serial.print(bmp.readTemperature());
        Serial.println(" *C");
     
        Serial.print("Pressure = mm Hg");
        Serial.print(bmp.readPressure());
        Serial.println(" mm Hg");
     
        // Calculate altitude assuming 'standard' barometric
        // pressure of 1013.25 millibar = 101325 Pascal
        Serial.print("Altitude = ");
        Serial.print(bmp.readAltitude());
        Serial.println(" meters");

        Serial.print("Pressure at sealevel (calculated) = ");
        Serial.print(bmp.readSealevelPressure()/133.3);
        Serial.println(" mm");

      // you can get a more precise measurement of altitude
      // if you know the current sea level pressure which will
      // vary with weather and such. If it is 1015 millibars
      // that is equal to 101500 Pascals.
        Serial.print("Real altitude = ");
        Serial.print(bmp.readAltitude(101500));
        Serial.println(" meters");
     
        Serial.println();
        delay(25000);
    }

    Объединить воедино никак не удается, на выходе или ошибки или же идут показания только от SI7021.

    Вот что компилятор забраковал из последнего

    Код (C++):
    // Distributed with a free-will license.
    // Use it any way you want, profit or free, provided it fits in the licenses of its associated works.
    // SI7021
    // This code is designed to work with the SI7021_I2CS I2C Mini Module available from ControlEverything.com.
    // https://www.controleverything.com/content/Humidity?sku=SI7021_I2CS#tabs-0-product_tabset-2

    #include <Wire.h>
    #include <Adafruit_BMP085.h>

    // SI7021 I2C address is 0x40(64)
    #define Addr 0x40
    #define one_wire-bus 2

    Adafruit_BMP085 bmp;

    void setup()
    {
      // Initialise I2C communication as MASTER
      Wire.begin();
      // Initialise serial communication, set baud rate = 9600
      // Start I2C transmission
      Wire.beginTransmission(Addr);
      // Stop I2C transmission
      Wire.endTransmission();

      Serial.begin(9600);
      if (!bmp.begin()) {
      Serial.println("Could not find a valid BMP085 sensor, check wiring!");
      while (1) {}

      delay(300);
    }

    void loop()
    {
      unsigned int data[2];

      // Start I2C transmission
      Wire.beginTransmission(Addr);
      // Send humidity measurement command, NO HOLD MASTER
      Wire.write(0xF5);
      // Stop I2C transmission
      Wire.endTransmission();
      delay(500);
     
      // Request 2 bytes of data
      Wire.requestFrom(Addr, 2);

      // Read 2 bytes of data
      // humidity msb, humidity lsb
      if(Wire.available() == 2)
      {
        data[0] = Wire.read();
        data[1] = Wire.read();
      }
     
      // Convert the data
      float humidity  = ((data[0] * 256.0) + data[1]);
      humidity = ((125 * humidity) / 65536.0) - 6;

      // Start I2C transmission
      Wire.beginTransmission(Addr);
      // Send temperature measurement command, NO HOLD MASTER
      Wire.write(0xF3);
      // Stop I2C transmission
      Wire.endTransmission();
      delay(500);
     
      // Request 2 bytes of data
      Wire.requestFrom(Addr, 2);

      // Read 2 bytes of data
      // temp msb, temp lsb
      if(Wire.available() == 2)
      {
        data[0] = Wire.read();
        data[1] = Wire.read();
      }

      // Convert the data
      float temp  = ((data[0] * 256.0) + data[1]);
      float cTemp = ((175.72 * temp) / 65536.0) - 46.85;
      float fTemp = cTemp * 1.8 + 32;
     
      // Output data to serial monitor
      Serial.print("Влажность : ");
      Serial.print(humidity);
      Serial.println(" % RH");
      Serial.print("Температура : ");
      Serial.print(cTemp);
      Serial.println(" C");
    }



    Буду признателен за любую помощь
     
  7. vvr

    vvr Инженерище

    в конце сетапа скобки не хватает
     
  8. Dan1983

    Dan1983 Нуб

    Помогите объединить два скетча первый это делительное устройство управляется кнопками второй управляет шаговым при помощи энкодера.
    Нужно чтобы можно было управлять Шаговым мотором кнопками и энкодером.

    Код (C++):
    //Sample using LiquidCrystal library
    #include <LiquidCrystal.h>
    #include <LCDKeypad.h>
    /*******************************************************
    This program uses the Sainsmart LCD / Keypad shield with
    the Arduino to form a stepper driven dividing head.  The
    Sainsmart shield has a 2 row x 16 character LCD for display
    and 5 input buttons arranged as left, right, up, down, and
    select in addition to a reset button carried up from the
    Arduino motherboard.
    ********************************************************/

    // select the pins used on the LCD panel
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    // Arduino pins used for stepper control
    #define stepDir 49
    #define stepGo 47
    /************ values used by the panel and buttons*****************/
    #define btnRIGHT  0
    #define btnUP     1
    #define btnDOWN   2
    #define btnLEFT   3
    #define btnSELECT 4
    #define btnNONE   5
    #define btnERR    6
    int lcd_key     = btnNONE;      
    int adc_key_in  = 0;
       
    /************* values used by the dividing head *******************/
    boolean sel = false;                    // Stores current value of select, toggled true or false
                                            //  if false, up / down keys increment / decrement delay between steps
                                            //  if false, up / down keys increment / decrement # of divisions
    int del = 5;                            // default delay value
    int divs = 0;                           // Holds the number of divisions
    int pos = 0;                            // Holds the current dividing head position (0 (zero) based)
    int lastpos = 0;            // Last absolute stepper position
    int nextstep = 0;                       // used for calculation of next stepper position
    int laststep = 0;
    int nsteps = 0;                         // Count of steps to advance stepper
    int intsteps = 0;
    float stepsDiv = 0;            // Steps per Division
    float numSteps = 1000.0;                // Number of steps per spindle revolution
    boolean div_done = false;
    /******************* Move the stepper ****************************/
    void step (int dir)
    {
      pos = pos + dir;                      // Increment (or Decrement) position
      if( pos == divs )                     // If position back at start, set to 0
      {
        pos = 0;
        lastpos = -1;
      }
      if( pos < 0 )                         // If position just moved from 0 to -1, set to divs - 1
      {
        pos = divs - 1;
        lastpos = divs;
      }
      laststep = round(stepsDiv * lastpos);
      nextstep = round(stepsDiv * pos);
      nsteps = abs(nextstep - laststep);
      intsteps = nsteps;
      if(dir > 0)                           // Set the step direction
      {
        digitalWrite(stepDir,LOW);
      }
      else
      {
        digitalWrite(stepDir,HIGH);
      }
      lcd.setCursor(9,0);
      lcd.print(nsteps);
      while(nsteps > 0)                     // Loop through number of steps
      {
        digitalWrite(stepGo,1);             // Start Stepper
        delayMicroseconds (200);
        digitalWrite(stepGo,0);             // Stop Stepper
        delay( del );
        nsteps--;
      }
      lastpos = pos;
    }
    /********************* read the buttons **************************/
    int read_LCD_buttons()
    {
    adc_key_in = 0;
    do
    {
       adc_key_in = analogRead(0);          // read the value from the sensor
    } while( adc_key_in > 1000 );
    delay(200);
    // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
    // we add approx 50 to those values and check to see if we are close
    if (adc_key_in < 50)   return btnRIGHT;
    if (adc_key_in < 195)  return btnUP;
    if (adc_key_in < 380)  return btnDOWN;
    if (adc_key_in < 555)  return btnLEFT;
    if (adc_key_in < 790)  return btnSELECT;
    return btnERR;              // when all others fail, return this...
    }

    /********************* Set Up ************************************/
    void setup()
    {
    pinMode(stepDir,OUTPUT);
    pinMode(stepGo,OUTPUT);\
    lcd.begin( 16, 2 );
    lcd.clear();
    lcd.print( "Use Up/Down Btns" );
    lcd.setCursor( 0,1 );
    lcd.print( "to set Divisions" );
    while ( !div_done )
    {
       lcd_key = read_LCD_buttons();
       switch (lcd_key )
       {
         case btnNONE:
         {
           break;
         }
         case btnUP:
         {
           divs++;
           break;
         }
         case btnDOWN:
         {
           if( divs > 0 ) divs--;
           break;
         }
         case btnSELECT:
         {
           if( divs > 0 )
           {
             div_done = true;
           }
           break;
         }
       }
       lcd.setCursor( 0, 0 );
       lcd.print( "Div:            ");
       lcd.setCursor( 5, 0 );
       lcd.print( divs );
       lcd.setCursor( 0, 1 );
       lcd.print( "Select When Done" );
       lcd.setCursor( 9, 0 );
       lcd.print( div_done );
    }
    lcd.clear();
    lcd.print("DIV: ");
    lcd.print(divs);                          // display the number of divisions
    lcd.setCursor(0,1);
    lcd.print("POS: ");
    lcd.print(pos+1);                    // display the current position
    lcd.setCursor(9,1);
    lcd.print(nextstep);                            // print the stepper position
    stepsDiv = numSteps / divs;
    }

    /********************Main Program Loop ***************************/
    void loop()
    {
    lcd_key = read_LCD_buttons();              // read the buttons
    switch (lcd_key)                         // depending on which button was pushed, we perform an action
    {
       case btnLEFT:                              // Step dividing head back one interval
         {
           step (-1);
           break;
         }
       case btnRIGHT:                             // Step dividing head forward one interval
         {
         step (1);
         break;
         }
       case btnUP:                                // Increment the number of divisions
         {
           del=del+1;
           break;
         }

       case btnDOWN:                              // Decrement the number of divisions if > 0
       {
         if( del > 0 )
           {
             del=del-1;
           }
         break;
       }
       case btnERR:
       {
         lcd.clear();
         lcd.print( "Button Error!" );
         return;
       }
    }
    /***************** Print all the updated data to the LCD ***************************/
    lcd.clear();
    lcd.print("DIV: ");
    lcd.print(divs);                          // display the number of divisions
    lcd.setCursor(0,1);
    lcd.print("POS: ");
    lcd.print(pos+1);                    // display the current position
    lcd.setCursor(9,1);
    lcd.print(nextstep);                            // print the stepper position
    lcd.setCursor(14,0);
    lcd.setCursor(14,1);
    lcd.print( del );
    }


    Второй код


    Код (C++):
    #include <AccelStepper.h>

    int motorSpeed = 30000; //maximum steps per second (about 5rps / at 8 microsteps)
    int motorAccel = 30000; //steps/second/second to accelerate

    const unsigned char ttable[7][4] = {
    {0x0, 0x2, 0x4, 0x0}, {0x3, 0x0, 0x1, 0x10},
    {0x3, 0x2, 0x0, 0x0}, {0x3, 0x2, 0x1, 0x0},
    {0x6, 0x0, 0x4, 0x0}, {0x6, 0x5, 0x0, 0x20},
    {0x6, 0x5, 0x4, 0x0},
    };

    #define DT 3
    #define CLK 2
    #define SW 4
    #define DIR_CCW 0x10
    #define DIR_CW 0x20
    int motorStepPin = 47; //digital pin 3
    int motorDirPin = 49; //digital pin 2
    const int Enable_PIN = 50;
    AccelStepper stepper(1, motorStepPin, motorDirPin);
    volatile unsigned char state = 0;

    void setup(){
      stepper.setMaxSpeed(motorSpeed);
      stepper.setSpeed(motorSpeed);
      stepper.setAcceleration(motorAccel);
      pinMode(Enable_PIN, OUTPUT);
      digitalWrite(Enable_PIN, LOW);
      stepper.moveTo(8000); //move 32000 steps (should be 10 rev)
      Serial.begin(9600);
      pinMode(DT, INPUT);
      pinMode(CLK, INPUT);
      pinMode(SW, INPUT);
      digitalWrite(SW, HIGH);
    }

    void loop(){
    int counter;
    unsigned char result;
      /* Reset the counter */
    counter = 0;

      while(1)
      {
        /* Read the status of the dial */
        unsigned char pinstate = (digitalRead(CLK) << 1) | digitalRead(DT);
        state = ttable[state & 0xf][pinstate];
        result=state&0x30;
        if(result==DIR_CCW) counter++;
            if(result==DIR_CW) counter--;
    // put some magnification  hera about 10 times
       stepper.moveTo(counter*1);
        stepper.run();
      }
    }


    Оба кода рабочие но по отдельность




    Но работает либо одно либо другое когда меняешь на 1 либо 0 в while(1)


    Код (C++):
    void loop(){
    int counter;
    unsigned char result;
      /* Reset the counter */
    counter = 0;

    while(1)
      {
        /* Read the status of the dial */
        unsigned char pinstate = (digitalRead(CLK) << 1) | digitalRead(DT);
        state = ttable[state & 0xf][pinstate];
        result=state&0x30;
        if(result==DIR_CCW) counter++;
            if(result==DIR_CW) counter--;
    // put some magnification  hera about 10 times
       stepper.moveTo(counter*1);
        stepper.run();
      }
     
    Последнее редактирование: 6 июл 2017
  9. Dan1983

    Dan1983 Нуб

    Вот мой объединенный код


    Код (C++):
    //Sample using LiquidCrystal library
    #include <LiquidCrystal.h>
    #include <LCDKeypad.h>
    #include <AccelStepper.h>

    int motorSpeed = 30000; //maximum steps per second (about 5rps / at 8 microsteps)
    int motorAccel = 30000; //steps/second/second to accelerate

    const unsigned char ttable[7][4] = {
    {0x0, 0x2, 0x4, 0x0}, {0x3, 0x0, 0x1, 0x10},
    {0x3, 0x2, 0x0, 0x0}, {0x3, 0x2, 0x1, 0x0},
    {0x6, 0x0, 0x4, 0x0}, {0x6, 0x5, 0x0, 0x20},
    {0x6, 0x5, 0x4, 0x0},
    };

    #define DT 3
    #define CLK 2
    #define SW 4
    #define DIR_CCW 0x10
    #define DIR_CW 0x20
    int motorStepPin = 47; //digital pin 3
    int motorDirPin = 49; //digital pin 2
    const int Enable_PIN = 50;
    AccelStepper stepper(1, motorStepPin, motorDirPin);
    volatile unsigned char state = 0;
    /*******************************************************
    This program uses the Sainsmart LCD / Keypad shield with
    the Arduino to form a stepper driven dividing head.  The
    Sainsmart shield has a 2 row x 16 character LCD for display
    and 5 input buttons arranged as left, right, up, down, and
    select in addition to a reset button carried up from the
    Arduino motherboard.
    ********************************************************/

    // select the pins used on the LCD panel
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

    // Arduino pins used for stepper control
    #define stepDir 49
    #define stepGo 47
    /************ values used by the panel and buttons*****************/
    #define btnRIGHT  0
    #define btnUP     1
    #define btnDOWN   2
    #define btnLEFT   3
    #define btnSELECT 4
    #define btnNONE   5
    #define btnERR    6
    int lcd_key     = btnNONE;          
    int adc_key_in  = 0;  
           
    /************* values used by the dividing head *******************/
    boolean sel = false;                    // Stores current value of select, toggled true or false
                                            //  if false, up / down keys increment / decrement delay between steps
                                            //  if false, up / down keys increment / decrement # of divisions
    int del = 5;                            // default delay value
    int divs = 0;                           // Holds the number of divisions
    int pos = 0;                            // Holds the current dividing head position (0 (zero) based)
    int lastpos = 0;            // Last absolute stepper position
    int nextstep = 0;                       // used for calculation of next stepper position
    int laststep = 0;
    int nsteps = 0;                         // Count of steps to advance stepper
    int intsteps = 0;
    float stepsDiv = 0;            // Steps per Division
    float numSteps = 1000.0;                // Number of steps per spindle revolution
    boolean div_done = false;
    /******************* Move the stepper ****************************/
    void step (int dir)
    {
      pos = pos + dir;                      // Increment (or Decrement) position
      if( pos == divs )                     // If position back at start, set to 0
      {
        pos = 0;
        lastpos = -1;
      }
      if( pos < 0 )                         // If position just moved from 0 to -1, set to divs - 1
      {
        pos = divs - 1;
        lastpos = divs;
      }  
      laststep = round(stepsDiv * lastpos);
      nextstep = round(stepsDiv * pos);
      nsteps = abs(nextstep - laststep);
      intsteps = nsteps;
      if(dir > 0)                           // Set the step direction
      {
        digitalWrite(stepDir,LOW);
      }
      else
      {
        digitalWrite(stepDir,HIGH);
      }
      lcd.setCursor(9,0);
      lcd.print(nsteps);
      while(nsteps > 0)                     // Loop through number of steps
      {
        digitalWrite(stepGo,1);             // Start Stepper
        delayMicroseconds (200);
        digitalWrite(stepGo,0);             // Stop Stepper
        delay( del );
        nsteps--;
      }
      lastpos = pos;
    }
    /********************* read the buttons **************************/
    int read_LCD_buttons()
    {
    adc_key_in = 0;
    do
    {
       adc_key_in = analogRead(0);          // read the value from the sensor
    } while( adc_key_in > 1000 );
    delay(200);
    // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
    // we add approx 50 to those values and check to see if we are close
    if (adc_key_in < 50)   return btnRIGHT;
    if (adc_key_in < 195)  return btnUP;
    if (adc_key_in < 380)  return btnDOWN;
    if (adc_key_in < 555)  return btnLEFT;
    if (adc_key_in < 790)  return btnSELECT;  
    return btnERR;              // when all others fail, return this...
    }

    /********************* Set Up ************************************/
    void setup(){
     
      stepper.setMaxSpeed(motorSpeed);
      stepper.setSpeed(motorSpeed);
      stepper.setAcceleration(motorAccel);
      pinMode(Enable_PIN, OUTPUT);
      digitalWrite(Enable_PIN, LOW);
      stepper.moveTo(8000); //move 32000 steps (should be 10 rev)
      Serial.begin(9600);
      pinMode(DT, INPUT);
      pinMode(CLK, INPUT);
      pinMode(SW, INPUT);
      digitalWrite(SW, HIGH);
     
    pinMode(stepDir,OUTPUT);
    pinMode(stepGo,OUTPUT);\
    lcd.begin( 16, 2 );
    lcd.clear();
    lcd.print( "Use Up/Down Btns" );
    lcd.setCursor( 0,1 );
    lcd.print( "to set Divisions" );
    while ( !div_done )
    {
       lcd_key = read_LCD_buttons();
       switch (lcd_key )
       {
         case btnNONE:
         {
           break;
         }
         case btnUP:
         {
           divs++;
           break;
         }
         case btnDOWN:
         {
           if( divs > 0 ) divs--;
           break;
         }
         case btnSELECT:
         {
           if( divs > 0 )
           {
             div_done = true;
           }
           break;
         }
       }
       lcd.setCursor( 0, 0 );
       lcd.print( "Div:            ");
       lcd.setCursor( 5, 0 );
       lcd.print( divs );
       lcd.setCursor( 0, 1 );
       lcd.print( "Select When Done" );
       lcd.setCursor( 9, 0 );
       lcd.print( div_done );
    }
    lcd.clear();
    lcd.print("DIV: ");
    lcd.print(divs);                          // display the number of divisions
    lcd.setCursor(0,1);
    lcd.print("POS: ");
    lcd.print(pos+1);                    // display the current position
    lcd.setCursor(9,1);
    lcd.print(nextstep);                            // print the stepper position
    stepsDiv = numSteps / divs;
    }
     
    /********************Main Program Loop ***************************/
    void loop(){
    int counter;
    unsigned char result;
      /* Reset the counter */
    counter = 0;

      while(1)
      {
        /* Read the status of the dial */
        unsigned char pinstate = (digitalRead(CLK) << 1) | digitalRead(DT);
        state = ttable[state & 0xf][pinstate];
        result=state&0x30;
        if(result==DIR_CCW) counter++;
            if(result==DIR_CW) counter--;
    // put some magnification  hera about 10 times
       stepper.moveTo(counter*1);
        stepper.run();
      }
    {
    lcd_key = read_LCD_buttons();              // read the buttons
    switch (lcd_key)                         // depending on which button was pushed, we perform an action
    {
       case btnLEFT:                              // Step dividing head back one interval
         {
           step (-1);
           break;
         }
       case btnRIGHT:                             // Step dividing head forward one interval
         {
         step (1);
         break;
         }
       case btnUP:                                // Increment the number of divisions
         {
           del=del+1;
           break;
         }
       
       case btnDOWN:                              // Decrement the number of divisions if > 0
       {
         if( del > 0 )
           {
             del=del-1;
           }
         break;
       }
       case btnERR:
       {
         lcd.clear();
         lcd.print( "Button Error!" );
         return;
       }
    }
    /***************** Print all the updated data to the LCD ***************************/
    lcd.clear();
    lcd.print("DIV: ");
    lcd.print(divs);                          // display the number of divisions
    lcd.setCursor(0,1);
    lcd.print("POS: ");
    lcd.print(pos+1);                    // display the current position
    lcd.setCursor(9,1);
    lcd.print(nextstep);                            // print the stepper position
    lcd.setCursor(14,0);
    lcd.setCursor(14,1);
    lcd.print( del );
    }}
     
  10. IgorBorNN

    IgorBorNN Нуб

    Добрый день !!! Посмотрел вашу работу и понял что мне сюда !!! Есть разработка не без помощи ребят, но так же требуется совмещение скетчей. Уже много перелопатил по форумам но своими старыми мозгами так и не могу понять как это сделать. Есть отдельный скетчи на: 1. передатчик NRF24L01 + 2.4ГГц 2. Управление джойстиком с кнопкой, это передатчик. А так же приемник: 1. приемник NRF24L012.4ГГц, 2. Драйвер 2х обычных щеточных двигателей 3. включение еще одного мотора с кнопки джойстика. Вот примерно такая картина. Как это все в кучу собрать ума не приложу !!! Прошу помощи !!!
     
  11. Dayka

    Dayka Нуб

    Привет всем, неделю назад приехал мой набор для начинающих Ардуино Уно)
    Решил собрать машинку из того что есть в наборе, на ик управление, один шаговый двигатель и серво для поворота.
    Нашел два подходящих скетча, по отдельности все работает, как ни пытался объединить их, не получается.
    Прошу вашей помощи.
    Заранее благодарен.
    Код (C++):
    #include "IRremote.h"
    #include "Servo.h"

    #define plus 0x807F40BF   //clockwise rotation button
    #define minus 0x807FC03F  //counter clockwise rotation button

    int receiver = 6;       //IR receiver pin
    Servo servo;
    int val;                //rotation angle
    bool cwRotation, ccwRotation;  //the states of rotation

    IRrecv irrecv(receiver);

    decode_results results;

    void setup()
    {
      Serial.begin(9600);
      irrecv.enableIRIn(); // Start the receiver
      servo.attach(7);     //servo pin
    }

    void loop()
    {
      if (irrecv.decode(&results)) {
        Serial.println(results.value, HEX);
        irrecv.resume(); // Receive the next value

        if (results.value == plus)
        {
          cwRotation = !cwRotation;      //toggle the rotation value
          ccwRotation = false;         //no rotation in this direction
        }

        if (results.value == minus)
        {
          ccwRotation = !ccwRotation;   //toggle the rotation value
          cwRotation = false;            //no rotation in this direction
        }
      }
      if (cwRotation && (val != 175))  {
        val++;                         //for colockwise button
      }
      if (ccwRotation && (val != 0))  {
        val--;                         //for counter colockwise button
      }
      servo.write(val);
      delay(20);          //General speed
    }
    Код (C++):
    #include "Stepper.h"
    #include "IRremote.h"

    /*----- Variables, Pins -----*/
    #define STEPS  32   // Number of steps per revolution of Internal shaft
    int  Steps2Take;  // 2048 = 1 Revolution
    int receiver = 6; // Signal Pin of IR receiver to Arduino Digital Pin 6

    /*-----( Declare objects )-----*/
    // Setup of proper sequencing for Motor Driver Pins
    // In1, In2, In3, In4 in the sequence 1-3-2-4

    Stepper small_stepper(STEPS, 8, 10, 9, 11);
    IRrecv irrecv(receiver);    // create instance of 'irrecv'
    decode_results results;     // create instance of 'decode_results'

    void setup()
    {
      irrecv.enableIRIn(); // Start the receiver
    }

    void loop()
    {
    if (irrecv.decode(&results)) // have we received an IR signal?

      {
        switch(results.value)

        {

          case 0x807F00FF: // UP button pressed
                          small_stepper.setSpeed(500); //Max seems to be 700
                          Steps2Take  =  2048;  // Rotate CW
                          small_stepper.step(Steps2Take);
                          delay(10);
                          break;

          case 0x807F807F: // DOWN button pressed
                          small_stepper.setSpeed(500);
                          Steps2Take  =  -2048;  // Rotate CCW
                          small_stepper.step(Steps2Take);
                          delay(10);
                          break;
                         
        }
       
          irrecv.resume(); // receive the next value
      }


    }/* --end main loop -- */