Автор Тема: Создание периодики на Arduino  (Прочитано 28860 раз)

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #140 : 08 Сентябрь 2016, 02:04:16 »
Не нравится как работают тактовые кнопки,
Чем именно ?

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

Цитировать
Я взял 12v переключатели. Не думаю что он выдержит нагрузку  драйвера :(
Что за переключатели ?
Если через Ардуину, то переключатель будет включать реле, а реле уже включать свет. Нагрузки на нем не будет.

Цитировать
на принижении
?

Цитировать
Дисплей приехал, впаял его первым, были сомнения:
 
В нем все символы с помощью кодов отображаются или только русские ?
Как например вывести такую строку:
T: 24.5

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


Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #141 : 08 Сентябрь 2016, 08:49:59 »
Кнопку монтировать в корпус не удобно.  пожалуй это главный недостаток.

переключатель вот такой http://www.chipdip.ru/product/asw-15-d-green/  Пихал его уже на макетку вместо кнопки, немного изменив код, все работает без проблем. Если на аржуину его пихать, думал именно так как вы описали, по сути он будет управлять реле. Разве что по схемотехнике непонятно, под тактовую кнопку рекомендуют ставить 10кОм резистор на землю. типа чтоб отсечь полностью сигнал, если кнопка не полностью размыкает и чутка коротит. На переключатель, думаю его пихать уже смысла нет?


На протяжении :)))


цифры, стандартные символы, и латинские буквы выводятся на прямую, ваш текст в коде выглядит так:  lcd.print("T:24.5");
кирилица кодом, расшифровка есть в даташите.


Диоды да, отпадают, при наличии дисплея смысла в них просто нет.






Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #142 : 08 Сентябрь 2016, 17:35:51 »
Подправил немного скетч. Убрал диоды и сделал отображение на дисплее наших главных переменных, которые меняем потенциометрами. Ну и тумблеры. Правил вслепую, без проверки (поленился ставить Proteus и шаманить там дисплей), проверьте, работает ли, надеюсь ничего не забыл.
Потом уже сделаем более красивое отображение данных на дисплее и тайминг лампы.

//---------Часы и Serial-----------------------
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>
#include <LiquidCrystal.h>

float z_time = 0;
tmElements_t tm;
int current_hour = 0;                         //храним текущий час
float day_koef = 1;                           //коэффициент времени дня
boolean svet_flag = 0;                        // Флаг света

//--------------Интерфейс---------------------
LiquidCrystal lcd(6, 7, 3, 2, 5, 4);
float display_last_time = 0;                        //Для засечки таймера обновления дисплея

boolean sliv_flag = 0;                        // Флаг режима слива
float y_last_time = 0;                        //Для засечки таймера дребезга кнопки

int led_green = 1;                            // Главная "зеленая" переменная, частота затоплений
int led_blue = 1;                             //Продолжительность затопления

//----------------Помпа и клапаны-------------------------
float base_dive_freq = 2000;                  //Базовый интервал между затоплениями, он затем будет умножаться на "зеленую" переменную
float dive_freq = 0;                          //Вычисленное реальное время между затоплениями. Служебная.
float dive_freq_last_time = 0;                //Засечка. Служебная

float dive_const = 1000;                       //Константа. Нужно будет замерять и занести сюда время, за которое физически наполняется труба до верха
float pereliv_const = 1000;                    //Константа. Нужно будет замерять и занести сюда время, за которое физически из верхней трубы в нижнюю переливается раствор
                                        
float base_dive_time = 200;                     //Базовый интервал для времени затопления. Мы его будем затем умножать на "желтую" переменную (led_blue)
float dive_time = 0;                            // Здесь будет уже вычисленное время продолжительности затопления. Служебная
float dive_time_last_time = 0;                  //Засечка. Служебная

float dive_time_down = 0;                       // Здесь будет уже вычисленное время продолжительности затопления для нижней трубы. Служебная
float dive_time_down_last_time = 0;             //Засечка нижней трубы. Служебная

boolean dive_flag = 0;                           //Флаг, который говорит включена помпа или нет. 1 - включена, 0 - нет.
boolean clapan_up_flag = 0;                      //Флаг, который говорит верхний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.
boolean clapan_down_flag = 0;                    //Флаг, который говорит нижний клапан закрыт клапан или нет. 1 - закрыт, 0 - нет.

