2014-09-23 2 views
2

Я хотел бы выполнить функцию в течение X секунд каждые Y секунд на Arduino.Выполнять функцию в течение x секунд каждые y секунд на Arduino

Я пытаюсь контролировать сопротивление нагреванию воды с постоянной скоростью (1о Цельсия в минуту), так что я думал: я буду измерять, какая скорость, когда она работает в течение всей минуты, то я настрою его на желаемую скорость.

Предположим, что он нагревается до 5o Цельсия в минуту, поэтому я хотел бы активировать сопротивление в течение 60/5 секунд, но не сразу, я думал об активации сопротивления в течение 1 секунды каждые 12 секунд, чтобы сохранить (если день слишком холодный, слишком горячий, если я меняю свое оборудование и т. д.)

Вы, ребята, думаете, что это возможно? Если нет, любые идеи, как я могу заставить его работать? Я видел библиотеку Timer.h, но, похоже, она не решает мою проблему. =/

Заранее благодарим за внимание, пожалуйста, дайте мне знать, если какая-либо информация может быть полезна!

ответ

3

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

const int onTime=1000; // in ms 
const int offTime=12000; // in ms 
const int resistorPin=7; // Change as necessary 
boolean currentlyOn=false; 
unsigned long startTime; 

void setup(){ 
    pinMode(resistorPin,OUTPUT); 
    digitalWrite(resistorPin,LOW); 
    startTime=millis(); // Initialize 
} 

void loop(){ 
    if (currentlyOn && millis()>startTime+onTime){ // Switch resistor off 
    digitalWrite(resistorPin,LOW); 
    currentlyOn=false; 
    startTime=millis(); // Reset timer 
    } 
    if (!currentlyOn && millis()>startTime+offTime){ // Switch resistor on 
    digitalWrite(resistorPin,HIGH); 
    currentlyOn=true; 
    startTime=millis(); // Reset timer 
    } 
    delay(10); 
} 

Я понятия не имею, если это будет работать, насколько контролируя температуру, так как я ожидал бы там значительные нелинейность, участвующие в этом, но, по крайней мере, резистор будет делать то, что вы хотите. Если вы действительно хотите контролировать температуру, я бы предложил цикл обратной связи, в котором вы измеряете температуру и соответствующим образом настраиваете (возможно, с помощью ПИД-регулятора?). Но это, конечно, намного сложнее.

EDIT: Несколько дополнительных мыслей: Причина, по которой я предположил, что подход на основе millis() заключается в том, что он позволяет вам выполнять другой код во время ожидания, делая его более универсальным. Но если вам не нужно, вы всегда можете просто пойти супер-простой и задержки использование():

void loop(){ 
    digitalWrite(resistorPin,HIGH); 
    delay(onTime); 
    digitalWrite(resistorPin,LOW); 
    delay(offTime); 
} 

Наконец, вы также можете просто подключить резистор до PWM штифтом и использовать analogWrite() вместо , поддерживая постоянное включение резистора на низком уровне.

+0

+1 для нелинейностей и предложения PID. :) – ladislas

+0

Вау, это действительно хороший ответ! Возможно, вы могли бы, кроме того, показать мне какой-нибудь материал, где я могу легко понять предмет ПИД-регулятора? Сохраняя ваше предложение: мой резистор, если до 5000 Вт, как вы думаете, я могу контролировать его с помощью функции analogWrite()? Заранее благодарим! – marcelhb

+0

Пожалуйста, см. Мой ответ ниже (слишком большой, чтобы соответствовать комментарию). Также, пожалуйста, проголосуйте за мой ответ, если это было полезно для вас, чтобы я мог создать репутацию. Благодаря! –

1

Там хорошая PID библиотека Arduino доступна здесь, с обширной документацией: http://playground.arduino.cc/Code/PIDLibrary

Эта страница также делает приличную работу, объясняя теорию позади него, но если это не совсем щелчок, я подозреваю, что Вики может обратиться фоновые вещи лучше, чем я могу: http://en.wikipedia.org/wiki/PID_controller

Однако все это может быть спорным, учитывая резистор, о котором идет речь. Учитывая, что максимальный выход пика Arduino составляет 5 В, вы должны смотреть на вывод 1000 А. Но эти же выводы имеют приблизительный максимальный ток около 40 мА. Поэтому, если вы действительно хотите надавить на это 5000 W margin, вам нужно будет разделить источники питания для Arduino и резистора, что, вероятно, означает использование реле для питания резистора. Но так как реле является сделкой on-off, вы больше не сможете использовать analogWrite(). PID все еще может работать, однако - см. Этот пример из той же библиотеки: http://playground.arduino.cc/Code/PIDLibraryRelayOutputExample. Я никогда лично не пробовал работать с такими реле, поэтому я не могу говорить о возможности этого подхода.

Дайте мне знать, если вы хотите больше помочь с проблемами с электропитанием.

Смежные вопросы