Параллельное управление тремя реле с помощью трех потенциометров

sknyazev
Offline
Зарегистрирован: 25.11.2020

Ребята!
Не бейте сильно новичка за, возможно, глупый вопрос. Я с неделю искал ответ на свой вопрос на различных сайтах, но так и не нашел его. Короче задача:

есть три потенциометра и три реле, хочется управлять временем их "мигания" параллельно. Начал, понятное дело, с использования delay(), и с одним реле это работало норм, но при переносе этого на 3 реле все пошло не туда. Откопал, что можно использовать классы и millis, но тут столкнулся со своим ламерством.

Бен, ай нид хелп! Плиз!))

sadman41
Offline
Зарегистрирован: 19.10.2016

google: "blink без delay"

sknyazev
Offline
Зарегистрирован: 25.11.2020

Говорю же: я достаточно порылся перед задаванием вопроса, так что этот коммент несколько мимо

b707
Offline
Зарегистрирован: 26.05.2017

sknyazev пишет:
Говорю же: я достаточно порылся перед задаванием вопроса, так что этот коммент несколько мимо

а от форума что вы хотите?

Примеры кода находятся как раз по той строчке в гугле, что вам дали ранее.  Если есть конкретные вопросы по коду - то задавайте, постараемся ответить. Но готовый код вам никто писать не будет.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Я поясню "на пальцах". Если не поймёшь - ты безнадежен, выбрось бесовскую игрушку и пивка дёрни с пацанами! ;)))

1. Ты придумываешь способ, как связаны времена включенного и выключенного состояний каждого реле с показаниями потенциометров, снятыми через АЦП Ардуины.

2. для каждого реле заводишь четыре переменные: установочное время включенного состояния, выключенного, время последнего переключения, текущее состояние.

3. При каждом входе в loop() ты сперва читаешь потенциометры, пересчитываешь установочные времена реле, для каждого.

3.1. Потом узнаешь текущий счетчик миллисекунд, прошедших от включения контроллера (собственно millis()),

3.2. по каждому реле сравниваешь текущее время с временем последнего переключения этого реле.

3.3. Если прошло времени больше, чем соответствующее установочное значение, переключаешь реле, запоминаешь новое состояние и новое время последнего переключения для этого, конкретного реле.

==========================

Всё.

Это проще сделать классами, но при трех реле и "ламерстве" можешь написать просто для каждого по очереди. Не так красиво выглядит, но объяснять гораздо меньше. ;)))

apg_777
Offline
Зарегистрирован: 22.09.2020

Установить библиотеку MsTimer2.

Скетч для подсказки

#include <MsTimer2.h>

#define stepT 10 // шаг прерываний от таймера 10 мс

const byte numCounters = 3; // 3 реле

long dt[numCounters] = {50, 100, 150}; // интервалы времени для каждого реле в шагах stepT  

volatile long counters[numCounters] = {0, 0, 0}; // счётчики интервалов
volatile bool flags[numCounters] = {false, false, false}; // флаги состояния реле

void timerInt() // обработчик прерываний от таймера
{
  for (byte i = 0; i < numCounters; i++) { // проход по всем счётчикам
    counters[i]++; // увеличить значение счётчика
    if (counters[i] >= dt[i]) { // если перебор
      counters[i] = 0; // обнулить счётчик
      flags[i] = !flags[i]; // инвертировать флаг
    }
  }
}

void setup() {
  // установить пины в нужные режимы
  MsTimer2::set(stepT, timerInt); // установка прерывания — шаг stepT, обработчик timerInt
}

void loop() {
 MsTimer2::stop(); // тормознуть прерывания
// чтение напряжения с переменников и установка значений dt[numCounters];
// вывод сигналов на реле в соответствии с флагами flags[numCounters]
 MsTimer2::start(); // запустить прерывания снова
// сделать что-нибудь ещё
}

Здесь флаги меняют состояние с интервалами 500, 1000 и 1500 мс, на выходе меандр.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sknyazev пишет:
Говорю же: я достаточно порылся перед задаванием вопроса, так что этот коммент несколько мимо