//****************************************************************************************                    
//****************************************************************************************
void setup() {
  Serial.begin(9600);
  lcd.begin(8, 2);
  
  pinMode(8, INPUT);                        //Пин для тумблера режимов
  pinMode(9, INPUT);                        //Пин для тумблера света
  
  pinMode(A3, INPUT);                       //пин для потенциометра
  pinMode(A2, INPUT);                       //пин для потенциометра
  
  pinMode(11, OUTPUT);                       //пин для нижнего клапана
  pinMode(12, OUTPUT);                       //пин для реле, на которой будет помпа
  pinMode(10, OUTPUT);                      //пин для верхнего клапана
  pinMode(13, OUTPUT);                      //пин для света
}
//*****************************************************************************************
//*****************************************************************************************
void loop() {

//-----------Часы и Serial-------------------------
  if((millis() - z_time) > 1000){
    RTC.read(tm);
    //String ho = "Time: "+String(tm.Hour)+":"+String(tm.Minute)+":"+String(tm.Second);
    Serial.println ("Hour "+ String(tm.Second)+"   Koeff - " + String(day_koef));
    z_time = millis();

    current_hour = tm.Hour;
    //current_hour = tm.Second;                 //временная привязка к секундам для проверки правильности коэфф.
    if (current_hour == 8 || current_hour == 9 || current_hour == 20 || current_hour == 21) day_koef = 1;           //коэфф. для часов дня
    if (current_hour == 10 || current_hour == 11 || current_hour == 18 || current_hour == 19) day_koef = 0.75;
    if (current_hour >=12 && current_hour <=17) day_koef = 0.5;
    if ((current_hour >=0 && current_hour <=7) || current_hour == 22 || current_hour == 23) day_koef = 2;
  }
  
//------------Вычисление времени работы------------------------
if (!sliv_flag){        
  dive_freq = base_dive_freq * led_green * day_koef;
  dive_time = dive_const + base_dive_time * led_blue;  
  dive_time_down = pereliv_const + base_dive_time * led_blue;    
                          
 
//------------Работа помпы и клапанов------------------------------
  if((millis() - dive_freq_last_time) > dive_freq) {        //если время затопления наступило
    digitalWrite(12, 1);                                     //включаем помпу
    digitalWrite(10, 1);                                    //закрываем клапан
    dive_flag = 1;                                          //выставляем флаг, что помпа включена
    clapan_up_flag = 1;                                     //выставляем флаг, что клапан закрыт
    dive_freq_last_time = millis();                         //засечка для вычисления времени следующего включения помпы
    dive_time_last_time = millis();                         //засечка для вычисления премени выключения помпы
    }

  if(dive_flag && (millis()-dive_time_last_time) > dive_const){  //если помпа включена и время выключения наступило
    digitalWrite(12, 0);                                          //выключаем помпу
    dive_flag = 0;                                               //выставляем флаг, что помпа выключена
    }

  if(clapan_up_flag && (millis()-dive_time_last_time) > dive_time){       //если верхний клапан закрыт и время затопления истекло
    digitalWrite(10, 0);                                                  //открываем верхний клапан
    clapan_up_flag = 0;                                                   //выставляем флаг, что верхний клапан открыт
    digitalWrite(11, 1);                                                   //закрываем нижний клапан
    clapan_down_flag = 1;                                                 //выставляем флаг, что нижний клапан закрыт
    dive_time_down_last_time = millis();
    }

  if(clapan_down_flag && ((millis()-dive_time_down_last_time) > dive_time_down)){  //если нижний клапан закрыт и время нижнего затопления истекло
    digitalWrite(11, 0);                                                            //Открываем нижний клапан
    clapan_down_flag = 0;                                                          //выставляем флаг, что нижний клапан открыт
    }
}

//-------------------Слив----------------------------
if (sliv_flag){                                                                    
  digitalWrite(11, 0);                                                              
  digitalWrite(10, 0);
  digitalWrite(12, 0);  
  dive_freq_last_time = millis() - (float)86400000;                           // заставляем базовую программу думать, что последний полив был сутки назад
  }

//===================Интерфейс===================================

//-----------Чтение потенциометра-------------------------------
   led_green = (int)(analogRead(A3)/100) + 1;  
   led_blue = (int)(analogRead(A2)/100) + 1;  
 
//-------------Обработка тумблеров-----------------------------
if((millis()-y_last_time)>200){                    
  if (digitalRead(8)){sliv_flag = 1;}
  else {sliv_flag = 0;}
  if (digitalRead(9)){svet_flag = 1;}
  else {svet_flag = 0;}
  y_last_time = millis();
  }
                                                        
//-------------------Дисплей-------------------------
  if ((millis()-display_last_time)>500){
    lcd.setCursor(0, 0);
    lcd.print((String)led_green);
    lcd.setCursor(0, 1);
    lcd.print((String)led_blue);
    display_last_time = millis();
    }

 
}

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #143 : 08 Сентябрь 2016, 17:43:58 »
под тактовую кнопку рекомендуют ставить 10кОм резистор на землю. типа чтоб отсечь полностью сигнал, если кнопка не полностью размыкает и чутка коротит. На переключатель, думаю его пихать уже смысла нет?
Резистор этот (называется "подтягивающий") ставят не из-за того, что "коротит", а из-за того, что на пине могут гулять паразитные токи и чувствительная ардуина может их воспринять за сигнал. Поэтому и "подтягивают" через резистор к земле, чтобы все они в землю и уходили, и всегда по умолчанию на пине был железный ноль.
Тумблеры в этом смысле ничем не отличаются.
Но в Ардуине есть возможность подключить внутренние подтягивающие резисторы.
Для этого в методе setup добавьте пару строк:
digitalWrite(8, LOW);    
digitalWrite(9, LOW);

