отключение сервомашинок

Тема в разделе "Arduino & Shields", создана пользователем РоманИ, 8 фев 2016.

  1. РоманИ

    РоманИ Нерд

    Здравствуйте уважаемые форумчане! прошу Вашей помощи. Суть проекта такова:
    Контроллер сравнения температуры по трем датчикам DS 18b20 и управление двумя клапанами на сервомашинках. сделал примитивный скетч. всё работает, но сервушки подрагивают в какой-то момент цикла, либо по началу цикла, либо по окончании. Мелочь, а неприятно. учитывая, что они должны быть на "боевом дежурстве" круглосуточно минимум 5 месяцев в году, полагаю, что это приведет к преждевременному износу управляющего резистора.
    Логика скетча следующая: температура меньше 18 С клапана закрыты. больше- сравнивается температура А и В соответственно клапана - один закрыт другой открыт. выборка по температуре будет 1 раз в 5 минут. Виделось применить функцию servo.detach(), но не могу справится с ней .
    Буду признателен за совет.
    С уважением Роман.
    Код (C++):
    #include <OneWire.h>
    #include <DallasTemperature.h>
    #include <LiquidCrystal.h>
    #include <Servo.h>

    Servo myservo;
    Servo myservo2;
    OneWire oneWire(10); // вход датчиков 18b20
    DallasTemperature ds(&oneWire);
    LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

    DeviceAddress sensor1 = {0x28, 0xFF, 0xC, 0xB, 0x93, 0x15, 0x1, 0x7C};
    DeviceAddress sensor2 = {0x28, 0xFF, 0xE3, 0x1B, 0x93, 0x15, 0x1, 0xF1};
    DeviceAddress sensor3 = {0x28, 0xFF, 0xD8, 0x39, 0x93, 0x15, 0x1, 0x72};
    DeviceAddress sensor4 = {0x28, 0xFF, 0xEE, 0x41, 0x93, 0x15, 0x1, 0xDE};

    void setup() {
    //Serial.begin(9600);
      ds.begin();
      lcd.begin(16, 2);
      lcd.clear();
      myservo.attach(9);
      myservo2.attach(8);
      pinMode (11,OUTPUT);
      pinMode (12,OUTPUT);
      pinMode (1,OUTPUT);
      pinMode (0,OUTPUT);
      }

    void loop() {
     
      ds.requestTemperatures(); // считываем температуру с датчиков
        lcd.setCursor(0, 0);
        lcd.print("T sun kol:");
        lcd.print(ds.getTempC(sensor1)); // отправляем температуру
        lcd.print("C");
        lcd.setCursor(0, 1);
        lcd.print("T air    :");
        lcd.print(ds.getTempC(sensor4));
        lcd.print("C");
         
    delay (3000);
      lcd.setCursor(0, 0);
        lcd.print("T home   :");
        lcd.print(ds.getTempC(sensor3));
        lcd.print("C");
        lcd.setCursor(0, 1);
        lcd.print("Tveranda :");
        lcd.print(ds.getTempC(sensor2));
        lcd.print("C");
      delay (3000);

    int temps1 = ds.getTempC(sensor1);
    int temps2 = ds.getTempC(sensor2);
    int temps3 = ds.getTempC(sensor3);
    if ( temps1 >18)
    {
    if (temps2>temps3)
    {
      myservo.write(112);
      myservo2.write(85);//
      digitalWrite (11,HIGH);// горит зеленый веранды
      digitalWrite (12,LOW);
      digitalWrite (1,HIGH);// горит красный комнаты
      digitalWrite (0,LOW);
      }
    else
    {
      myservo.write(30);
      myservo2.write(175);
      //Serial.print("Home gate");// забор воздуха с комнаты
      digitalWrite (11,LOW);
      digitalWrite (12,HIGH);// горит красный веранды
      digitalWrite (0,HIGH);// горит зеленый комнаты
      digitalWrite (1,LOW);
    }
    }
    else
    {
        myservo.write(115);
        myservo2.write(175);
      digitalWrite (11,LOW);
      digitalWrite (12,HIGH);
      digitalWrite (0,LOW);
      digitalWrite (1,HIGH);
    }
    }
     
  2. vvr

    vvr Инженерище

    перед движением сервы атач, задержка 1-2 сек и детач
     
  3. РоманИ

    РоманИ Нерд

    пробую. ругается. что-то неправильно пишу в скетче наверно
    Код (C++):
    if (temps3>temps2)
    {
      myservo.attach(9);
      myservo2.attach(8);
      myservo.write(30);
      myservo2.write(175);
       delay (1000);
      myservo.detach(9);
      myservo2.detach(8);
      //Serial.print("Home gate");// забор воздуха с комнаты
      digitalWrite (11,LOW);
      digitalWrite (12,HIGH);// горит красный веранды
      digitalWrite (0,HIGH);// горит зеленый комнаты
      digitalWrite (1,LOW);
    }
    }
    else
    {
        myservo.attach(9);
      myservo2.attach(8);
        myservo.write(115);
        myservo2.write(175);
         delay (1000);
        myservo.detach(9);
      myservo2.detach(8);
      //Serial.print("the gate is close");
      digitalWrite (11,LOW);
      digitalWrite (12,HIGH);
      digitalWrite (0,LOW);
      digitalWrite (1,HIGH);
    }
    }
    пишет no matching function for call to ' servo:: detach (int)'
     
  4. vvr

    vvr Инженерище

    ну если с ошибками писать то и будет ругаться

    myservo.detach();
    myservo2.detach();
     
  5. РоманИ

    РоманИ Нерд

    спасибо заработало.
    странно, когда подключаешь нужно писать номер контакта, а когда отключаешь-нет. сам бы не вжисть не до пер бы. еще раз спасибо.
     
  6. vvr

    vvr Инженерище

    да надо просто открыть библиотеку серво и почитать:)
     
  7. РоманИ

    РоманИ Нерд

    Если можно тогда еще один вопрос? как её открыть и где почитать? я правда ещё до этого не дообразовывался.
     
  8. vvr

    vvr Инженерище

    открываете на компе ардуино иде-libraries-Servo-Servo файл CPP
    НО МОЖНО И НЕ ПАРИТЬСЯ:)