если бы ты достаточно порылся, то и библиотека от DetSimen мимо тебя не прошла бы

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sknyazev пишет:
Говорю же: я достаточно порылся перед задаванием вопроса, так что этот коммент несколько мимо

Отнюдь.

Этот коммент ПОЛНОСТЬЮ решает Вашу задачу. Просто Вы не потрудились его понять.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Мошт три мультивибратора с потенциометрами и нинатъ никаких дурдуин?

sknyazev
Offline
Зарегистрирован: 25.11.2020

я и слов-то таких не знаю) но пороюсь, спасибо! ардуина действительно не обязательна, а просто была под рукой.

sknyazev
Offline
Зарегистрирован: 25.11.2020

apg_777 пишет:

Установить библиотеку MsTimer2.

Скетч для подсказки

#include <MsTimer2.h>

#define stepT 10 // шаг прерываний от таймера 10 мс

const byte numCounters = 3; // 3 реле

long dt[numCounters] = {50, 100, 150}; // интервалы времени для каждого реле в шагах stepT  

volatile long counters[numCounters] = {0, 0, 0}; // счётчики интервалов
volatile bool flags[numCounters] = {false, false, false}; // флаги состояния реле

void timerInt() // обработчик прерываний от таймера
{
  for (byte i = 0; i < numCounters; i++) { // проход по всем счётчикам
    counters[i]++; // увеличить значение счётчика
    if (counters[i] >= dt[i]) { // если перебор
      counters[i] = 0; // обнулить счётчик
      flags[i] = !flags[i]; // инвертировать флаг
    }
  }
}

void setup() {
  // установить пины в нужные режимы
  MsTimer2::set(stepT, timerInt); // установка прерывания — шаг stepT, обработчик timerInt
}

void loop() {
 MsTimer2::stop(); // тормознуть прерывания
// чтение напряжения с переменников и установка значений dt[numCounters];
// вывод сигналов на реле в соответствии с флагами flags[numCounters]
 MsTimer2::start(); // запустить прерывания снова
// сделать что-нибудь ещё
}

Здесь флаги меняют состояние с интервалами 500, 1000 и 1500 мс, на выходе меандр.

 

спасибо за самый полезный коммент!

sknyazev
Offline
Зарегистрирован: 25.11.2020

Поясню ситуацию: я вообще-то гуманитарий

Если бы я хоть что-то понимал про классы, объективно-ориентированное программирование и прочую математику, я бы тут не задавал вопрос. Если присутствующие месье любят поднимать самооценку на таких гуманитариях вроде меня - очень жаль, что им другим нечем заняться)

Когда я говорю "проискал неделю" - это значит, что попробовав множество запросов я так и не нашел ответ на свой вопрос. Почему-то никто не выкладывал код для трех блинков на трех потцах.

Самое близкое, что я нашел, это вот это:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
class Flasher
{
  // Переменные - члены класса
  // Инициализируются при запуске
  int ledPin; // номер пина со светодиодом
  long OnTime; // время включения в миллисекундах
  long OffTime; // время, когда светодиод выключен
 
  // Текущее состояние
  int ledState; // состояние ВКЛ/ВЫКЛ
  unsigned long previousMillis; // последний момент смены состояния
 
  // Конструктор создает экземпляр Flasher и инициализирует
  // переменные-члены класса и состояние
  public:
  Flasher(int pin, long on, long off)
  {
   ledPin = pin;
   pinMode(ledPin, OUTPUT);
 
   OnTime = on;
   OffTime = off;
 
   ledState = LOW;
   previousMillis = 0;
  }
 
  void Update()
  {
   // выясняем не настал ли момент сменить состояние светодиода
 
   unsigned long currentMillis = millis(); // текущее время в миллисекундах
 
   if((ledState == HIGH) && (currentMillis - previousMillis >= OnTime))
   {
     ledState = LOW; // выключаем
     previousMillis = currentMillis; // запоминаем момент времени
     digitalWrite(ledPin, ledState); // реализуем новое состояние
   }
   else if ((ledState == LOW) && (currentMillis - previousMillis >= OffTime))
   {
     ledState = HIGH; // выключаем
     previousMillis = currentMillis ; // запоминаем момент времени
     digitalWrite(ledPin, ledState); // реализуем новое состояние
   }
  }
};
 