P.S. Там в скетче вместо смайлика         8 )               должно быть :)
  

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #144 : 08 Сентябрь 2016, 20:54:20 »
Понял, мне их впаять не проблема. Скетч, как только допаяю, залью проверим...

не удержался залил.  на потенциометры экран реагирует корректно  крутит от 01 до 11

зы. не корректно.  не убирает второй символ, кручу потенциометр пишет 11, далее 10, 90 80... и потом вместо 1, 10...  
« Последнее редактирование: 08 Сентябрь 2016, 22:03:15 от AlexYalta »

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #145 : 09 Сентябрь 2016, 03:10:37 »
Понял, мне их впаять не проблема. Скетч, как только допаяю, залью проверим...

не удержался залил.  на потенциометры экран реагирует корректно  крутит от 01 до 11

зы. не корректно.  не убирает второй символ, кручу потенциометр пишет 11, далее 10, 90 80... и потом вместо 1, 10...  
Понятно, видимо особенность дисплея, меняет только те символы, которые необходимы для отображения строки. Если строка состоит из одного символа, то и меняет только первый символ, а второй "0" остается с отображаемой ранее "10".
Ну тогда давайте просто добавим по пробелу в конец строки, и если строка будет состоять только из одной цифры, то пробел сотрет второй, который остался от десятки.
Вот так:

    lcd.setCursor(0, 0);
    lcd.print((String)led_green + " ");
    lcd.setCursor(0, 1);
    lcd.print((String)led_blue + " ");

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

lcd.clear();
lcd.print((String)led_green);
lcd.setCursor(0, 1);
lcd.print((String)led_blue);

Попробуйте, если во втором варианте мигание не будет заметно глазу (промежуток между очисткой и выводом новых данных), то проще использовать второй, чтоб в будущем не беспокоиться о длине строк.
« Последнее редактирование: 09 Сентябрь 2016, 03:18:58 от Ann »

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #146 : 09 Сентябрь 2016, 19:50:00 »
Понял, спасибо! Завтра попробую.

 Забрал детальки для светильника, завтра у меня день пайки. Доделаю ардуинуку и попробую спаять светильник.....

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #147 : 10 Сентябрь 2016, 18:17:22 »
Допаял ардуину.  Беда печаль, спомнил что глючит 1 из четерех каналов на релейном модуле. Придется пока доводить систему без управления светильником.  

в остальном вроде все пашет нормально. Кроме часов.

