Не доходит до меня)))

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Всем привет. Не получается дописать код скетча. Если у кого сть возможность помогите.

не получается настроить включение светодиодов и реле в зависимости от результата 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++;
}

 

 

 

 

 

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Для начала проверьте формулу в строке 29, У Вас Ur всегда будет вне пределов условия. Каналы Вы проверяете с одного пина?

UPD: Зачем Вам TimerInterrupt? Библиотека сама отсчитывает заданный интервал.

toxikaciya
Offline
Зарегистрирован: 11.04.2016

В целом Вы много наворотили в коде. Составьте алгоритм работы своего устройства и, отталкиваясь от него, напишите программу.

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Управление реле1:

вкл на 1,4 сек. затем выкл на 1 сек. и так циклически 20000 раз.

паралельно идет замер напряжения при каждом вкл реле

считается разница между входным эталонным) и напряжением под нагрузкой.

если разница > -0.225 и < 0,225 то моргает светидиод1 и продолжается цикл вкл и выкл реле

если разница за границей допуска то загорается светодиод2 и реле вкл до обнуления или отключения питания

Геннадий116
Offline
Зарегистрирован: 12.10.2016

toxikaciya пишет:

Для начала проверьте формулу в строке 29, У Вас Ur всегда будет вне пределов условия. Каналы Вы проверяете с одного пина?

UPD: Зачем Вам TimerInterrupt? Библиотека сама отсчитывает заданный интервал.

на com port отображается напряжение и разница напряжений, но вот светодиоды не могу заставить гореть и реле блокировать.

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Геннадий116 пишет:

toxikaciya пишет:

Для начала проверьте формулу в строке 29, У Вас Ur всегда будет вне пределов условия. Каналы Вы проверяете с одного пина?

UPD: Зачем Вам TimerInterrupt? Библиотека сама отсчитывает заданный интервал.

на com port отображается напряжение и разница напряжений, но вот светодиоды не могу заставить гореть и реле блокировать.

Так у Вас и нет светодиодов, вы их просто напросто не задали в программе

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Ur= (((float)analogRead(A0)) * 5. / 1023. / R2 * (R1 + R2))-12.14;

12,14 - эталонное напряжение?

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Как вариант, можно упаковать в функцию такой код:

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 светодиоды работы и ошибки соответственно

 

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Да эталон

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Спасибо большое. Завтра буду пробывать

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Что то не получается полностью в функию вставить. Помогите пожалуйста.

#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);
}}

 

toxikaciya
Offline
Зарегистрирован: 11.04.2016

У Вас в 35-36 строках ошибка: скобка должна быть перед выводом в сериал. 20-23 нужно ввести в цикл измерений, иначе реле включится и выключится без измерения. В цикле нет отключения реле, т.е. замер будет производится при постоянно включенном реле. В данном скетче библиотека MsTimer ненужна от слова совсем, так  же не требуется переменная MEASURE_PERIOD, она нигде не используется.

Для объявления функции создайте void с именем функции (подробнее тут), в которой вложите описанный выше цикл. Из loop его нужно удалить. Для того, чтобы при выходе из заданного интервала Ur, loop не крутил все по новой советую ввести переменную-флаг, по условию запускающую функцию с замером.

Немного позднее накидаю свой скетч, сравним с тем, что получится у Вас.

toxikaciya
Offline
Зарегистрирован: 11.04.2016

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

#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);
  }
}

 

Геннадий116
Offline
Зарегистрирован: 12.10.2016

то за ошибка?

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Смените выводы светодиодов, как то пропустил момент, что сериал сидит на 0-1 выводах

int led1 = 1;
int led2 = 2;

например на

int led1 = 5;
int led2 = 6;

 

Геннадий116
Offline
Зарегистрирован: 12.10.2016

моргает светодиод и моргает реле но не работает.

Геннадий116
Offline
Зарегистрирован: 12.10.2016

моргает светодиод и зеленая лампа включения реле моргает но не работает.

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Что именно не работает? Как проявляется? Что показывает сериал?

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Сериал ничего вообще не показывает. моргает раз в секунду светодиод и моргает реле но не работает

 

toxikaciya
Offline
Зарегистрирован: 11.04.2016

В скетче выше есть ошибка - не проведена инициализация сериала. Какое у Вас реле?

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Обычное ардуиновское реле

https://ru.aliexpress.com/item/Free-shipping-5V-low-level-trigger-One-1-...

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Попробуйте так

#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

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Теперь моргает и реле работает, но на com пишет значение больше 0.225 но реле далее работает не блокируется.

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Перезалил код выше, пробуйте. В 40 строке изменил условие

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Теперь происходит замер , если в допуске моргает LED1 а LED2 постоянно горит. когда замер заходит за допуск LED2 гаснет, реле вкл(правильно) а LED1 загорается.

toxikaciya
Offline
Зарегистрирован: 11.04.2016
#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);
  }
}

Странно, в отладчике у меня все хорошо срабатывает.

Геннадий116
Offline
Зарегистрирован: 12.10.2016

А замер происходит в момент включения реле?

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Замер идет через 700 мс после включения реле. Вы можете у себя выставить любое время.

Геннадий116
Offline
Зарегистрирован: 12.10.2016

Это я понял. Большое Вам спасибо за помощь. А больше проекты вы разрабатывате, я имею ввиду за деньги?

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Я больше для себя делаю, хобби такое.

Геннадий116
Offline
Зарегистрирован: 12.10.2016

я для себя хочу спроектировать автоматизацию теплицы на гидропонике. Поможешь?