Flasher led1(11, 100, 400);
Flasher led2(12, 350, 350);
Flasher led3(13, 300, 700);
 
void setup()
{
}
 
void loop()
{
  led1.Update();
  led2.Update();
  led3.Update();
}

 Но моих мозгов пока не хватило, чтоб понять, куда там прописывать переменные на потенциометр, точнее, как прописанные в объявление класса переменные запросить непосредственно в исполнении.

sadman41
Offline
Зарегистрирован: 19.10.2016

Нам всё равно - гуманитарий ты или анаконда.

Самый простой способ был "озвучен". Хочешь ты им пользоваться или искать дальше до гробовой доски - решать тебе.

b707
Offline
Зарегистрирован: 26.05.2017

sknyazev пишет:

Поясню ситуацию: я вообще-то гуманитарий

Если присутствующие месье любят поднимать самооценку на таких гуманитариях вроде меня - очень жаль, что им другим нечем заняться)

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

sknyazev
Offline
Зарегистрирован: 25.11.2020

b707 пишет:

sknyazev пишет:

Поясню ситуацию: я вообще-то гуманитарий

Если присутствующие месье любят поднимать самооценку на таких гуманитариях вроде меня - очень жаль, что им другим нечем заняться)

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

 

Учиться-то я как раз и пытаюсь. Я просто не понимаю логику и пользу форума: если у человека есть время на ответ с своими едкими комментами, то почему же он не может потратить энергию на пользу?

Да, понимаю, таких вот гуманитариев тут много, наверное пишет. Но ведь в этом случае проще, как мне кажется, просто не отвечать, если лень.

b707
Offline
Зарегистрирован: 26.05.2017

sknyazev пишет:

Я просто не понимаю логику

ну на то ты и гуманитарий, чтоб не дружить с логикой :)

Цитата:
если у человека есть время на ответ с своими едкими комментами, то почему же он не может потратить энергию на пользу?

потому что "отвечать полезно" на идиотские вопросы быстро надоедает, а гуманитарии все идут и идут. И спрашивают либо элементарные вещи. расписанные в сотне учебников. либо откровенную чушь. Куда как веселее их потроллить

Да и выгоднее, как я уже написал выше.

 

sknyazev
Offline
Зарегистрирован: 25.11.2020

b707 пишет:

ну на то ты и гуманитарий, чтоб не дружить с логикой :)

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

 

b707 пишет:

потому что "отвечать полезно" на идиотские вопросы быстро надоедает, а гуманитарии все идут и идут. И спрашивают либо элементарные вещи. расписанные в сотне учебников. либо откровенную чушь. Куда как веселее их потроллить

Да и выгоднее, как я уже написал выше.

Если выгода в посыле в любимое россиянами направление - у меня нет претензий)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sknyazev пишет:

Я просто не понимаю логику и пользу форума: если у человека есть время на ответ с своими едкими комментами, то почему же он не может потратить энергию на пользу?

Может, это потому, что технари и гуманитарии понимают пользу по-разному?

Кстати, заодно интересно: правила сетевой этики технари и гуманитарии тоже понимают по-разному? Ну, например, "Прежде, чем писать на форум, следует его хотя бы 2-3 дня почитать". 

Если бы Вы последовали этому правилу, то узнали бы, что форум предназначен для общения по интересам. И большинству не интересно общаться с людьми, которые интереса для общения не представляют. А интерес для общения представляют только три категории:

1. Обладающие некоторым минимумом знаний и умений.

2. Желающие научиться знаниям и умениям из п.1.

3. Желающие реализовать конкретный проект и готовые платить за это деньги (это - исключительно в разделе "Ищу исполнителя").

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

Судя по Вашей реакции на первую же подсказку, ко второй - тоже (подсказка - пост №1, реакция - пост №2).

Остается вопрос - относитесь ли Вы к третьей категории?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

sknyazev пишет:

Поясню ситуацию: я вообще-то гуманитарий

Один из "гуру" программирования - Алан Голуб, который написал множество книг по практике программистской работы, считает, что лучшие программисты получаются из гуманитариев-филологов. ;))) Вот так вот!