экрану ваше лекарство помогло

только нужно поубирать пробелы перед и за +

    lcd.print((String)led_green+" ");
    lcd.setCursor(0, 1);
    lcd.print((String)led_blue+" ");

Тумблеры пашут исправно.  Осталось совсем немного, спаять блок нагрузки и светильник. и можно будет приступать к сборке рабочих емкостей,  и блока управления в корпусе.
« Последнее редактирование: 10 Сентябрь 2016, 18:19:03 от AlexYalta »

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #148 : 10 Сентябрь 2016, 22:02:53 »
Допаял ардуину.  Беда печаль, спомнил что глючит 1 из четерех каналов на релейном модуле.
Так вроде ж причина была, что Вы ее на Tx повесили ? Или опять глючит ?

Цитировать
Кроме часов.
Там раньше я писал как выводить часы в Serial monitor

Цитировать
экрану ваше лекарство помогло
А второй вариант не моргает ?

Цитировать
только нужно поубирать пробелы перед и за +
А что, с пробелами не пашет ? Компилятор по идее реагирует только на разделители (; , {} ()), пробелы он должен игнорировать.
 

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #149 : 10 Сентябрь 2016, 22:54:36 »
убрал пробелы и все заработало. Видимо при выводе текста на экран пробелы все же учитываются.


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

Часы я пока не трогал особо,  Завтра поэкспериментирую с ними.


Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #150 : 27 Октябрь 2016, 13:16:19 »
"Если есть еще какие варианты по теме клапанов, предлагайте, буду признателен."


Стиральная машинка автомат источник всего необходимого. На пунктах приема чермета все нежелезное можно взять бесплатно или за пузырь.
Клапаны, помпа, датчик уровня воды пневматический кстати , датчик температуры даже тэн может прикодиться. 99,9 все исправное .
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #151 : 06 Декабрь 2016, 14:09:48 »
В стиралках, клапана работают только под давлением, для системы где раствор самотеком стекает в емкость хранения, они не пригодны. Нужны  те что работают без давления, типа как в кулерах для воды и тп. Позже скину ссылку какие я брал в китае.

Оффлайн AlexYalta

Re: Создание периодики на Arduino
« Ответ #152 : 06 Декабрь 2016, 14:11:25 »
К новому году, должны появиться выходные, буду продолжать сборку системы. Все необходимое приобрел, осталось только собрать.

Оффлайн Ouroboros

Re: Создание периодики на Arduino
« Ответ #153 : 23 Август 2017, 11:00:45 »
Подскажите такой вот момент. Начал задумываться о периодике, гуглю вот для начала ардуинку для этой темы. Нашел на алике вот такой лот https://ru.aliexpress.com/store/product/UNO-R3-CH340G-ATmega328P-compatible-for-Arduino-UNO-R3/1950989_32523366108.html?spm=a2g0v.12010612.0.0.47d739c1586kW
Такое исполнение подойдет для наших дел? Просто в местных интернет-магазинах оригинал (вроде как) продается вчетверо дороже. Возникает вопрос - все ли с китайским клоном норм или я что-то не вкуриваю?

Вопрос 2: что еще понадобится для обвеса ардуины в минимальном сетапе периодики? Твердотельное реле для коммутации 220в насоса либо просто 12в насос? Что-то еще?

Оффлайн КРОТ

Re: Создание периодики на Arduino
« Ответ #154 : 23 Август 2017, 12:57:59 »
1. Нет неообходимости покупать оригинал. Китай вполне подходит. Единственное отличие это дрова для связи с компом для китайских плат отдельно скачать придется.
2. Реле и насос 12 вольт тоже китайские. Там же куча датчиков к ардуине подешёвке.
 

Оффлайн Ouroboros

Re: Создание периодики на Arduino
« Ответ #155 : 23 Август 2017, 13:59:51 »
1. Нет неообходимости покупать оригинал. Китай вполне подходит. Единственное отличие это дрова для связи с компом для китайских плат отдельно скачать придется.
2. Реле и насос 12 вольт тоже китайские. Там же куча датчиков к ардуине подешёвке.
 
Реле я так понимаю нужно для комутации насоса 12в из-за того, что ардуинка юзает 5в?

