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