Не могу сказать, что я разделяю эту точку зрения, поскольку я сам - математик, но такое мнение существует.

sknyazev
Offline
Зарегистрирован: 25.11.2020

andriano пишет:

sknyazev пишет:

Я просто не понимаю логику и пользу форума: если у человека есть время на ответ с своими едкими комментами, то почему же он не может потратить энергию на пользу?

Может, это потому, что технари и гуманитарии понимают пользу по-разному?

Кстати, заодно интересно: правила сетевой этики технари и гуманитарии тоже понимают по-разному? Ну, например, "Прежде, чем писать на форум, следует его хотя бы 2-3 дня почитать". 

Если бы Вы последовали этому правилу, то узнали бы, что форум предназначен для общения по интересам. И большинству не интересно общаться с людьми, которые интереса для общения не представляют. А интерес для общения представляют только три категории:

1. Обладающие некоторым минимумом знаний и умений.

2. Желающие научиться знаниям и умениям из п.1.

3. Желающие реализовать конкретный проект и готовые платить за это деньги (это - исключительно в разделе "Ищу исполнителя").

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

Судя по Вашей реакции на первую же подсказку, ко второй - тоже (подсказка - пост №1, реакция - пост №2).

Остается вопрос - относитесь ли Вы к третьей категории?

Приятно, что Вы следуете интернет этике!)

Но Вы несколько поспешно меня судите. Я как раз отношусь к первым двум пунктам. К третьему тоже отношусь, но мне показалось, что мой вопрос настолько простой, что он не перерастет в стандартный форумный срач. Оказалось, я ошибался)

Говоря, что я гуманитарий, я несколько лукавлю, и во многом обобщаю, чтоб не писать лишнюю инфу.

b707
Offline
Зарегистрирован: 26.05.2017

sknyazev пишет:

Говоря, что я гуманитарий, я несколько лукавлю, и во многом обобщаю, чтоб не писать лишнюю инфу.

Перевод:

< на самом я лучше, чем говорю о себе... но я же скромный. сами понимаете >

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sknyazev пишет:

...мне показалось, что мой вопрос настолько простой, что он не перерастет в стандартный форумный срач. Оказалось, я ошибался)

Еще раз:

- исчерпывающий ответ был дан в посте №1,

- тема автоматически была переведена в срач постом №2.

Теперь переживать по этому поводу уже поздно.

sknyazev
Offline
Зарегистрирован: 25.11.2020

wdrakula пишет:

sknyazev пишет:

Поясню ситуацию: я вообще-то гуманитарий

Один из "гуру" программирования - Алан Голуб, который написал множество книг по практике программистской работы, считает, что лучшие программисты получаются из гуманитариев-филологов. ;))) Вот так вот!

Не могу сказать, что я разделяю эту точку зрения, поскольку я сам - математик, но такое мнение существует.

 

Рискну предположить, что он прав. Меня как-то удивила мысль о том, что художники, работающие с технологиями нередко двигают прогресс и науку вперед - своим гуманитарным подходом к технике. А гуманитарии от программеров, например, могут отличаться большей свободой, основанной на более "аналоговом" мышлении. Впрочем мне этот тип мышления пока что мешает, если говорить о программировании.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

wdrakula пишет:

Один из "гуру" программирования - Алан Голуб, который написал множество книг по практике программистской работы, считает, что лучшие программисты получаются из гуманитариев-филологов. ;))) Вот так вот!

Не могу сказать, что я разделяю эту точку зрения, поскольку я сам - математик, но такое мнение существует.

Влад, насколько мне известно, образование "у нас" и "у них" несколько отличается по подходам:

наши технари на самом деле также немного гуманитарии, а вот гуманитарии - "чистые гуманитарии",

их технари - "чистые технари", а гуманитарии - также немного технари.

Другими словами, большего успеха добиваются те, в ком сочетаются качества как технарей, так и гуманитариев.

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

