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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кнопки обрабатываются не так... 

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

 

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

поскольку после else

 

да не пофих на ошибки всинтаксисе...

lcd.print(potent1);(":");

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#183271 Опубликовано: (изменено)

5 часов назад, deltafox24 сказал:

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

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

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

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

Изменено пользователем Sebra
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#183332 Опубликовано: (изменено)

@deltafox24

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

 

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

Изменено пользователем doska
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#183340 Опубликовано: (изменено)

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

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

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

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

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

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

 

   int potent1 = analogRead(0); 

 

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

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

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

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

Изменено пользователем PersonaUA
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#183349 Опубликовано: (изменено)

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

Код.

Изменено пользователем doska
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 11.06.2019 в 08:00, PersonaUA сказал:

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

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

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
12 часа назад, doska сказал:

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

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

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

можно двумя способами, в программе и схемотехнически. Ну реле на ssr + симистор можно поменять, и даже нужно. Чтобы было ;)

 

 

@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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#183702 Опубликовано: (изменено)

 

 

 

 

 

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

1560444812258-209241371.jpg

Изменено пользователем deltafox24
0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

1560445137405-350563679.jpg

1560445175450-300022626.jpg

0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#183704 Опубликовано: (изменено)

В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, deltafox24 сказал:

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

 

https://slurm.schedmd.com/coding_style.pdf

http://phbme.kpi.ua/~prat/edu/books/programming/c/1_K_R.pdf

 

1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас