deltafox24

помогите с Arduino

27 повідомлень у цій темі

Всех приветствую!

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

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

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

вот код пишу уже неделю и что то я точно делаю не так .

по задумки должно быть так. 

при включении кнопки 1 и показания потенциометра 1 срабатывает реле 1 с определенной частотой т.е. переключает например раз 1 в секунду. при изменении значения потенциометра соответственно меняется и частота срабатывания реле 

но у меня упорно не реагирует программа на потенциометр, хотя на экран все выводит верно.

и вот с частотой срабатывания тоже не получается если использовать delay то виснит напрочь, а как туда подключить millis в упор понять не могу. перечитал уже кучу всего или я деревянный или читаю не ту литературу=)))

вот такие варианты у меня пока что 

вариант 1

Скрытый текст

#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define potent1_pin 0;
int potent1;
boolean butt1_flag = 0;
boolean butt1;
boolean butt2_flag = 0;
boolean butt2;
boolean relle1;
boolean relle1_flag = 0;
boolean r1 = 0;
boolean r1_flag = 0;
unsigned long last_press;

void setup() {
   lcd.begin(16, 2);
  lcd.print("AIR   :  COOLANT");
  lcd.setCursor(6, 1);
  lcd.print (":");
  pinMode (6, OUTPUT); // выход релле воздуха
  pinMode (8, OUTPUT); // выход светодиода воздуха
  pinMode (9, OUTPUT);
  pinMode(A5, INPUT_PULLUP);
   Serial.begin (9600);
}

void loop() {
 
     int potent1 = analogRead(0); // потенциометр воздуха
     potent1 = map(potent1, 0, 1024, 0, 10);
     potent1 = constrain(potent1, 0, 10);
     lcd.setCursor(4, 1);
     lcd.print(potent1);(":");
     butt1 = !digitalRead(A5); 
          //delay (5000);
   if (butt1 == 1 && butt1_flag == 0 && millis() - last_press > 250) {
    butt1_flag = 1;  
    relle1_flag = !relle1_flag;
    digitalWrite (8, relle1_flag);
    last_press = millis();
    lcd.setCursor(0,1);
    if (relle1_flag == 1){ 
    lcd.print  ("ON "); 
   }else if (potent1 == 0 && relle1_flag == 1){
    digitalWrite (6, 1);
    Serial.print ("POT0");
   }else if (potent1 == 1 && relle1_flag == 1){
    digitalWrite (6, 0 && millis - last_press == 500 );
    digitalWrite (6, 1 && millis - last_press == 500 );
    Serial.print ("POT1");
    }else if (potent1 == 2 && relle1_flag == 1 ){
       digitalWrite (6, 0);
       Serial.print ("POT2");
       
       }}
    
    

  
            
  
   
        
    else (butt1 == 0 && butt1_flag == 1 && millis() - last_press > 250); {
    butt1_flag = 0;
    r1_flag = 0;
    lcd.setCursor(0,1);
    if (relle1_flag == 0) {lcd.print ("OFF"); digitalWrite (6, 1);} 
  
       }
 
}

вариант 2 тоже нефига не выходит 

Скрытый текст


#include <LiquidCrystal.h>
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
#define potent1_pin 0;
byte potent1;
boolean butt1_flag = 0;
boolean butt1;
boolean butt2_flag = 0;
boolean butt2;
boolean relle1;
boolean relle1_flag = 0;
boolean r1 = 0;
boolean r1_flag = 0;
unsigned long last_press;
long previousMillis = 0;
long interval1 = 1000;

void setup() {
   lcd.begin(16, 2);
  lcd.print("AIR   :  COOLANT");
  lcd.setCursor(6, 1);
  lcd.print (":");
  pinMode (6, OUTPUT); // выход релле воздуха
  pinMode (8, OUTPUT); // выход светодиода воздуха
  pinMode (9, OUTPUT);
  pinMode(A5, INPUT_PULLUP);
   Serial.begin (9600);
}

void loop() {
 
     int potent1 = analogRead(0); // потенциометр воздуха
     potent1 = map(potent1, 0, 1024, 0, 10);
     potent1 = constrain(potent1, 0, 10);
     lcd.setCursor(4, 1);
     lcd.print(potent1);(":");
     butt1 = !digitalRead(A5); 
          //delay (5000);
   unsigned long currentMillis = millis();
   if (butt1 == 1 && butt1_flag == 0 && millis() - last_press > 250) {
    butt1_flag = 1;  
    relle1_flag = !relle1_flag;
    digitalWrite (8, relle1_flag);
    last_press = millis();
    lcd.setCursor(0,1);
    if (relle1_flag == 1){ 
    lcd.print  ("ON "); 
   switch (potent1) {
    case 1: digitalWrite (6, 1);
    delay (1000);
    break;
    case 2: digitalWrite (6, 0);
    previousMillis = currentMillis; 
    break;
    case 3: digitalWrite (6, 1);
    delay (1000);
    break;
    case 4: digitalWrite (6, 0);
    delay (1000);
    break;
   }}}
   
   
  
    
    

  
            
  
   
        
    else (butt1 == 0 && butt1_flag == 1 && millis() - last_press > 250); {
    butt1_flag = 0;
    r1_flag = 0;
    lcd.setCursor(0,1);
    if (relle1_flag == 0) {lcd.print ("OFF"); digitalWrite (6, 1);} 
  
       }
 
}
   
 

  

Тыкните пожалуйста пальцем где я дурак =))

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Может в этом случае я и не прав,но слово РЕЛЕ пишется с одной Л,в том числе на английском.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
1 час назад, deltafox24 сказал:

 {
    butt1_flag = 0;
    r1_flag = 0;
    lcd.setCursor(0,1);
    if (relle1_flag == 0) {lcd.print ("OFF"); digitalWrite (6, 1);} 
  
       }

Выполняется всегда, поскольку после else (butt1 == 0 && butt1_flag == 1 && millis() - last_press > 250) стоит ";"

 

1 час назад, deltafox24 сказал:

digitalWrite (6, 1 && millis - last_press == 500 );

Это будет работать произвольным образом.

 

Дайте номера пинов для кнопок, потенциометров, реле - попробую помочь.

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Потрібна затримка без delay.

Приклад-скелет для доробки під потреби



unsigned long LoopCyclePreviousMillis = 0;
const long    LoopCycleInterval       = 1000;

void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(115200);

}

void loop() {
  // put your main code here, to run repeatedly:

  unsigned long LoopCycleCurrentMillis = millis();

  // ====================================================================================================================== loop every LoopCycleInterval
  if (LoopCycleCurrentMillis - LoopCyclePreviousMillis >= LoopCycleInterval) {
    LoopCyclePreviousMillis = LoopCycleCurrentMillis;
    Serial.println(LoopCycleCurrentMillis);

    // ------------------------------------------------------------------------ another intrval (less at LoopCycleInterval)
    
    
  }
  // ===================================================================================================================================================

}

 

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
13 часа назад, doska сказал:

Выполняется всегда, поскольку после else (butt1 == 0 && butt1_flag == 1 && millis() - last_press > 250) стоит ";"

 

Это будет работать произвольным образом.

 

Дайте номера пинов для кнопок, потенциометров, реле - попробую помочь.

 

потенциометр - аналоговый  0

кнопка включения - аналоговый  5

светодиод - 8

реле - 6

15 часов назад, Barth сказал:

Может в этом случае я и не прав,но слово РЕЛЕ пишется с одной Л,в том числе на английском.

знаю - изначально допустил ошибку а потом просто лень было исправлять

15 часов назад, softm сказал:

начните с вывода сопротивления на дисплей.

 

сопротивления чего? показания потенциометра? так они выводятся на дисплей 

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
5 часов назад, deltafox24 сказал:

показания потенциометра? так они выводятся на дисплей 

Якщо показники регуляторів виводяться на дисплей, значить зі методикою зчитування проблем немає - мегалогічно.

Проблема з періодичністю дій, які треба виконувати залежно від значення потенціометра, в чому вона (проблема) імовірніше всього є, я вам вище написав.

І ще хочу уточнити момент: включати реле потрібно на якийсь сталий час, чи час у ввімкненому стані теж має залежити від потенціометра?

Змінено користувачем Sebra
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

@deltafox24

Сделал в tinkercad, ардуинку собирать лень, если честно. Там есть вкладка Code сверху - это собственно код. Вместо реле светодиод.

 

Если что неправильно понял по алгоритму - пиши, допилим. 

Змінено користувачем doska
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Даже маленькие проекты лучше не писать как стихи в одну колонку. Это затрудняет восприятие кода. Функциональные блоки программы лучше разделить в разные файлы, например: lcd, timer, serial и т.д.. 

Тогда каждый блок будет лаконичным и читаемым. А в главном файле оставить setup() из 4-х строк и практически пустой loop() с вызовами нужных в данный момент функций. 

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

Delay блокирует, замораживает выполнение кода. В циклах лучше отказаться от применения delay.

Для отладки проще всего выводить значения в окно терминала: Serial.print().

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

 

   int potent1 = analogRead(0); 

 

лучше не использовать прямое указание по номеру пина, легко запутаться. Под флагом платформы "ардуино" сейчас сожительствуют сотни различных микроконтроллеров и у многих есть существенные отличия в параметрах, в т.ч. АЦП. 

Лучше сначала описать пин, а потом на него ссылаться. Записи A0, D3 и т.п. более однозначны.

A - аналоговые входы, D - цифровые.

Иначе можно физически разместить потенциометр не на тех ногах. Такое редко бывает, но бывает.

Змінено користувачем PersonaUA
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

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

Код.