Тс какие классы нафиг ?
Ты без delay() , через millis() хотя бы, диодом помигай.
Если разберёшься с одним, то потом, даже до гуманитария должно дойти, что сущности можно плодить и множить.
Что уже должно решить твою задачу.
Но ты свою тупость (почему то таких много, ты не одинок), скрываешь за гуманитарным мышлением.
Программирование это не технарь/гуманитарий, это умение логически мыслить. И вот тут да, творческий человек , без особых технических знаний, обладая логикой , может составить куда более гениальный алгоритм. Но это не про тебя похоже.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sknyazev пишет:

Поясню ситуацию: я вообще-то гуманитарий

Поясню ситуацию: нам вообще-то пох.

Вам дали направление в котором нужно двигаться, вот и двигайтесь.

Если не можете, то объясните толком, чего Вы от нас хотите? Чтобы мы написали Вам готовое решение? Это в коммерческий раздел - там напишут. 

У Вас есть ещё какие-то вопросы?

sknyazev
Offline
Зарегистрирован: 25.11.2020

так, я немного продвинулся в сторону успеха, но это все равно еще работает странно. стало работать лучше, чем с delay(), но время задержки потенциометров влияет друг на друга.

получился вот такой код:


//Relay1

const byte relay1 = 0;
const byte pot1Pin = A0;
unsigned long relay1interval;
unsigned long relayTimer1;


//Relay2
const byte relay2 = 1;
const byte pot2Pin = A1;
unsigned long relay2interval;
unsigned long relayTimer2;


//Relay3
const byte relay3 = 2;
const byte pot3Pin = A2;
unsigned long relay3interval;
unsigned long relayTimer3;


void setup ()
  {
  pinMode (relay1, OUTPUT);
  pinMode (relay2, OUTPUT);
  pinMode (relay3, OUTPUT);
  relayTimer1 = millis ();
  relayTimer2 = millis ();
  relayTimer3 = millis ();
  }  // end of setup




void toggleRelay1 ()
  {
    relay1interval = analogRead(pot1Pin);
   
   if (digitalRead(relay1) == LOW) {
    if ((millis() - relayTimer1) >= relay1interval) {
      digitalWrite(relay1, HIGH);
      relayTimer1 = millis();
    }
   }    else {
    if ((millis() - relayTimer1) >= relay1interval) { 
      digitalWrite(relay1, LOW);
      relayTimer1 = millis();
    }
   } 
 }  // end of toggleRelay1




void toggleRelay2 ()
  {
    relay2interval = analogRead(pot2Pin);
   
   if (digitalRead(relay2) == LOW) {
    if ((millis() - relayTimer2) >= relay2interval) {
      digitalWrite(relay2, HIGH);
      relayTimer2 = millis();
    }
   }    else {
    if ((millis() - relayTimer2) >= relay2interval) { 
      digitalWrite(relay2, LOW);
      relayTimer2 = millis();
    }
   } 
 }  // end of toggleRelay2




 void toggleRelay3 ()
  {
    relay3interval = analogRead(pot3Pin);
   
   if (digitalRead(relay3) == LOW) {
    if ((millis() - relayTimer3) >= relay3interval) {
      digitalWrite(relay3, HIGH);
      relayTimer3 = millis();
    }
   }    else {
    if ((millis() - relayTimer3) >= relay3interval) { 
      digitalWrite(relay3, LOW);
      relayTimer3 = millis();
    }
   } 
 }  // end of toggleRelay3


 void loop ()
 {
  toggleRelay1();
  toggleRelay2();
  toggleRelay3();
 }
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вставьте код нормально

sknyazev
Offline
Зарегистрирован: 25.11.2020

ЕвгенийП пишет:

Вставьте код нормально

вставил

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sknyazev пишет:

ЕвгенийП пишет:

Вставьте код нормально

вставил

А где номера строк?

sknyazev
Offline
Зарегистрирован: 25.11.2020

andriano пишет:

sknyazev пишет:

ЕвгенийП пишет:

Вставьте код нормально

вставил

А где номера строк?

 

DONE!

sadman41
Offline
Зарегистрирован: 19.10.2016
...
void toggleRelay1() {
   relay1interval = analogRead(pot1Pin);
   if ((millis() - relayTimer1) >= relay1interval) {
      digitalWrite(relay1, !digitalRead(relay1));
      relayTimer1 = millis();
    }
 }  // end of toggleRelay1
