Не доходит до меня)))
- Войдите на сайт для отправки комментариев
Ср, 12/10/2016 - 16:02
Всем привет. Не получается дописать код скетча. Если у кого сть возможность помогите.
не получается настроить включение светодиодов и реле в зависимости от результата Ur. 0.225 > Ur > -0.225. Замер при каждом нажатии. Если в рамках допуска то один светодиод
и for (int i = 0; i< 20000; i++){ digitalWrite(poliv, LOW); // реле включено delay(1400); digitalWrite(poliv, HIGH); // реле выключено delay(1000);
, если за рамками допуска то красный светодиод и
digitalWrite(poliv, LOW)
Помогите пожалуйста.
#include <MsTimer2.h> #define MEASURE_PERIOD 500 // время периода измерения #define R1 15.06 // сопротивление резистора R1 #define R2 4.72 // сопротивление резистора R2 int rele1 = 3; int timeCount; // счетчик времени float U, Ur; // измеренные напряжения void setup() { pinMode(rele1, OUTPUT); Serial.begin(9600); // инициализируем порт, скорость 9600 MsTimer2::set(1, timerInterupt); // прерывания по таймеру, период 1 мс MsTimer2::start(); // разрешение прерывания } void loop() { digitalWrite(rele1, LOW); // реле включено delay(1200); digitalWrite(rele1, HIGH); // реле выключено delay(1000); // период 500 мс if ( timeCount >= MEASURE_PERIOD ) { timeCount= 0; // чтение кода канала 1 и пересчет в напряжение U= ((float)analogRead(A0)) * 5. / 1023. / R2 * (R1 + R2); // чтение кода канала 2 и пересчет в напряжение Ur= (((float)analogRead(A0)) * 5. / 1023. / R2 * (R1 + R2))-12.14; // передача данных через последовательный порт Serial.print(" "); Serial.println(Ur, 3); Serial.print(" U = "); Serial.println(U, 3); } } // обработка прерывания 1 мс void timerInterupt() { timeCount++; }
Для начала проверьте формулу в строке 29, У Вас Ur всегда будет вне пределов условия. Каналы Вы проверяете с одного пина?
UPD: Зачем Вам TimerInterrupt? Библиотека сама отсчитывает заданный интервал.
В целом Вы много наворотили в коде. Составьте алгоритм работы своего устройства и, отталкиваясь от него, напишите программу.
Управление реле1:
вкл на 1,4 сек. затем выкл на 1 сек. и так циклически 20000 раз.
паралельно идет замер напряжения при каждом вкл реле
считается разница между входным эталонным) и напряжением под нагрузкой.
если разница > -0.225 и < 0,225 то моргает светидиод1 и продолжается цикл вкл и выкл реле
если разница за границей допуска то загорается светодиод2 и реле вкл до обнуления или отключения питания
Для начала проверьте формулу в строке 29, У Вас Ur всегда будет вне пределов условия. Каналы Вы проверяете с одного пина?
UPD: Зачем Вам TimerInterrupt? Библиотека сама отсчитывает заданный интервал.
на com port отображается напряжение и разница напряжений, но вот светодиоды не могу заставить гореть и реле блокировать.
Для начала проверьте формулу в строке 29, У Вас Ur всегда будет вне пределов условия. Каналы Вы проверяете с одного пина?
UPD: Зачем Вам TimerInterrupt? Библиотека сама отсчитывает заданный интервал.
на com port отображается напряжение и разница напряжений, но вот светодиоды не могу заставить гореть и реле блокировать.
Так у Вас и нет светодиодов, вы их просто напросто не задали в программе
Ur= (((
float
)analogRead(A0)) * 5. / 1023. / R2 * (R1 + R2))-12.14;
12,14 - эталонное напряжение?
Как вариант, можно упаковать в функцию такой код:
Замер напряжения производится в середине работы реле.
led1, led2 светодиоды работы и ошибки соответственно
Да эталон
Спасибо большое. Завтра буду пробывать
Что то не получается полностью в функию вставить. Помогите пожалуйста.
У Вас в 35-36 строках ошибка: скобка должна быть перед выводом в сериал. 20-23 нужно ввести в цикл измерений, иначе реле включится и выключится без измерения. В цикле нет отключения реле, т.е. замер будет производится при постоянно включенном реле. В данном скетче библиотека MsTimer ненужна от слова совсем, так же не требуется переменная MEASURE_PERIOD, она нигде не используется.
Для объявления функции создайте void с именем функции (подробнее тут), в которой вложите описанный выше цикл. Из loop его нужно удалить. Для того, чтобы при выходе из заданного интервала Ur, loop не крутил все по новой советую ввести переменную-флаг, по условию запускающую функцию с замером.
Немного позднее накидаю свой скетч, сравним с тем, что получится у Вас.
Примерно вот такое получилось у меня. В принципе, можно было обойтись и без функции, просто с ней нагляднее и проще редактировать программу.
то за ошибка?
Смените выводы светодиодов, как то пропустил момент, что сериал сидит на 0-1 выводах
например на
моргает светодиод и моргает реле но не работает.
моргает светодиод и зеленая лампа включения реле моргает но не работает.
Что именно не работает? Как проявляется? Что показывает сериал?
Сериал ничего вообще не показывает. моргает раз в секунду светодиод и моргает реле но не работает
В скетче выше есть ошибка - не проведена инициализация сериала. Какое у Вас реле?
Обычное ардуиновское реле
https://ru.aliexpress.com/item/Free-shipping-5V-low-level-trigger-One-1-...
Попробуйте так
Проверка будет проходить до выключения питания или появления ошибки замера. Если Вам нужно только определенное количество замеров, то добавьте в функции после последнего делея error=1
Теперь моргает и реле работает, но на com пишет значение больше 0.225 но реле далее работает не блокируется.
Перезалил код выше, пробуйте. В 40 строке изменил условие
Теперь происходит замер , если в допуске моргает LED1 а LED2 постоянно горит. когда замер заходит за допуск LED2 гаснет, реле вкл(правильно) а LED1 загорается.
Странно, в отладчике у меня все хорошо срабатывает.
А замер происходит в момент включения реле?
Замер идет через 700 мс после включения реле. Вы можете у себя выставить любое время.
Это я понял. Большое Вам спасибо за помощь. А больше проекты вы разрабатывате, я имею ввиду за деньги?
Я больше для себя делаю, хобби такое.
я для себя хочу спроектировать автоматизацию теплицы на гидропонике. Поможешь?