Змінено користувачем doska
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Поздравляю с победой над кодом! В таком виде код выглядит совершенно иначе, сияет!

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
В 11.06.2019 в 08:00, PersonaUA сказал:

Поздравляю с победой над кодом!

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

1

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
12 часа назад, doska сказал:

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

Не обратил внимание на это). Но все-равно классно!

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
Цитата

    temp = air_relay_period / 1023.0 * air_pot_current_value * 1000.0;

    air_relay_tOn = (unsigned long )temp;

    air_relay_tOff = (air_relay_period * 1000) - air_relay_tOn;

    temp = 0.0;

Что мешает определить переменную temp как unsigned long и, тем самым, избавиться от арифметики с плавающей точкой?

 

Цитата

air_btn_current_state = digitalRead (air_btn_pin);

 

if (air_btn_current_state != air_btn_previous_state)

{

    . . .

}

Борьба с дребезгом контактов кнопки?

 

Из некритического: множественные вызовы millis() вперемешку с довольно неторопливым выводом на LCD добавят непредсказуемости в работу программы. Рекомендую читать состояние millis() один раз где-то в начале цикла loop().

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
 

 

 

 

 

Не работает вообще, ни на кнопку не реагирует ни на потенциометр, а на экране вообще непонятно что

1560444812258-209241371.jpg

Змінено користувачем deltafox24
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

А вот так вообще по задумке с моим кодом

1560445137405-350563679.jpg

1560445175450-300022626.jpg

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
В 10.06.2019 в 23:35, PersonaUA сказал:

Даже маленькие проекты лучше не писать как стихи в одну колонку. Это затрудняет восприятие кода. Функциональные блоки программы лучше разделить в разные файлы, например: lcd, timer, serial и т.д.. 

Тогда каждый блок будет лаконичным и читаемым. А в главном файле оставить setup() из 4-х строк и практически пустой loop() с вызовами нужных в данный момент функций. 

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

Delay блокирует, замораживает выполнение кода. В циклах лучше отказаться от применения delay.

Для отладки проще всего выводить значения в окно терминала: Serial.print().

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

 

   int potent1 = analogRead(0); 

 

лучше не использовать прямое указание по номеру пина, легко запутаться. Под флагом платформы "ардуино" сейчас сожительствуют сотни различных микроконтроллеров и у многих есть существенные отличия в параметрах, в т.ч. АЦП. 

Лучше сначала описать пин, а потом на него ссылаться. Записи A0, D3 и т.п. более однозначны.

A - аналоговые входы, D - цифровые.

Иначе можно физически разместить потенциометр не на тех ногах. Такое редко бывает, но бывает.

Я в принципе понимаю, что вы хотите сказать, но я вроде говорил, что это вообще первая моя программа, от слова совсем первая =))))

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

Змінено користувачем deltafox24
0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
В 10.06.2019 в 23:35, PersonaUA сказал:

Даже маленькие проекты лучше не писать как стихи в одну колонку. Это затрудняет восприятие кода. Функциональные блоки программы лучше разделить в разные файлы, например: lcd, timer, serial и т.д.. 

Тогда каждый блок будет лаконичным и читаемым. А в главном файле оставить setup() из 4-х строк и практически пустой loop() с вызовами нужных в данный момент функций. 

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

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
6 часов назад, softm сказал:

Найдите уже, и исправьте ;)

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

 

1 час назад, deltafox24 сказал:

Не работает вообще

Номера пинов на свои поменяли? Проект в Tinkercad смотрели?

 

 

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
1 час назад, deltafox24 сказал:

хорошо описывалась именно структура кода

Чистый код. Создание, анализ и рефакторинг.

 

1 час назад, deltafox24 сказал:

а вот где про это почитать можно?

По началу этим заниматься не стоит. Скорее запутаетесь, чем разберетесь. 

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
53 минуты назад, doska сказал:

Номера пинов на свои поменяли? Проект в Tinkercad смотрели?

пины менял, проект смотрел, и кстати реле я в симуляции вообще не  нашел 

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

@deltafox24

Странно, код настолько простой, что непонятно как ему не работать. Попробую на живой ардуине собрать.

Я тут фото ваши посмотрел. У вас кнопка замыкает А3 на землю?

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах
В 13.06.2019 в 22:23, doska сказал:

Я тут фото ваши посмотрел. У вас кнопка замыкает А3 на землю?

кнопка А5 на землю

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Вы делаете INPUT_PULLUP и просто замыкаете вход на землю?

0

Поділитися повідомленням


Посилання на повідомлення
Поділитися на інших сайтах

Створіть акаунт або увійдіть для коментування

Ви маєте бути користувачем, щоб залишити коментар

Створити акаунт

Зареєструйтеся для отримання акаунта. Це просто!


Зареєструвати акаунт

Увійти

Вже зареєстровані? Увійдіть тут.


Увійти зараз

  • Зараз на сторінці   0 користувачів

    Немає користувачів, які переглядають цю сторінку