...

На пины 0 и 1 не стоит ничего навешивать.

sknyazev
Offline
Зарегистрирован: 25.11.2020

sadman41 пишет:

...
void toggleRelay1() {
   relay1interval = analogRead(pot1Pin);
   if ((millis() - relayTimer1) >= relay1interval) {
      digitalWrite(relay1, !digitalRead(relay1));
      relayTimer1 = millis();
    }
 }  // end of toggleRelay1
...

На пины 0 и 1 не стоит ничего навешивать.

Почему?

sadman41
Offline
Зарегистрирован: 19.10.2016

Потому что в Serial ничего нормально вывести не удастся, если потребуется отладка текстом.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sknyazev пишет:

ЕвгенийП пишет:

Вставьте код нормально

вставил

Не вставил. Где номера строк? Как обсуждать код? Типа "у Вас ошибка в строке №ХЗ ..."

sknyazev
Offline
Зарегистрирован: 25.11.2020

ЕвгенийП пишет:

sknyazev пишет:

ЕвгенийП пишет:

Вставьте код нормально

вставил

Не вставил. Где номера строк? Как обсуждать код? Типа "у Вас ошибка в строке №ХЗ ..."

Может есть какой-то правильный вариант нумерации строк? У меня нумерация отображается

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

Нигде про это нет ни строчки (возможно есть в даташите), но если опрашивать слишком быстро аналоговые входы, то (возможно из за паразитной ёмкости), имеет место быть влияние их значений на соседние.
Тупо вызовы множественных сущностей основной функции, по времени отдалите друг от друга , хотя бы на пару-тройку миллисекунд , скажем так: delay(5);
Должно пройти

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сейчас отображаются, а когда я писал - нет.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А если так?

 void toggleRelay (byte potPin, byte relay, unsigned long & relayTimer)
  {
    int relayInterval = analogRead(potPin) + 1;
    unsigned long m = millis();
    if ((m - relayTimer) >= relayInterval) {
      digitalWrite(relay, !digitalRead(relay));
      relayTimer = m;
    }
 }  // end of toggleRelay


 void loop ()
 {
  toggleRelay(pot1Pin, relay1, relayTimer1);
  toggleRelay(pot2Pin, relay2, relayTimer2);
  toggleRelay(pot3Pin, relay3, relayTimer3);
 }

 

sknyazev
Offline
Зарегистрирован: 25.11.2020

Kakmyc пишет:
Нигде про это нет ни строчки (возможно есть в даташите), но если опрашивать слишком быстро аналоговые входы, то (возможно из за паразитной ёмкости), имеет место быть влияние их значений на соседние.
Тупо вызовы множественных сущностей основной функции, по времени отдалите друг от друга , хотя бы на пару-тройку миллисекунд , скажем так: delay(5);
Должно пройти

Оо, спасибо, сча проверю!

sadman41
Offline
Зарегистрирован: 19.10.2016

Для этого достаточно делать аналогрид два раза подряд, не используя результат первого, как мне помнится.

sknyazev
Offline
Зарегистрирован: 25.11.2020

andriano пишет:

А если так?

 void toggleRelay (byte potPin, byte relay, unsigned long & relayTimer)
  {
    int relayInterval = analogRead(potPin) + 1;
    unsigned long m = millis();
    if ((m - relayTimer) >= relayInterval) {
      digitalWrite(relay, !digitalRead(relay));
      relayTimer = m;
    }
 }  // end of toggleRelay


 void loop ()
 {
  toggleRelay(pot1Pin, relay1, relayTimer1);
  toggleRelay(pot2Pin, relay2, relayTimer2);
  toggleRelay(pot3Pin, relay3, relayTimer3);
 }

 

Я правильно понимаю, что это пример для одного реле?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sknyazev пишет:

Я правильно понимаю, что это пример для одного реле?

Нет, для всех.

И из своего скетча можете убрать строчки 5, 12 и 19.

 