Оффлайн kido

Re: Создание периодики на Arduino
« Ответ #156 : 23 Август 2017, 16:28:39 »
для начала опишите "хотелки", что ждете от того о чем "начали задумываться"

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Re: Создание периодики на Arduino
« Ответ #157 : 24 Август 2017, 11:59:36 »
Подскажите такой вот момент. Начал задумываться о периодике, гуглю вот для начала ардуинку для этой темы. Нашел на алике вот такой лот https://ru.aliexpress.com/store/product/UNO-R3-CH340G-ATmega328P-compatible-for-Arduino-UNO-R3/1950989_32523366108.html?spm=a2g0v.12010612.0.0.47d739c1586kW
Такое исполнение подойдет для наших дел? Просто в местных интернет-магазинах оригинал (вроде как) продается вчетверо дороже. Возникает вопрос - все ли с китайским клоном норм или я что-то не вкуриваю?

Вопрос 2: что еще понадобится для обвеса ардуины в минимальном сетапе периодики? Твердотельное реле для коммутации 220в насоса либо просто 12в насос? Что-то еще?
Для периодики в простейшем варианте (периодическое включение помпы) можно применить что угодно: от ATTINY13 за пару центов до Raspberry за 50+$.
Выбранная Вами Ардуино Уно (либо её аналог в меньшем форм-факторе Ардуино Нано) - самый оптимальный вариант по соотношению простоты и цены. Нану за 3-4 доллара не сложно найти даже в оффлайне. За оригиналом гнаться смысла нет, работают они на одинаковых микросхемах, а больше там ломаться нечему.
Можно еще глянуть в сторону Wemos D1 mini - почти то же самое, но плюс ВайФай на борту и за ту же цену. В будущем, если планируется апгрейд, позволит упростить и удешевить конструкцию устройства (весь интерфейс, т.е. отображение информации и управление, можно будет перевести в телефон или компьютер, что избавит от необходимости приобретения кнопок, энкодеров, дисплеев и т.д.). Тут уже на желания/возможности ориентироваться нужно.
Обвес зависит от выбраной (имеющейся в наличии) помпы.
Если это 220V, то я бы взял OMRON G3MB-202P, очень приятная штука.
Если 12V, то: транзистор, сборка Дарлингтона, либо обычное механическое. Последнее можно и для 220V, но OMRON лучше (проще подключать, не нужно тянуть питание, бесшумное, долговечное).

Оффлайн kido

Re: Создание периодики на Arduino
« Ответ #158 : 24 Август 2017, 13:50:51 »
Цитировать
Для периодики в простейшем варианте
Для периодики в простейшем варианте хватит и обычного электро-механического реле.
В сторону attiny даже  не смотрите, Уно или нано - ваше всё!
Если в программировании ни бельмеса, то про Вемос забудьте.
Твердотельное реле - супер, ну, а нет, то и обычное норм.

Оффлайн PowerTech

Re: Создание периодики на Arduino
« Ответ #159 : 25 Август 2017, 11:07:46 »
"Если есть еще какие варианты по теме клапанов, предлагайте, буду признателен."
Себе взял на пробу пару 12 вольтовых - нормально закрытые, для газов, воды, материал анодированный алюминий.
http://www.ebay.com/itm/12V-1-4-2-Ways-Normally-Closed-Pneumatic-Aluminum-Electric-Solenoid-Air-Valve-/282456619845?hash=item41c3b9fb45:g:cboAAOSw-89ZO6Cc

Есть пластиковый по дешевле, но 1/2 дюйма -
http://www.ebay.com/itm/1-12V-Electric-Solenoid-Valve-Magnetic-DC-N-C-Water-Air-Inlet-Flow-Switch-WW-/263104484695?hash=item3d423fd557:g:mhAAAOSweWVXe3yy

http://www.ebay.com/itm/Mini-2-Position-3-Way-Electric-Control-Solenoid-Valve-Gas-Air-Pump-DC-5V-6V-PYSK-/122609196665?hash=item1c8c13de79:g:BREAAOSwHwpZcBbI

На алиэкспресс не знаю, так как беру всё с ёбы.
« Последнее редактирование: 25 Август 2017, 16:02:54 от PowerTech »