Управление вентиляторами радиатора

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Dash, 10 июл 2018.

  1. Dash

    Dash Нерд

    Ув. Форумчане. Возник вопрос в скетче. Подскажите плз что тут не так.

    float current_temp;
    int FAN = 5; // PIN
    int FAN_pwm; // PWM 0..255
    int CON = A1; // Signal conditioning
    int REL = 2; // Doube Fan

    void setup(void) {
    TCCR0B = TCCR0B & B11111000 | B00000001;
    pinMode(FAN, OUTPUT);
    pinMode(2, OUTPUT);
    pinMode(A1, INPUT);
    Serial.begin(9600);
    }

    void loop(void) {
    current_temp = get_temp();
    if(current_temp > 95) FAN_pwm = 0, (REL, HIGH);
    else if(current_temp > 90) FAN_pwm = 50;
    else if(current_temp > 85) FAN_pwm = 75;
    else if(current_temp > 80) FAN_pwm = 100;
    else if(current_temp > 75) FAN_pwm = 125;
    else if(current_temp > 70) FAN_pwm = 150;
    else if(current_temp > 65) FAN_pwm = 175;
    else if(current_temp > 60) FAN_pwm = 200;
    else if(CON, HIGH) (REL, HIGH);
    else if(CON, LOW) (REL, LOW);

    else FAN_pwm = 255;
    analogWrite(FAN, FAN_pwm);
    delay(5000);

    В этом куске скетча пытаюсь реализовать включение реле при температуре свыше 95 градусов, а так же принудительное включение этого же реле при запуске кондиционера (независимо от температуры двигателя). Среда разработки ардуино не видит тут каких либо ошибок, но чует мое сердце что тут чтото не так как мне хотелось бы....
     
  2. vvr

    vvr Инженерище

    нафига вам задержка 5 сек???????
    загрузили код, собрали макет и проверили.
    сразу будет понятно так или не так)))))
    ну и код нужно правильно вставлять по правилам форума и целиком.
     
  3. Mitrandir

    Mitrandir Гуру

    Это что за конструкция?
    else if(CON, LOW) (REL, LOW);
     
  4. Tomasina

    Tomasina Иномирянин

    Если переменная типа float, то и сравнивать ее надо с типом float:
    Код (C++):
    current_temp > 95.0
     
  5. Dash

    Dash Нерд

    Изначально код таков, вот сижу и не знаю как включить реле при более 95 градусов, и при включенном кондиционере
    Код (C++):
    OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
    float current_temp;
    int FAN = 5;        // PIN
    int FAN_pwm;        // PWM 0..255
    int CON = A1;       // Signal conditioning
    int REL = 2;        // Doube Fan

    void setup(void) {
      TCCR0B = TCCR0B & B11111000 | B00000001;
      pinMode(FAN, OUTPUT);
      pinMode(2, OUTPUT);
      pinMode(A1, INPUT);
      Serial.begin(9600);
    }

    void loop(void) {
      current_temp = get_temp();
      if(current_temp > 95) FAN_pwm = 0;
      else if(current_temp > 90) FAN_pwm = 50;
      else if(current_temp > 85) FAN_pwm = 75;
      else if(current_temp > 80) FAN_pwm = 100;
      else if(current_temp > 75) FAN_pwm = 125;
      else if(current_temp > 70) FAN_pwm = 150;
      else if(current_temp > 65) FAN_pwm = 175;
      else if(current_temp > 60) FAN_pwm = 200;
      else FAN_pwm = 255;
      analogWrite(FAN, FAN_pwm);
      delay(5000);
    }


    float get_temp() {
      byte i;
      byte present = 0;
      byte type_s;
      byte data[12];
      byte addr[8];
      float celsius, fahrenheit;
     
      if ( !ds.search(addr)) {
        Serial.println("No more addresses.");
        Serial.println();
        //ds.reset_search();
        //delay(250);
        //return;
      }
     
      Serial.print("ROM =");
      for( i = 0; i < 8; i++) {
        Serial.write(' ');
        Serial.print(addr[i], HEX);
      }

      if (OneWire::crc8(addr, 7) != addr[7]) {
          Serial.println("CRC is not valid!");
          //return;
      }
      Serial.println();
      // the first ROM byte indicates which chip
      switch (addr[0]) {
        case 0x10:
          Serial.println("  Chip = DS18S20");  // or old DS1820
          type_s = 1;
          break;
        case 0x28:
          Serial.println("  Chip = DS18B20");
          type_s = 0;
          break;
        case 0x22:
          Serial.println("  Chip = DS1822");
          type_s = 0;
          break;
        default:
          Serial.println("Device is not a DS18x20 family device.");
          //return;
      }

      ds.reset();
      ds.select(addr);
      ds.write(0x44, 1);        // start conversion, with parasite power on at the end
     
      delay(1000);     // maybe 750ms is enough, maybe not
      // we might do a ds.depower() here, but the reset will take care of it.
     
      present = ds.reset();
      ds.select(addr);  
      ds.write(0xBE);         // Read Scratchpad

      Serial.print("  Data = ");
      Serial.print(present, HEX);
      Serial.print(" ");
      for ( i = 0; i < 9; i++) {           // we need 9 bytes
        data[i] = ds.read();
        Serial.print(data[i], HEX);
        Serial.print(" ");
      }
      Serial.print(" CRC=");
      Serial.print(OneWire::crc8(data, 8), HEX);
      Serial.println();

      // Convert the data to actual temperature
      // because the result is a 16 bit signed integer, it should
      // be stored to an "int16_t" type, which is always 16 bits
      // even when compiled on a 32 bit processor.
      int16_t raw = (data[1] << 8) | data[0];
      if (type_s) {
        raw = raw << 3; // 9 bit resolution default
        if (data[7] == 0x10) {
          // "count remain" gives full 12 bit resolution
          raw = (raw & 0xFFF0) + 12 - data[6];
        }
      } else {
        byte cfg = (data[4] & 0x60);
        // at lower res, the low bits are undefined, so let's zero them
        if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
        else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
        else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
        //// default is 12 bit resolution, 750 ms conversion time
      }
      celsius = (float)raw / 16.0;
      fahrenheit = celsius * 1.8 + 32.0;
      Serial.print("  Temperature = ");
      Serial.print(celsius);
      Serial.print(" Celsius, ");
      Serial.print(fahrenheit);
      Serial.println(" Fahrenheit");
     
      return celsius;
    }
     
  6. Dash

    Dash Нерд

    Изначально скетч в этом виде работает и обороты вентилятора регулируются нормально. Но есть второй вентилятор который включается в параллельную работу при перегреве или при включении кондиционера, вот я и забуксовал.....
     
  7. Tomasina

    Tomasina Иномирянин

    Он в изначальном виде будет работать, просто дискретность строго 1 градус, а в моем варианте 0,1 градус.
     
  8. b707

    b707 Гуру

    В скетче из первого сообщения кто три строчки подчеркнул? - подчеркнуто со смыслом, строчки неверные, работать не будут.
     
  9. Mitrandir

    Mitrandir Гуру

    Ну синтаксически они верные, но бессмысленны
     
  10. Dash

    Dash Нерд

    Вот в том и дело( не могу понять как правильно вставить команду чтобы заработало(
     
  11. Dash

    Dash Нерд

    Я и подчеркнул, чтобы было видно где я забуксовал... Помогите люди добрые правильно оформить скетч пожалуста..
     
  12. Пушной звер

    Пушной звер Оракул

    Dash нравится это.
  13. Dash

    Dash Нерд

    Большущее спасибо, завтра буду пробовать. REL - вывод 2 с дуинки, в начале скетча у меня ошибка, забыл заменить:

    float current_temp;
    int FAN =5; // PIN
    int FAN_pwm; // PWM 0..255
    int CON = A1; // Signal conditioning
    int REL =2; // Doube Fan

    void setup(void){
    TCCR0B = TCCR0B & B11111000 | B00000001;
    pinMode(FAN, OUTPUT);
    pinMode(2, OUTPUT); <- должно быть pinMode(REL, OUTPUT);
    pinMode(A1, INPUT); <- pinMode(CON, INPUT);
    Serial.begin(9600);
     
  14. Dash

    Dash Нерд

    В случае контроля по каналу кондиционера возможно указать в скетче данную команду таким образом?

    if(current_temp > 95)ll(digitalRead(CON, HIGH)){
    FAN_pwm = 0;
    digitalWrite(REL, HIGH);
    }
    else if(current_temp > 90) FAN_pwm = 50;
     
  15. Mitrandir

    Mitrandir Гуру

    Со скобками косяк и пожалуйста, форматируйте код, сложно читать. На тулбаре есть кнопка для вставки листинга
     
  16. Mitrandir

    Mitrandir Гуру

    Код (C++):
    if (current_temp > 95  || digitalRead(CON)==HIGH) {
    //....
    }
     
    Dash нравится это.
  17. Dash

    Dash Нерд

    Спасибо. Очень выручили.