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

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

  1. buktopz

    buktopz Нерд

    Понял, спасибо, завтра буду биться дальше
     
  2. Alex19

    Alex19 Гуру

    Закомментируйте пока, можете оставить, это не ошибка. Ну подадите Вы на него 5V или 0V ни чего не случиться, но лучше убрать, так просто логичнее.

    Сейчас у Вас TX и RX от M590 были подключены к пинам RX и TX Arduino на прямую, а у Arduino логика 5V. Что могло убить/подпалить M590. Поэтому для начала сделайте правильное подключение, а уже потом все остальное.
     
    buktopz нравится это.
  3. buktopz

    buktopz Нерд

    понял, спасибо
     
  4. Alex19

    Alex19 Гуру

    Не за что, сам когда-то учился.

    Почитайте так же форумы, только тут о нем - http://forum.amperka.ru/threads/Помогите-с-neoway-m590.8735/, http://forum.amperka.ru/threads/sms-модуль.5658/ пару заметок и т.д.

    Там же еще лед на схеме есть, который говорит о работе. Включен и т.д.
     
    buktopz нравится это.
  5. buktopz

    buktopz Нерд

    все пока ничего не нужно читать, неаккуратно питание переключил, контроллер и usb-ttl спалил
     
  6. Alex19

    Alex19 Гуру

    Аккуратнее, спешить не стоит, странно, как у Вас так получилось.
     
    buktopz нравится это.
  7. buktopz

    buktopz Нерд

    сплю у нас 1-30, ладно спасибо еще раз, до свидания
     
  8. Alex19

    Alex19 Гуру

    Бывает, удачи!
     
    buktopz нравится это.
  9. Xaoss

    Xaoss Нуб

    Уважаемые форумчане пожалуйста помогите объединить эти два кода.
    Собираться все это будет МЕГА2560
    По отдельности оба кода работают.

    #define REMOTEXY_MODE__W5100_SPI
    #include <Ethernet.h>
    /* Ethernet shield used pins: 10(SS) */
    #include <SPI.h>
    /* SPI interface used pins: 51(MOSI), 50(MISO), 52(SCK) */
    #include <MFRC522.h>
    #include <Servo.h>

    Servo microservo9g;

    #define SS_PIN 53
    #define RST_PIN 5
    // Definicoes pino modulo RC522
    MFRC522 mfrc522(SS_PIN, RST_PIN);

    // Leds indicadores acesso liberado ou negado
    int led_liberado = 40;
    int led_negado = 41;

    char st[20];

    #include <RemoteXY.h>

    /* настройки соединения */
    #define REMOTEXY_ETHERNET_MAC "DE:AD:BE:EF:EF:ED"
    #define REMOTEXY_SERVER_PORT 6377


    /* конфигурация интерфейса */
    #pragma pack(push, 1)
    uint8_t RemoteXY_CONF[] =
    { 4,22,143,0,6,5,6,2,0,0
    ,0,22,11,0,0,22,11,2,1,79
    ,70,70,0,79,78,0,2,0,0,12
    ,22,11,0,12,22,11,2,1,79,70
    ,70,0,79,78,0,2,0,0,24,22
    ,11,0,24,22,11,2,1,79,70,70
    ,0,79,78,0,2,0,0,36,22,11
    ,0,36,22,11,2,1,79,70,70,0
    ,79,78,0,67,4,27,2,22,10,26
    ,9,17,9,2,1,11,67,4,27,15
    ,22,10,26,20,17,10,2,1,11,131
    ,1,63,1,36,7,22,78,40,8,2
    ,1,71,65,83,84,73,78,78,65,89
    ,65,0,131,0,77,9,20,7,41,87
    ,20,7,2,2,84,118,0 };

    /* структура определяет все переменные вашего интерфейса управления */
    struct {

    /* input variable */
    uint8_t switch_1; /* =1 если переключатель включен и =0 если отключен */
    uint8_t switch_2; /* =1 если переключатель включен и =0 если отключен */
    uint8_t switch_3; /* =1 если переключатель включен и =0 если отключен */
    uint8_t switch_4; /* =1 если переключатель включен и =0 если отключен */

    /* output variable */
    char text_temp[11]; /* =строка UTF8 оканчивающаяся нулем */
    char text_hum[11]; /* =строка UTF8 оканчивающаяся нулем */
    signed char level_temp_down; /* =0..100 level position */
    signed char level_temp_up; /* =0..100 level position */
    signed char level_hum; /* =0..100 level position */


    /* other variable */
    uint8_t connect_flag; /* =1 if wire connected, else =0 */

    } RemoteXY;
    #pragma pack(pop)

    /////////////////////////////////////////////
    // END RemoteXY include //
    /////////////////////////////////////////////

    #define PIN_SWITCH_1 4
    #define PIN_SWITCH_2 8
    #define PIN_SWITCH_3 6
    #define PIN_SWITCH_4 7
    #include "DHT.h"
    #define DHTPIN 2
    DHT dht(DHTPIN, DHT11);


    void setup()
    {
    RemoteXY_Init ();

    pinMode (PIN_SWITCH_1, OUTPUT);
    pinMode (PIN_SWITCH_2, OUTPUT);
    pinMode (PIN_SWITCH_3, OUTPUT);
    pinMode (PIN_SWITCH_4, OUTPUT);
    pinMode(led_liberado, OUTPUT);
    pinMode(led_negado, OUTPUT);
    // Define que o servo esta ligado a porta digital 3
    microservo9g.attach(3);
    // Move o servo para a posicao inicial (cancela fechada)
    microservo9g.write(90);
    // Inicia a serial
    Serial.begin(9600);
    // Inicia SPI bus
    SPI.begin();
    // Inicia MFRC522
    mfrc522.PCD_Init();
    // Mensagens iniciais no serial monitor
    Serial.println("Aproxime o seu cartao do leitor...");
    Serial.println();

    // TODO you setup code

    }

    void loop()
    {
    RemoteXY_Handler ();

    digitalWrite(PIN_SWITCH_1, (RemoteXY.switch_1==0)?LOW:HIGH);
    digitalWrite(PIN_SWITCH_2, (RemoteXY.switch_2==0)?LOW:HIGH);
    digitalWrite(PIN_SWITCH_3, (RemoteXY.switch_3==0)?LOW:HIGH);
    digitalWrite(PIN_SWITCH_4, (RemoteXY.switch_4==0)?LOW:HIGH);
    {
    float temp = dht.readTemperature();
    float hum = dht.readHumidity();

    dtostrf(temp, 0, 1, RemoteXY.text_temp);
    dtostrf(hum, 0, 1, RemoteXY.text_hum);
    {
    // Aguarda a aproximacao do cartao
    if ( ! mfrc522.PICC_IsNewCardPresent())
    {
    return;
    }
    // Seleciona um dos cartoes
    if ( ! mfrc522.PICC_ReadCardSerial())
    {
    return;
    }
    // Mostra UID na serial
    Serial.print("UID da tag :");
    String conteudo= "";
    byte letra;
    for (byte i = 0; i < mfrc522.uid.size; i++)
    {
    Serial.print(mfrc522.uid.uidByte < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte, HEX);
    conteudo.concat(String(mfrc522.uid.uidByte < 0x10 ? " 0" : " "));
    conteudo.concat(String(mfrc522.uid.uidByte, HEX));
    }
    Serial.println();
    Serial.print("Mensagem : ");
    conteudo.toUpperCase();
    // Testa se o cartao1 foi lido
    if (conteudo.substring(1) == "D9 74 D5 35")
    {
    // Levanta a cancela e acende o led verde
    microservo9g.write(-200);
    digitalWrite(led_liberado, HIGH);
    Serial.println("Cartao1 - Acesso liberado !");
    Serial.println();
    delay(3000);
    microservo9g.write(150);
    digitalWrite(led_liberado, LOW);
    }

    // Testa se o cartao2 foi lido
    if (conteudo.substring(1) == "C6 8B 22 7E")
    {
    Serial.println("Cartao2 - Acesso negado !!");
    Serial.println();
    // Pisca o led vermelho
    for (int i= 1; i<5 ; i++)
    {
    digitalWrite(led_negado, HIGH);
    delay(200);
    digitalWrite(led_negado, LOW);
    delay(200);
    }
    }
    delay(1000);
    }

    // TODO you loop code
    // используйте структуру RemoteXY для передачи данных
    }

    }
    --------------------------------------------------------------------------------------------------------------------------------------
    #include <Password.h>
    #include <Keypad.h>
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>


    Password password = Password("1234"); // password
    int dlugosc = 4; // length of the password

    LiquidCrystal_I2C lcd(0x27,16,2);
    int ledRed = 11;
    int ledGreen = 12;

    int led = 13; //переменная с номером пина светодиода
    int ldr = 0; //и фоторезистора

    int ilosc; // number of clicks

    const byte ROWS = 4; // rows
    const byte COLS = 4; // cols

    char keys[ROWS][COLS] =
    {
    {'1','2','3','A'},
    {'4','5','6','B'},
    {'7','8','9','C'},
    {'*','0','#','D'}
    };

    byte rowPins[ROWS] = {9,8,7,6};
    byte colPins[COLS] = {5,4,3,2};

    Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

    void setup()
    {
    lcd.init(); // Инициализация lcd
    lcd.backlight(); // Включаем подсветку
    Serial.begin(9600);
    keypad.addEventListener(keypadEvent);
    pinMode(ledRed, OUTPUT);
    pinMode(ledGreen, OUTPUT);
    pinMode(led, OUTPUT); //указываем, что светодиод - выход


    digitalWrite(ledRed, HIGH);
    digitalWrite(ledGreen, LOW);

    lcd.begin(16, 2);

    lcd.setCursor(1,0);
    lcd.print(" Welcome ");
    lcd.setCursor(0,1);
    lcd.print("PLEASE ENTER PIN");
    }

    void loop()
    {
    {
    if (analogRead(ldr) < 800) digitalWrite(led, HIGH);

    //если показатель освещенности меньше 800, включаем светодиод

    else digitalWrite(led, LOW); //иначе выключаем

    }

    keypad.getKey();
    }
    void keypadEvent(KeypadEvent eKey)
    {
    switch (keypad.getState())
    {
    case PRESSED:

    int i;
    for( i = 1; i <= 1; i++ )


    Serial.print("Pressed: ");
    Serial.println(eKey);

    switch (eKey)
    {
    /*
    case '#':
    break;

    case '*':
    break;
    */

    default:
    ilosc=ilosc+1;
    password.append(eKey);
    }
    //Serial.println(ilosc);

    if(ilosc == 1)
    {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" < PIN >");
    lcd.setCursor(0,1);
    lcd.print("*_");
    }
    if(ilosc == 2)
    {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" < PIN >");
    lcd.setCursor(0,1);
    lcd.print("**_");
    }
    if(ilosc == 3)
    {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" < PIN >");
    lcd.setCursor(0,1);
    lcd.print("***_");
    }
    if(ilosc == 4)
    {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" < PIN >");
    lcd.setCursor(0,1);
    lcd.print("****_");
    }
    if(ilosc == 5)
    {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" < PIN >");
    lcd.setCursor(0,1);
    lcd.print("*****_");
    }
    if(ilosc == 6)
    {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" < PIN >");
    lcd.setCursor(0,1);
    lcd.print("******_");
    }
    if(ilosc == 7)
    {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" < PIN >");
    lcd.setCursor(0,1);
    lcd.print("*******_");
    }
    if(ilosc == 8)
    {
    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" < PIN >");
    lcd.setCursor(0,1);
    lcd.print("********");
    }

    if(ilosc == dlugosc)
    {
    delay(250);
    checkPassword();
    ilosc = 0;
    }
    }
    }

    void checkPassword()
    {
    if (password.evaluate())
    {
    int i;
    for( i = 1; i <= 2; i++ )

    ilosc = 0;

    Serial.println("Success");

    digitalWrite(ledRed, LOW);
    digitalWrite(ledGreen, HIGH);

    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print(" << SUCCESS >>");
    }
    else
    {
    int i;
    for( i = 1; i <= 1; i++ )

    ilosc = 0;
    password.reset();

    Serial.println("Wrong");

    digitalWrite(ledGreen, LOW);
    digitalWrite(ledRed, HIGH);

    lcd.clear();
    lcd.setCursor(0,1);
    lcd.print(" << WRONG >>");
    delay(200);

    lcd.clear();
    lcd.setCursor(1,0);
    lcd.print(" :Welcome:");
    lcd.setCursor(0,1);
    lcd.print("PLEASE ENTER PIN");
    }
    }
     
  10. tuz-vetal

    tuz-vetal Нуб

    Привет всем! помогите соединить два кода.
    Код (C++):
    //Тестировалось на Arduino IDE 1.0.1
    #define Trig 9
    #define Echo 8
    #define ledPin 13

    void setup()
    {
      pinMode(Trig, OUTPUT); //инициируем как выход
      pinMode(Echo, INPUT); //инициируем как вход
      pinMode(ledPin, OUTPUT);
      Serial.begin(9600);
      /* задаем скорость общения. В нашем случае с компьютером */
    }
    unsigned int impulseTime=0;
    unsigned int distance_sm=0;

    void loop()
    {
      digitalWrite(Trig, HIGH);
      /* Подаем импульс на вход trig дальномера */
      delayMicroseconds(10); // равный 10 микросекундам
      digitalWrite(Trig, LOW); // Отключаем
      impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса
      distance_sm=impulseTime/58; // Пересчитываем в сантиметры
      Serial.println(distance_sm); // Выводим на порт
      if (distance_sm<30) // Если расстояние менее 30 сантиметром
      {    
        digitalWrite(ledPin, HIGH); // Светодиод горит
      }
      else
      {  
        digitalWrite(ledPin, LOW); // иначе не горит
      }  
      delay(100);
      /* ждем 0.1 секунды, Следующий импульс может быть излучён, только после исчезновения эха от предыдущего.
       Это время называется периодом цикла (cycle period).
       Рекомендованный период между импульсами должен быть не менее 50 мс.  */

    }
    с этим

    Код (C++):
    //Тестировалось на Arduino IDE 1.0.1
    //Время калибровки датчика (10-60 сек. по даташиту)
    int calibrationTime = 30;    
    //Время, в которое был принят сигнал отсутствия движения(LOW)
    long unsigned int lowIn;      
    //Пауза, после которой движение считается оконченным
    long unsigned int pause = 5000;
    //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет
    boolean lockLow = true;
    //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения
    boolean takeLowTime;
    int pirPin = 2;    //вывод подключения PIR датчика
    int ledPin = 13;   //вывод сигнального диода

    void setup()
    {
      Serial.begin(9600);
      pinMode(pirPin, INPUT);
      pinMode(ledPin, OUTPUT);
      digitalWrite(pirPin, LOW);
      //дадим датчику время на калибровку
      Serial.print("Calibrating");
      for(int i = 0; i < calibrationTime; i++)
      {
        Serial.print(".");
        delay(1000);
      }
      Serial.println(" done");
      Serial.println("SENSOR ACTIVE");
      delay(50);
    }

    void loop()
    {
      //Если обнаружено движение
      if(digitalRead(pirPin) == HIGH)
      {
        //Если еще не вывели информацию об обнаружении
        if(lockLow)
        {
          lockLow = false;    
          Serial.println("Motion detected");
          delay(50);
        }      
        takeLowTime = true;
      }

      //Ели движения нет
      if(digitalRead(pirPin) == LOW)
      {    
        //Если время окончания движения еще не записано
        if(takeLowTime)
        {
          lowIn = millis();          //Сохраним время окончания движения
          takeLowTime = false;       //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения
        }
        //Если время без движение превышает паузу => движение окончено
        if(!lockLow && millis() - lowIn > pause)
        {
          //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения
          lockLow = true;              
          Serial.println("Motion finished");
          delay(50);
        }
      }
    }
     
  11. roni

    roni Нерд

    Привет всем! помогите соединить два кода.
    Код (C++):
    #include <Servo.h> // подключаем библиотеку Servo(без нее сервоприводы работать не будут)
    #include <IRremote.h> // подключаем библиотеку IRremote(без нее ИК-приемник рабоать не будет)

    int RECEIVE_PIN = 11; //  переменная, значение которой указывает на пин, в который мы подключили ИК-приемник(желтый провод)
    IRrecv irrecv(RECEIVE_PIN); // указываем, что в 11 пин подключен ИК-приемник
    decode_results results; //  переменная, в которую будут приходить коды, которые будут приходить на ИК-приемник

    Servo myservo; // переменная для первого сервопривода


    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    void setup() {
      irrecv.enableIRIn(); // "включаем" ИК-приемник
     
      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)
     
      myservo.write(10); // указываем первоначальный угол первый сервопривода
                     
    }

    void loop() {
      if(irrecv.decode(&results)) { // начинаем прием кодов с ИК-приемника
        if(results.value == 0xFDA857) { // если была нажата кнопка с кодом FDA857, то выполняем действия:
          if(o_c == 1) { // если забрало открыто(переменная o_c = 1), то...
            myservo.write(100); // ...меняем угол поворота первого сервопривода...
            delay(90);
            myservo.write(90);
             delay(90);        
             myservo.write(80);
             delay(90);
             myservo.write(70);
             delay(90);
             myservo.write(60);
             delay(90);                      
             myservo.write(50);
             delay(90);
             myservo.write(40);
             delay(90);                      
             myservo.write(30);
             delay(90);
             myservo.write(20);
             delay(90);
             myservo.write(10);
            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
             myservo.write(10); // меняем угол поворота первого сервопривода...
             delay(100);
             myservo.write(20);
             delay(100);
             myservo.write(30);
             delay(100);        
             myservo.write(40);
             delay(100);
             myservo.write(50);
             delay(100);
             myservo.write(60);
             delay(100);                      
             myservo.write(70);
             delay(100);
             myservo.write(80);
             delay(100);                      
             myservo.write(90);
             delay(100);
             myservo.write(100);
             delay(100);
             myservo.write(110);
            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
        irrecv.resume(); // продолжаем принимать коды с ИК-приемника
      }
    }
     
     
  12. roni

    roni Нерд

    с этим
    Код (C++):
    #include <IRremote.h> // это скачанная библиотека

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

    IRrecv irrecv(RECEIVE_PIN);

    decode_results results;

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

    unsigned long eventTime=0;

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

    int timer = 12;

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


    void setup(){

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

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


    pinMode(timer, OUTPUT);

    }

    void loop() {



    if (digitalRead(RECEIVE_PIN) == LOW)

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

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

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

    if(millis()-eventTime>100) digitalWrite(timer, LOW)

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

    ,digitalWrite(L13, LOW);



    if (irrecv.decode(&results)) {


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



    irrecv.resume();

    }

    }
     
  13. vvr

    vvr Инженерище

    а первый у вас работает ?
     
  14. Alex19

    Alex19 Гуру

    День добрый.
    Упустил эту ветку, было много работы.
    Не знаю актуальность для Xaoss и tuz-vetal прошло не мало времени.

    Так же всем рекомендую ознакомится с данной статьей - http://arduino.ru/tutorials/BlinkWithoutDelay. Большая половина бед у Вас из-за использования delay в loop.

    Второй момент у Вас, это Servo и IRremote, на каком таймере у Вас IRremote?
    Какая библиотека IRremote используется?
    Лучше ссылку на IRremote, их не мало или загрузите тут.

    Первый скетч, понятен. Второй, странный
    Код (C++):
    if(millis()-eventTime>100) digitalWrite(timer, LOW)

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

    ,digitalWrite(L13, LOW);
     
    И т.д., наверно loop выглядит так.
    Код (C++):
    void loop()
    {
      if (digitalRead(RECEIVE_PIN) == LOW)
      {
        // Если обнаружен отрицательный сигнал запускаем таймер,и включаем таймерПИН //(timer, HIGH);
        eventTime = millis();

        digitalWrite(timer, HIGH);
      }

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

      if (irrecv.decode(&results))
      {
        if (results.value == 0xFD807F && (digitalRead(timer) == HIGH))
        {
          digitalWrite(L13, HIGH);
        }
      }
      irrecv.resume();
    }
    UPD. Если первый скетч работает, то можно сделать так.

    Код (C++):
    #include <Servo.h> // подключаем библиотеку Servo(без нее сервоприводы работать не будут)
    #include <IRremote.h> // подключаем библиотеку IRremote(без нее ИК-приемник рабоать не будет)

    int RECEIVE_PIN = 11; //  переменная, значение которой указывает на пин, в который мы подключили ИК-приемник(желтый провод)
    IRrecv irrecv(RECEIVE_PIN); // указываем, что в 11 пин подключен ИК-приемник
    decode_results results; //  переменная, в которую будут приходить коды, которые будут приходить на ИК-приемник

    Servo myservo; // переменная для первого сервопривода

    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    unsigned long eventTime = 0;

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

    int timer = 12;

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

    byte delayServo = 0;
    byte servoValueBegin = 0;
    byte servoValueEnd = 0;
    byte stepCycle = 0;

    void setup() {
      irrecv.enableIRIn(); // "включаем" ИК-приемник

      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)

      myservo.write(10); // указываем первоначальный угол первый сервопривода

    }

    void loop() {
      if (irrecv.decode(&results)) { // начинаем прием кодов с ИК-приемника
        if (results.value == 0xFDA857) { // если была нажата кнопка с кодом FDA857, то выполняем действия:
          if (o_c == 1)
          { // если забрало открыто(переменная o_c = 1), то...
            stepCycle = 1;
            delayServo = 90;
            servoValueBegin = 100;
            servoValueEnd = 10;
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
            stepCycle = 2;
            delayServo = 100;
            servoValueBegin = 10;
            servoValueEnd = 110;
          }
        }

        if (results.value == 0xFD807F && (digitalRead(timer) == HIGH))
        {
          digitalWrite(L13, HIGH);
        }
      }

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

        digitalWrite(timer, HIGH);
      }

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

      if (!stepCycle)
      {
        ServoWrite(stepCycle, delayServo, &servoValueBegin, &servoValueEnd);
      }
      else
      {
        irrecv.resume(); // продолжаем принимать коды с ИК-приемника
      }
    }

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd)
    {
      static unsigned long previousMillisServo = 0;
      unsigned long currentMillisServo = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if (currentMillisServo - previousMillisServo > delayServo)
      {
        // сохраняем время последнего переключения
        previousMillisServo = currentMillisServo;

        if (stepServo == 1)
        {
          myservo.write(*servoBegin);

          *servoBegin -= 10;
          if (*servoBegin < servoEnd)
          {
            stepCycle = 0;

            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          }
        }
        else if (stepServo == 2)
        {
          myservo.write(*servoBegin);

          *servoBegin += 10;
          if (*servoBegin > servoEnd)
          {
            stepCycle = 0;

            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
      }
    }
     
    Проверьте, сейчас не дома, поэтому Ардуины под рукой нет.
     
    Последнее редактирование: 9 дек 2016
  15. roni

    roni Нерд

    да первыи работает контролирую серво с пульта
     
  16. roni

    roni Нерд





    дает оибка компиляцыи
     
  17. roni

    roni Нерд


    да работает
     
  18. Alex19

    Alex19 Гуру

    Странно, у меня компилируется, может вставил не корректно, повторю. Так же читал, что новые версии Arduino IDE требуют объявление функций до их использования. Поэтому изменил код.
    Код (C++):

    #include <Servo.h> // подключаем библиотеку Servo(без нее сервоприводы работать не будут)
    #include <IRremote.h> // подключаем библиотеку IRremote(без нее ИК-приемник рабоать не будет)

    int RECEIVE_PIN = 11; //  переменная, значение которой указывает на пин, в который мы подключили ИК-приемник(желтый провод)
    IRrecv irrecv(RECEIVE_PIN); // указываем, что в 11 пин подключен ИК-приемник
    decode_results results; //  переменная, в которую будут приходить коды, которые будут приходить на ИК-приемник

    Servo myservo; // переменная для первого сервопривода

    int o_c = 1; // переменная, в которой будет храниться "статус" забрала(открыто или закрыто)

    unsigned long eventTime = 0;

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

    int timer = 12;

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

    byte delayServo = 0;
    byte servoValueBegin = 0;
    byte servoValueEnd = 0;
    byte stepCycle = 0;

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd);

    void ServoWrite(byte stepServo, byte delayServo, byte* servoBegin, byte servoEnd)
    {
      static unsigned long previousMillisServo = 0;
      unsigned long currentMillisServo = millis();

      //проверяем не прошел ли нужный интервал, если прошел то
      if (currentMillisServo - previousMillisServo > delayServo)
      {
        // сохраняем время последнего переключения
        previousMillisServo = currentMillisServo;

        if (stepServo == 1)
        {
          myservo.write(*servoBegin);

          *servoBegin -= 10;
          if (*servoBegin < servoEnd)
          {
            stepCycle = 0;

            o_c = 0; // меняем "статуст" забрала, то есть меняем значение на o_c на 0
          }
        }
        else if (stepServo == 2)
        {
          myservo.write(*servoBegin);

          *servoBegin += 10;
          if (*servoBegin > servoEnd)
          {
            stepCycle = 0;

            o_c = 1; // меняем "статуст" забрала, то есть меняем значение на o_c на 1
          }
        }
      }
    }

    void setup() {
      irrecv.enableIRIn(); // "включаем" ИК-приемник

      myservo.attach(4); // указываем в какой пин подключен первый сервопривод(желтый провод)

      myservo.write(10); // указываем первоначальный угол первый сервопривода

    }

    void loop() {
      if (irrecv.decode(&results)) { // начинаем прием кодов с ИК-приемника
        if (results.value == 0xFDA857) { // если была нажата кнопка с кодом FDA857, то выполняем действия:
          if (o_c == 1)
          { // если забрало открыто(переменная o_c = 1), то...
            stepCycle = 1;
            delayServo = 90;
            servoValueBegin = 100;
            servoValueEnd = 10;
          } else { // иначе если переменная o_c не равна 1(то есть равна 0), то выполняем действия:
            stepCycle = 2;
            delayServo = 100;
            servoValueBegin = 10;
            servoValueEnd = 110;
          }
        }

        if (results.value == 0xFD807F && (digitalRead(timer) == HIGH))
        {
          digitalWrite(L13, HIGH);
        }
      }

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

        digitalWrite(timer, HIGH);
      }

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

      if (!stepCycle)
      {
        ServoWrite(stepCycle, delayServo, &servoValueBegin, servoValueEnd);
      }
      else
      {
        irrecv.resume(); // продолжаем принимать коды с ИК-приемника
      }
    }

     
    Если будет ошибка, пишите какая именно.

    UPD. Обновил скрипт, заберите.
     
    Последнее редактирование: 9 дек 2016
    tuz-vetal нравится это.
  19. roni

    roni Нерд


    sketch_forum.amperka.ino: In function 'void loop()':

    sketch_forum.amperka.ino:74:71: error: invalid conversion from 'byte* {aka unsigned char*}' to 'byte {aka unsigned char}' [-fpermissive]

    sketch_forum.amperka.ino:7:6: error: initializing argument 4 of 'void ServoWrite(byte, byte, byte*, byte)' [-fpermissive]



    Ошибка компиляции.
     
  20. Alex19

    Alex19 Гуру

    Ошибся, замените - ServoWrite(stepCycle, delayServo, &servoValueBegin, &servoValueEnd); на ServoWrite(stepCycle, delayServo, &servoValueBegin, servoValueEnd);