PS. Ну, может, действительно задержку поставить... Но я обычно ставлю параллельно каждому аналоговому входу конденсатор на 0.01-0.1 uF, тогда и шумов меньше и внутренние емкости не влияют.

sknyazev
Offline
Зарегистрирован: 25.11.2020

andriano пишет:

sknyazev пишет:

Я правильно понимаю, что это пример для одного реле?

Нет, для всех.

И из своего скетча можете убрать строчки 5, 12 и 19.

 

PS. Ну, может, действительно задержку поставить... Но я обычно ставлю параллельно каждому аналоговому входу конденсатор на 0.01-0.1 uF, тогда и шумов меньше и внутренние емкости не влияют.

а как же я их уберу, если они есть в

void toggleRelay1 ()
  {
    relay1interval = analogRead(pot1Pin);
   
   if (digitalRead(relay1) == LOW) {
    if ((millis() - relayTimer1) >= relay1interval) {
      digitalWrite(relay1, HIGH);
      relayTimer1 = millis();
    }
   }    else {
    if ((millis() - relayTimer1) >= relay1interval) { 
      digitalWrite(relay1, LOW);
      relayTimer1 = millis();
    }
   } 
   delay(5);
 }  // end of toggleRelay1

delay(5) туда вставлен?)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

А toggleRelay1...toggleRelay3 - тоже убрать, заменив одним toggleRelay. В последний при желании можно и delay(5) вставить.

sknyazev
Offline
Зарегистрирован: 25.11.2020

sknyazev пишет:

andriano пишет:

sknyazev пишет:

Я правильно понимаю, что это пример для одного реле?

Нет, для всех.

И из своего скетча можете убрать строчки 5, 12 и 19.

 

PS. Ну, может, действительно задержку поставить... Но я обычно ставлю параллельно каждому аналоговому входу конденсатор на 0.01-0.1 uF, тогда и шумов меньше и внутренние емкости не влияют.

а как же я их уберу, если они есть в

void toggleRelay1 ()
  {
    relay1interval = analogRead(pot1Pin);
   
   if (digitalRead(relay1) == LOW) {
    if ((millis() - relayTimer1) >= relay1interval) {
      digitalWrite(relay1, HIGH);
      relayTimer1 = millis();
    }
   }    else {
    if ((millis() - relayTimer1) >= relay1interval) { 
      digitalWrite(relay1, LOW);
      relayTimer1 = millis();
    }
   } 
   delay(5);
 }  // end of toggleRelay1

delay(5) туда вставлен?)

 

про 5,12,19 - дошло)

по delay(5) - вставлял в своем скетче между void toggle, в предложенном Вами между строчек loop, один раз после строчек в loop - результат одинаково глючный(

apg_777
Offline
Зарегистрирован: 22.09.2020

Конденсаторы на аналоговых входах точно не помешают.

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

sknyazev
Offline
Зарегистрирован: 25.11.2020

apg_777 пишет:

Конденсаторы на аналоговых входах точно не помешают.

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

 

попробую обязательно! пока очень странно все работает, и с delay, и без.

apg_777
Offline
Зарегистрирован: 22.09.2020

Использовать digitalRead() для вывода, настроенного на выход тоже не лучшая идея. Лучше использовать переменные-флаги, получится и быстрее и экономнее по памяти. И скетч будет короче и понятнее.

Kakmyc
Онлайн
Зарегистрирован: 15.01.2018

apg_777 пишет:

Использовать digitalRead() для вывода, настроенного на выход тоже не лучшая идея. Лучше использовать переменные-флаги, получится и быстрее и экономнее по памяти. И скетч будет короче и понятнее.

 

И что же в этой идее плохо ?

В принципе какая разница откуда прочитать состояние , с отдельной переменной (флага) или с регистра порта ввода/вывода

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

apg_777 пишет:

Использовать digitalRead() для вывода, настроенного на выход тоже не лучшая идея. Лучше использовать переменные-флаги, получится и быстрее и экономнее по памяти. И скетч будет короче и понятнее.

Отнюдь.

Все с точностью до наоборот: и идея лучшая, и экономичнее по памяти, чем в случае с флагами.

Да и скетч, как уже показала практика, сократился.

Это Вы просто не разобрались.