Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Темы - Ann

Страницы: [1] 2
1
Поскольку на форуме регулярно встречаются у людей проблемы с таймингом (механические таймеры "не надежные, недостаточно настроек, дорогие, нестабильно работают и т.д."), расскажу на пальцах, как человеку, совсем не связанному с техникой и программированием, сделать двухканальный таймер с неограниченным количеством настроек.
Покупаем Ардуино Нано, двухканальное реле и десяток монтажных проводков (мама-мама), цена за все 4-5$:

Ардуину лучше взять с уже распаянной гребенкой (штырьками), чтоб потом не паять.
Подключаем Нану к компьютеру (у неё как правило разъем mini-USB), скачиваем и устанавливаем драйвер, устанавливаем Arduino IDE.
Запустив Arduino IDE, идем в Инструменты>Плата, выбираем там Ардуино Нано. Копируем туда скетч

int pin1 = 5;                             //номер пина, куда подключено первое реле таймера 1
unsigned long freq=60;           //периодичность включения в минутах таймера 1
unsigned long dlit=5;              //длительность работы в минутах таймера 1
unsigned  long freq_last_time;

int pin2 = 6;                                                         //номер пина, куда подключено первое реле таймера 2
unsigned long freq2=60;                                     //периодичность включения в минутах таймера 2
unsigned long dlit2=5;                                        //длительность работы в минутах таймера 2
unsigned long freq_last_time2;


void setup(void){
pinMode(pin1 , OUTPUT);
pinMode(pin2 , OUTPUT);
digitalWrite(pin1 , HIGH);
digitalWrite(pin2 , HIGH);
}

void loop(void){
Rele();
Rele2();
}

void Rele(){
if(  (millis()-freq_last_time)>(freq*60000)  ){
     digitalWrite(pin1 , HIGH);
     freq_last_time=millis();
}
if(  (millis()-freq_last_time)>(dlit*60000) ){
     digitalWrite(pin1 , LOW);
  }
}

void Rele2(){
if(  (millis()-freq_last_time2)>(freq2*60000)){
     digitalWrite(pin2 , HIGH);
     freq_last_time2=millis();
}
if(  (millis()-freq_last_time2)>(dlit2*60000)){
     digitalWrite(pin2 , LOW);
  }
}

И нажимаем кнопку со стрелочкой (при первой заливке оно предложит сохранить - сохраняем.)

Все, ардуина готова. Теперь проводками соединяем питание реле с пинами питания ардуины (плюс к плюсу, может называться +5v или Vcc, минус к минусу GND). А средние проводки к указанным выше пинам (на ардуине цифровые пины имеют пометку D, т.е. к  D5 и D6), выделенным красным (можно их поменять)
Устройство готово. Запитываем Ардуину зарядкой от мобилки, подключаем реле в разрыв проводов наших устройств, наслаждаемся.

Пример.
Нам нужно включать свет на 12 часов в 8 утра (свет на реле 1), кроме того нам нужно включать помпу каждые два часа на 5 минут (помпа на реле 2).
Тогда верхняя часть программы будет выглядеть так (меняем только то, что выделено красным)
int pin1 = 5;                             
unsigned long freq=1440;           // Периодичность цикла 1 сутки, следовательно ставим 1440 минут
unsigned long dlit=720;              //длительность работы 12 часов, т.е. 720 минут
unsigned  long freq_last_time;

int pin2 = 6;                                                         
unsigned long freq2=120;                                     //периодичность цикла 2 часа, или 120 минут
unsigned long dlit2=5;                                        //длительность работы 5 минут
unsigned long freq_last_time2;

В 8 утра выключаем и включаем ардуину (рестартуем её), это нужно чтобы суточный цикл начал отсчитываться с 8 утра (поскольку ардуина работает у нас без модуля часов реального времени на внутренем таймере). Все, работа началась. Раз в месяц желательно рестартовать ардуину (это связано с ограничем емкости внутреннего таймера 50 суток)

2
Турнирная таблица:


И не забываем пункт правил:
Как только у вас наступило одно из указанных событий, делаете фото и сразу же выкладываете в тему "Зимний перцебатл - 2017. Номинации".
Т.е. чтобы получить медальку, нужно выложить фото своего события в эту тему. Все остальное можно в своих темах.
Сделано это с целью избежать путаницы (участников много, выискивать по всем темам у кого там чего первым случилось, очень сложно).
Просьба не флудить в этой теме, здесь будет только хронологический порядок событий.

3
Ну, продвинутый - конечно громко сказано, просто чуть сложнее, чем простое клацанье релюхами и отображение температуры.
Решил я для баттла чуть переделать свой коллайдер, и поскольку там будет добавлено несколько плюх, требующих для своей реализации дополнительных пинов (а они уже кончились на Wemos), то решил сделать его на связке Arduino Mega + Wemos (как вариант, можно было на сдвиговых регистрах расширить пины), первая будет все замерять и управлять, второй - только взаимодествовать с пользователем и сервером для отображения информации и управления.
В принципе для меня здесь будет мало что нового, просто переделка старых наработок, но поскольку некоторые просили подробностей (в частности alex_step подобное тоже собирается делать), то постараюсь подробно описать все этапы.

Для совсем новичков сразу оговорюсь, что ардуиновский скетч можно условно разделить на 4 части:
А. Включение библиотек и объявление необходимых переменных.
В. Функция Setup. Выполняется один раз при включении.
С. Функция Loop. Выполняется после Setup бесконечно (как только выполнилась 1 раз, начинает выполняться заново).
D. Пользовательские функции.
Следовательно, если мы добавляем в скетч очередную плюху, то изменения нужно вносить во все 4 части, как правило. Следовательно и добавление плюх я тоже буду описывать исходя из этих частей: A, B, C, D.

Еще пару ремарок.
1. Названия переменных стараемся даватm такие, чтобы через 3 года глянув на скетч мы сразу же понимали, что делает эта переменная. Да, они могут быть длинными, но читабельность кода , особенно через прошедшее время, увеличивается значительно.
2. В Loop у меня всегда содержится только перечень вызываемых функций, чтоб глянув на него, сразу было понятно, что в программе происходит. Выглядит это так:

long data_last_time;
//========================================================
void setup() {
}
//========================================================
void loop() {
   Data(1000);                  //вызываю функцию Data с параметром, обозначающим промежуток времени в мс, через которые эта функция должна выполняться. В данном случае 1 раз в секунду.
}
//========================================================
void Data(float freq){
  if ((millis()-data_last_time)>freq){       
      //
      // здесь тело функции
      //
      data_last_time = millis();
  }
}

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

Пара слов о ТЗ:
1. Управление релюхами света (4-5 штук)
2. Управление твердотельным реле помпы (1 штука)
3. Климат (температура, влажность, давление, температура раствора)
4. Управление 12-вольтовым вентилятором вытяжки с ШИМ.
5. Подогрев раствора с ШИМ.
6. Отправка статистики на сервер
7. Отображение статистики в приятном глазу виде с графиками.
8. Управление через Веб-морду Вемоса.
9. Прога на Андроиде (опционально)

Итак, поехали.





5
Перцебатл / Зимний перцебатл - 2017
« : 14 Сентябрь 2017, 16:43:32 »
Друзья, тут вот начали поступать сигналы по поводу следующего баттла, зимнего в смысле.
Хотелось бы услышать мнения по следующим вопросам:
1. Будем ли проводить?
Наберется ли достаточное количество участников (больше нуля) ? Напишите, хотели бы вы участвовать?
2. Время.
Когда старт, какая продолжительность. Нужно ли будет стараться успеть закончить до начала летнего или может сделаем внахлест? На подготовку нужно до месяца, т.е. раньше середины октября всё равно не начнем. Какая продолжительность? 4 месяца, как и в прошлый раз? Или больше?
3. Пожелания к сорту.
Тут есть несколько мыслей:
- какой-нибудь мелкий аннуум, чтоб под лампу влез и быстрее отплодоносил (ну, наверное, желательно съедобный);
- что-нибудь жутко редкое и проблемное
- что-нибудь гигантское, но поставить условие его обрезать, чтоб высота не превышала скажем 40см. Бонсай-баттл короче.
- заранее всем известный сорт, например jalapeno....?

Какие мысли, пожелания, хотения, высказывайте, не стесняйтесь, ветка всё стерпит :)

6


В этой теме будет отображаться учет номинаций (символических и max-номинаций).

Для получения медали и баллов за символические номинации необходимо выложить в эту тему фото результата с обязательной пометкой на какую номинацию претендуете (мы не телепаты, а по фото не всегда можно определить, что там).

Свои заявки (или промежуточные результаты) на max-номинации тоже оставляем в этой теме.

Просьба не захламлять тему обсуждениями, здесь только посты с результатами.

7
Голосование первое.
10 марта, 1 месяц от старта.




Состав жюри:
Locomatic
kimmer
Ewa
Nav5000
nimoff
Olivka
ksvl

8
Рассказ PowerTech заставил немного по-другому взглянуть на ESP8266, до этого она у меня стояла лишь как приставка к Arduino Mega, служила только для передачи данных на сервер.
Вообще название темы конечно диковато звучит, напоминает фразу "из пушки по воробьям". Но оказывается "пушка" стоит сейчас дешевле рогатки (цена ESP8266 сейчас на уровне простейших Ардуин, немногим больше 2 у.е.).
И создать проращиватель семян это скорее третьестепенная задача. В первую очередь мне хотелось поковырять немного её, запустить на ней сервер, да плюс гекконша снесла яйца, нужно срочно делать для них инкубатор. И только затем уже проращиватель, что по большому счету тоже очень полезная штука, поскольку у меня практически ни одно проращивание не проходит без "случайностей", вечно не знаешь куда притулить семена, то на печку, то на теплый пол, то на батарею, то накроешь, то перебор. В общем нет у меня в квартире места с нужной стабильной температурой. Поэтому от проращивателя явно не откажусь. :)

Итак, вот герой обзора. Это Wemos D1 mini, по сути это та же ESP8266, только уже со стабилизатором питания, программатором CH340, разъемом для подключения к компу. Никаких головняков.


Программирую в Arduino IDE, мне так привычнее. Вот статья по настройке среды для ESP8266, ничего сложного.
Вот простейший скетч для поднятия сервера на ней.
Подключаем библиотеки
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
Вводим параметры сети либо для подключения к роутеру в режиме "клиент" (его параметры) либо для создания своей точки доступа в этими параметрами.
const char* ssid = "Incubator";
const char* password = "11111111";
Объявляем сервер. здесь важно объявить сервер библиотеки именно ESP8266WebServer.h. Сервер можно сделать и с библиотекой ESP8266WiFi, но с ним я намучался, то виснет, то связь пропадает, а вот с ESP8266WebServer.h работает очень стабильно, ни разу зависаний не было, пару раз пропадала связь, но то возможно из-за роутера, после перезагрузки роутера, связь налаживалась.
ESP8266WebServer server(80);
Далее идут функции обработки запросов, которые будут поступать на сервер.
Это функция при попадании на главную страницу сервера, т.е. если в браузере в главной строке введем 192.168.0.13. В ответ сервер посылает код успеха "200", тип ответных данных "text/html", в char temp можно записать любую html-страничку

void handleRoot() {
  char temp[2000];
  server.send(200, "text/html", temp);
}
Обработка "непонятного серверу" запроса. Ошибка 404.
void handleNotFound(){
  String message = "404. Not Found\n\n";
  server.send(404, "text/plain", message);
}
Обработка запроса с параметром /data. Т.е. если в браузере наберем 192.168.0.13/data, то в ответ сервер выдаст не страницу, а просто строку с данными. В данном случае с текущим временем. Удобно для обращения не из браузера, а из, например, программы Андроид-телефона.
void handleData() {

  String s = (String)millis();
  server.send(200, "text/plain", s);
}
Обработка запроса с параметром /set. Аргументы пишутся в таком виде 192.168.0.13/set?temp=30. В данном случае, если наберем в браузере такую строку, то переменная set_temp установится в значение 30. Т.е. мы будем управлять устройством, отдавать команды

void handleSet() {
  String a = server.arg(0);
  if(server.argName(0) == "temp") {
    set_temp = a.toFloat();
    }
  server.send ( 200, "text/plain", "Ok!" );
   }

void setup(void){
А вот здесь идут два блока.
Если написатьэтот, то ESP8266 подключится в качестве клиента к Вашему роутеру.

  WiFi.begin(ssid, password);
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
А если этот, то ESP8266 создаст точку доступа (вроде как сам станет роутером) и можно будет подключиться к нему напрямую с телефона.
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print(myIP);

А здесь уже настройка сервера, назначаются функции, описанные выше (они должны идти перед стартом сервера) на разные запросы.  
  server.on("/", handleRoot);
  server.on("/data", handleData);
  server.on("/set", handleSet);
  server.onNotFound(handleNotFound);
Старт сервера
  server.begin();
}

В главный цикл нужно добавить одну функцию, которая и будет выполнять все задачи.
void loop(void){
   server.handleClient();
  }

Теперь ближе к устройству
Вот такая платка получилась. Датчик температуры LM335 через делитель напряжения на аналоговый вход. Управление печкой через MOSFET-транзистор (от 12 вольт). На качество не обращайте внимания, почти всё паяла дочка (9 лет), почему-то ей это нравится.


Сделали так, чтобы Wemos можно было легко снять, инкубатор нужен по сути только несколько раз в год, а Wemos ковырять хочется всегда :)

Сама "печка". Просто нихромовая проволока, наклеенная на кусок ДСП. Температура не высокая, сильно не греется, максимум до 40 градусов.


Теперь к интерфейсу. При заходе на главную страницу сервера Wemos выдает мне вот такую простенькую html-страничку

Первая строка - установленная температура, справа поле и кнопка для её изменения.
Вторая - реальная температура, справа поле для коррекции показаний. Если например видим, что датчик немного завышает температуру, то вводим в поле -0.7 и нажимаем кнопку. Температура будет отображаться уже с поправкой.
Третья - мощность работы печки. В программе с помощью ШИМ-модулятора сделал возможность её регулировать. Например, если в конкретных условиях она избыточна, то можно уменьшить, чтоб не было больших перепадов температуры и она более плавно поддерживалась.
Четвертое - время с момента старта.
Все настройки сохраняются в  EEPROM, при перезагрузке ничего не сбивается.
Работает очень чётко, поддерживает температуру с точностью до 0.1 градуса.
Вот полный скетч, кому интересно
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>

const char* ssid = "DIR-615";
const char* password = "11111111";

ESP8266WebServer server(80);

const int led = 2;
const int pin_pechka = 13;


float set_temp = 28.0;
float real_temp = 30.5;
float correct_temp = 0;
int power = 100;
float array[10];
int ind = 0;

long last_ti;

//****************************************************************************************


void handleRoot() {
  char temp[2000];
  get_html(temp);
  server.send(200, "text/html", temp);
}

void handleNotFound(){
  String message = "404. Not Found\n\n";
  server.send(404, "text/plain", message);
}

void handleData() {
  String s = (String)millis();
  server.send(200, "text/plain", s);
}

void handleSet() {
  String a = server.arg(0);
  if(server.argName(0) == "temp") {
    set_temp = a.toFloat();
    EEPROM.write(0, (int)set_temp);
    EEPROM.write(1, (set_temp-(int)set_temp)*10);
    EEPROM.commit();
    }
  if(server.argName(0) == "correct") {
    correct_temp += a.toFloat();
    EEPROM.write(2, correct_temp*10+100);
    EEPROM.commit();
    }
  if(server.argName(0) == "power") {
    power = a.toInt();
    EEPROM.write(3, power);
    EEPROM.commit();
  }
  server.send ( 200, "text/plain", "Ok!" );
  
}
//****************************************************************************************
//****************************************************************************************


void setup(void){
  pinMode(led, OUTPUT);
  pinMode(pin_pechka, OUTPUT);
  pinMode(A0, INPUT);
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  Serial.println("");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
/*
  WiFi.softAP(ssid, password);
  IPAddress myIP = WiFi.softAPIP();
  Serial.println("AP started:");
  Serial.print(myIP);
*/
  
  server.on("/", handleRoot);
  server.on("/data", handleData);
  server.on("/set", handleSet);
  server.onNotFound(handleNotFound);

  server.begin();
  Serial.println("HTTP server started");

  EEPROM.begin(10);
  set_temp = EEPROM.read(0) + EEPROM.read(1)/10;
  correct_temp = EEPROM.read(2)/10 - 10;
  power = EEPROM.read(3);

}

//**********************LOOP**************************************************************
//****************************************************************************************


void loop(void){
  long t = millis();
  server.handleClient();
  
  if((t-last_ti)>1000){
    float y = ((((float)analogRead(A0) / 1023) * 3.3) * 100)-267;
    array[ind] = y;
    ind++;
    if(ind>9) ind=0;
    float summ = 0;
    for(int n = 0; n<10; n++){
      summ += array[n];
    }
    real_temp=summ/10;
    real_temp += correct_temp;
    Serial.println((String)real_temp);
    last_ti = t;
    }

  int p = power*2.55;
  if(real_temp<set_temp){
    analogWrite(pin_pechka, p);
    digitalWrite(led, 0);
  
  }else {
    analogWrite(pin_pechka, 0);
    digitalWrite(led, 1);
    
    }
  
}

//****************************************************************************************
//****************************************************************************************

void get_html(char *s){

int sec = millis() / 1000;
int min = sec / 60;
int hr = min / 60;
char set_temp_c[10];
dtostrf(set_temp,4, 1, set_temp_c);
char real_temp_c[10];
dtostrf(real_temp,4, 1, real_temp_c);



snprintf ( s, 2000,
"<html>\
<head>\
  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\
  <title>Инкубатор</title>\
  <style type=\"text/css\">\
    body {background-color:#565145}\
    #glav{width: 500px;margin: 50px auto;font-size: 180%;font-family: sans-serif;text-align: center;}\
    .block{width: 100%;height: 70px;margin-top: 10px;padding-top: 10px;background-color: #37434B;box-shadow: 0px 0px 5px #000000;}\
    .podpis{float: left;text-align: left;color:#111111;width: 45%;margin-top: 10px;margin-left: 10px;}\
    .data{width: 20%;float: left;font-size: 150%;text-shadow: 1px 1px 3px #000;}\
  </style>\
</head>\
<body>\
  <div id=\"glav\">\
    <div class=\"block\">\
      <div class=\"podpis\">Set temp:</div>\
      <div class=\"data\" style=\"color: #66D110\">%s</div>\
      <input id=\"inp_temp\" type=\"text\" size=\"2\">\
      <button style=\"background-color: #E26408; border-radius: 10px\" onclick=\"document.location.href = 'http://192.168.0.13/set?temp='+ document.getElementById('inp_temp').value;\">Set</button>\
    </div>\
    <div class=\"block\">\
      <div class=\"podpis\">Real temp:</div>\
      <div class=\"data\"  style=\"color: #EE710C\">%s</div>\
      <input id=\"cor_temp\" type=\"text\" size=\"2\">\
      <button style=\"background-color: #E26408; border-radius: 10px\" onclick=\"document.location.href = 'http://192.168.0.13/set?correct='+ document.getElementById('cor_temp').value;\">Set</button>\
    </div>\
    <div class=\"block\">\
      <div class=\"podpis\">Power:</div>\
      <div class=\"data\" style=\"color: #E5E200\">%d\%</div>\
      <input id=\"inp_power\" type=\"text\" size=\"2\">\
      <button style=\"background-color: #E26408; border-radius: 10px\" onclick=\"document.location.href = 'http://192.168.0.13/set?power='+ document.getElementById('inp_power').value;\">Set</button>\
    </div>\
    <div class=\"block\">\
      <div class=\"podpis\">Time:</div>\
      <div class=\"data\"  style=\"color: #75718F; font-size: 80%; margin-top: 15px\">%d:%02d:%02d</div>\
    </div>\
  </div>\
</body>\
</html>",
set_temp_c,real_temp_c,power,hr, min % 60, sec % 60
);


  
  
  }

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


Да, и чуть не забыл, олово и флюс, использованное в проекте, от kido, за что ему мерси.  :)

10
Перцебатл / Летний перцебатл - 2017. Ann
« : 09 Февраль 2017, 17:19:47 »
Ждем

11



Вы можете выбрать 1 или 2 участников.
Голосуйте внимательно, менять голоса нельзя.
Голосование длится два дня. Всё равно оно ничего не меняет, и чтоб успеть закруглиться полностью с этим батлом до начала следующего.
Фото отмасштабированы так, что 1 мм реального размера соответствует 15 пикселям фотографии. Фото Nebulove не отмасштабировано, конкурсное фото он не выложил, поэтому взял последнее из его темы, а по нему нельзя установить масштаб.

12
Давненько я ничего не кодил, захотелось вдруг чего-нибудь наваять. Наваял.
Это калькулятор растворов. От множества имеющихся в рунете калькуляторов его отличает две особенности:
1. Подбирать состав можно ползунками, что удобнее, нагляднее и приятнее.
2. Есть функция автоматического составления рецепта раствора. Вы вводите имеющиеся у Вас удобрения, выбираете состав, который желаете получить из них, и нажимаете кнопку. Калькулятор автоматически подбирает максимально близкий рецепт к желаемому, который только возможно получить из имеющихся у Вас удобрений.

Как пользоваться:

1. Посредине окна пять блоков для ввода удобрений. Соответственно ввести можно до 5 удобрений. Вводим состав удобрения, написанный на упаковке или в выпадающем списке выбираем одно из предустановленных (там я забил самые популярные). Внимание! Данные должны вводиться в виде процентного содержания оксидов, т.е. так, как написано на упаковке. Написано 3-11-38, именно эти цифры и вводим (они обозначают 3% азота, 11% Р2Р5 и 38% К2О), если будете отдельно вводить кальций, магний, то вводить нужно содержание оксидов, а не чистых элементов.

2. Слева вверху блок, где можно поставить галочки "игнорировать кальций, магний", т.е. при автоматическом расчете рецепта программу не будет интересовать, сколько там получилось кальция и/или магния. Это актуально для земельщиков, поскольку в земле этих элементов с лихвой, и необходимости их добавлять чаще всего нет. Для гидропонщиков, конечно же, их игнорировать нельзя.

3. Слева ниже - можно выбрать желаемую точность. По умолчанию рецепты составляются с шагом в 0.1 грамма, при желании можно выбрать другой шаг. Но должен предупредить, что в случае выбора самой высокой точности 0.01 грамм и всех 5 удобрений расчет может занимать несколько секунд для слабых компьютеров, и даже на старых компьютерах может привести к вылету браузера. Например, в Firefox контейнер для плагинов может подумать, что это завис какой-то из плагинов, и принудительно закрыть программу. В Хроме и Опере работает без проблем даже на самой высокой нагрузке. Поэтому в случае возникновения проблем либо снизьте точность, либо попробуйте в другом браузере.

4. Справа вверху блок выбора желаемого состава. Можно нажать на кнопки "вега", "цвет", "плод", чтобы выбрать рекомендованный состав, можно подкорректировать его, либо вбить с нуля.

5. Справа красная кнопка автоматического расчета. Если выбрали свои удобрения и желаемый состав - можно нажимать.

6 Справа внизу блок с отображением результата расчета, т.е. насколько он был успешен и насколько максимально близкая комбинация близка к желаемому составу. Отображается в виде процентов, и добавлено текстовое описание для новичков.

В Internet Explorer калькулятор будет отображаться некорректно, подстраивать калькулятор под него довольно муторное занятие, и делать это для 3% его пользователей пока желания нет, извините.

Отдельное спасибо vadkoff и kido за конструктивную критику и советы.

Критикуйте, не стесняйтесь, может какие баги или пожелания будут - пишите.

Вот и ссылка:


13
Перцебатл / Летний перцебатл - 2017
« : 06 Январь 2017, 19:55:45 »
Итак, Джиз уже получила семена для следующего перцебатла, поэтому пора уже приступать к обсуждению, тем более март уже, что называется, на носу.

Во-первых, кто желает принять участие, обозначьте себя. Достаточно указать желаемое время начала и страну, ну и условия выращивания интереса ради (открытый грунт или комнатное выращивание).

И нужно обсудить следующие моменты:
1. Ну время начала разумеется. Предлагаю начало марта.
2. Длительность, всё-таки летний батл, можно выращивать хоть до октября, а это 8 месяцев. Так сколько, может 6 месяцев?
3. Делать подкатегории комнатные/огородники ?
4. Оценивание. В принципе текущая система номинаций мне понравилась, можно было бы её расширить, чтоб динамичнее было, ну там, первая десятая завязь, первый десяток спелых, количество завязей по состоянию на какой нибудь момент и т.д.
5. Голосование. А вот тут первый перцебатл показал, что большинству это мало интересно. Поэтому предлагаю выбрать человека 3 опытных перцевода с форума в качестве жюри, пускай голосуют они, так будет объективнее, мне кажется, и, во-вторых, можно будет четче ранжировать участников, а это немаловажно. Текущая система этого не позволяет.
6. Проблема Азията. Человек воспользовался добротой, получил семена и пропал. Как в будущем это предотвратить? Для новичков устраивать допрос с пристрастием в личке ? )))

Семок не много, по 2-3 каждому получится.

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



14



Вы можете выбрать 1 или 2 участников.
Голосуйте внимательно, менять голоса нельзя.
Голосование длится неделю.
Фото отмасштабированы так, что 1 мм реального размера соответствует 10 пикселям фотографии.

15



Вы можете выбрать 1, 2 или 3 участников.
Голосуйте внимательно, менять голоса нельзя.
Голосование длится неделю.
Фото отмасштабированы так, что 1 мм реального размера соответствует 10 пикселям фотографии.

16


Вы можете выбрать 1, 2 или 3 участников. Голосуйте внимательно, менять голоса нельзя.
В голосовании 7 участников, а фото представили только четверо. Надеемся, что остальные присоединятся позже в процессе голосования. Если не видите фото участника - не голосуйте за него.
Голосование длится неделю.
Фото отмасштабированы так, что 1 мм реального размера соответствует 10 пикселям фотографии.

17

18
Разрожусь еще одной темой. В принципе она является продолжением этой, но учитывая другое железо и задачи выделю в отдельную.
Благодаря kido у меня изменилось представление о правильном интерфейсе Ардуино, за что ему громадное спасибо.
В общем полез я в интернеты искать Wi-Fi модуль для своей меги и вижу, что на рынке из дешевых только различные вариации ESP8266. Но стал изучать как их подключать и программировать - голова закипела, большинство советуют прошивку NodeMCU программирование на языке Lua, чего мне крайне не хотелось - знакомиться с новым языком и средой программирования ради отправки пары строчек на сервер.
И набрел на вот такую штуку, брал там же. В принципе это то же самый ESP8266, но уже распаянный, с программатором на борту (340-й), microUSB-входом, стабилизатором питания и практически за ту же цену, программировать можно а Arduino IDE.
Что имеем:
1. частота 80 или 160 MHz, в отличие от Меги, где только 16.
2. Память 4 Mb, у меги 256кб
3. Оперативка 80кб, у меги 4.
4. И самое главное вайфай, которого у меги нету.
5. Единственный минус - меньше выводов, но на крайний случай можно их увеличить, к примеру так
В общем имеем на порядок (в прямом смысле - в 10 раз) более мощное устройство, но в разы дешевле и компактнее. Ресурсов хватает уже для запуска почти полноценного сервера, типа такого.
Все это счастье всего за 4 у.е., т.е. в 2.5 раза дешевле Меги.

Для понимания - по сути это не просто WiFi модуль, а полностью отдельная Ардуина, которая может выполнять свои задачи, и лишь помогать моей Меге передавать данные на сервер.
Подключается довольно просто, чем меня разочаровала  :) Я выделил целый вечер для борьбы с ней, а она с полпинка практически с первого идущего в комплекте с библиотекой примера, немного подкорректированного под свои нужды, стартанула. Нерастраченую энергию пришлось потратить на переукладку и перепаивание проводов вокруг Меги, там у меня уже добротный бардак образовался.
Вот скетч отправки данных на сервер:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
ESP8266WiFiMulti WiFiMulti;
const uint16_t port = 80;
const char * host = "anndrew.tk";
void setup() {WiFiMulti.addAP("SSID", "password");} //название сети и пароль вайфая
void loop() {
WiFiClient client;
client_status = client.connect(host, port);
String url =                                                            //здесь формируем строку с GET-запросом
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                   "Host: " + host + "\r\n" +
                   "User-Agent: ESP8266\r\n" +
                   "Connection: close\r\n\r\n");
client.stop();}
Вот и все премудрости. Конечно, следует добавить таймер.
Программирование его идентично обычной Ардуине, здесь подробно изложено, лично я столкнулся с одной проблемой: старая добрая конкатенация строк с помощью плюсов, типа x="Hello " + "world"; почему-то дает ошибку. Приходится делать либо x.concat() либо постепенно наращивать x+= "world";.
И некорректно отображается количество флеш-памяти, об этом разработчики знают и предупреждают.

Пока передаю на сервер только информацию, а управляю с телефона по Блютузу.
Можно управлять и интернету, но тут есть нюансы, есть два пути:
1. При отправке данных на сервер возвращать Ардуине команды. Просто, но команда поступит не сразу, а только когда Ардуина подключится к серверу.
2. Делать свой сервер на Ардуине, но намного сложнее и нужен статический IP.

Пока сделал отображение основной информации, остальное позже, дополнительно отпишусь.
Вот приборная панель моего коллайдера, по состоянию на текущий момент. Извиняйте за внешний вид, дизайнер из меня никакой. По нажатии на графики открываются большие, более подробные. Шкалы автоматически подстраиваются под минимальное и максимальное значения. Пока в тестовом режиме, позже будут суточные.
Использовал библиотеку Highcharts, до это пробовал еще библиотеку от Гугла, но там настолько идиотская документация (основные настройки разбросаны по разным разделам, нужно потратить кучу времени, что до кучи все собрать), что сразу ее отбросил, а по большому счету они практически одинаковы.
Единственная проблема, с которой столкнулся - периодически появляются левые данные. Ну допустим, ожидается температура 23 градуса, а на сервер попадает 6645, не часто, примерно раз в 100 раз, на разных датчиках, досконально не разбирался, но грешу на преобразователь логических уровней (Wemos логика работает на 3.3В, а Мега на 5В, поэтому, чтоб не спалить первый, сигнал от Меги идет через этот преобразователь, обратно без него, Мега и 3.3В прекрасно понимает). Сначала думал, что питание (Wemos в пике может до 300 мА жрать), кинул конденсатор 3300 мF на шину питания, не помогло, зато датчики точнее стали работать :)
В общем не стал разбираться, а сделал медианный фильтр на Wemose (собираю 20 замеров в массив, сортирую по возрастанию, отсекаю 6 меньших и 6 больших, а из оставшихся беру среднее арифметическое). И глюки пропали и показания более стабильны стали.
С Мегой соединял по Serial.
На сервере данные заношу и беру для построения графиков из MySQL.
Вроде все рассказал.



19
Перцебатл / Перцебатл-2016. Ann
« : 18 Сентябрь 2016, 00:08:31 »
Замочил в 18:30 по стандартной технологии в пищевом контейнере на ватных дисках.
Единственное, раньше на теплом полу проращивал, но когда пошел ставить - оказывается с лета его еще не включали, а прогревается он долго. Поэтому положил на электропечь (стеклокерамика), накрыл полотенцем, и примерно раз в полчаса включал на три секунды, пока температура градусов до 45 не поднималась (пальцем мерял), затем остывало до примерно 30. Поэтому получилось несколько волн 45-30-45. Сейчас уже на теплый пол перенес.
Аналогично делать буду все честно и ничего не скрывать.

20
Давно меня терзали мысли перевести интерфейс (отображение информации и управление) Ардуины в Андроид-телефон, уж больно он разросся, но как подумаешь, что для этого Java штурмовать придется, желание делать это как-то сразу пропадало.
И вот на днях набрел случайно на совершенно потрясную штуку - MIT App Inventor 2.
Написание Андроид-программы для людей, совсем не знакомых с программированием. Очень похоже на хорошо мне знакомый Scratch (с дочкой занимаюсь).
Среда разработки - онлайн в браузере.
Как и во "взрослой" Android Studio, написание состоит из двух частей, в первом окне с помощью драг&дропа набрасываем компоненты, вторая - написание логики. Просто до неприличия.
В общем стряхнул я пыль с давно валявшегося HC-05 уже практически через полчаса в телефон пошла первая информация с Ардуины.
Подключается он по Serial, все стандартно, передаю данные с Ардуины в таком виде:
<24.5, 40, 200, 14:10:08, 12, 10, 1, 1>
Данные, разделенные запятыми, т.н. CSV-формат. Температура, влажность, текущее время, люксы, количество часов красных диодов, и то же для синих, включен ли красный, и синий. Ну и по краям символы начала и конца строки, чтоб можно было проверить ее целостность.
Сначала накидали компонентов:


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


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


Поскольку полученные данные могут быть повреждены, в функции trim_start делаем простейшую проверку (проверяем наличие символов начала и конца строки, чтобы символ начала шел впереди символа конца)
Разбиваем строку на элементы и наполняем ими массив data_list.


И затем раз в секунду разносим наши данные по нужным компонентам (в температуре и влажности вычисляем угол поворота стрелки)


Ну и параллельно проверяем и меняем состояние кнопок (включено/выключено, ставит соотв. картинку).


Отправлять данные в Ардуину будем в следующем формате:
R_12>
Первый символ, что именно меняем (R-для красных диодов, B-для синих, T-для времени).
Вот к примеру для красных (формируем строку для отправки и выставляем флаг transmit, показыающий, что есть что оправить):


Собственно отправка:


Теперь принимаем их в Ардуине:
    char reb_array[20] ;
    int lll=0;
    while (Serial1.available() > 0) {  //если пришли данные
      reb_array[lll]=Serial1.read(); // считываем байты и заполняем ими массив reb_array
      lll++;
    }

Далее парсим строку и в зависимости от первой буквы меняем нужные переменные:
    char * pch;
    pch = strtok (reb_array,"_");
    String pp = (String)pch;
    if(pp == "R"){ pch = strtok (NULL, ">");
                  String r1=(String)pch;
                  time_red_duration = r1.toInt();}
    if(pp == "B"){pch = strtok (NULL, ">");
                  String r1=(String)pch;
                  time_blue_duration=r1.toInt();}

Вот итоговый вид программы (пока сделал только основное, мелоча потом добавлю):

Сверху два "спидометра" температуры и влажности, ниже люксометр, далее кнопки красных и синих диодов (выполняют три функции: 1 - показывают включены или нет, 2-текущий режим, 3-при нажатии принудительно включают/выключают их). Ниже время, далее слайдеры установки режима работы диодов. И в самом низу кнопка установки времени на Ардуине, т.е. его синхронизации со временем телефона (у меня сгорел модуль часов, поэтому после каждого включения приходилось вручную его устанавливать, теперь я лишен этой "радости").

В общем архиудобная штука, теперь нет необходимости тулить громоздкое каскадное меню для отображения и управление (они уже сейчас занимают около 60% кода в Ардуине), намного удобнее, можно проверять, управлять дистанционно, значительно красивше, здорово экономит время при написании кода, возможно деньги (управляющие элементы и дисплей теперь не обязательно покупать и тулить к устройству), громадный простор для фантазии (построение графиков, передача в интернет, сложная логика на стороне телефона и т.д. и т.п.). И на удивление о такой интересной штуке довольно мало информации в интернете. Надеюсь кому пригодится, здесь уже не только я Ардуиной страдаю :)

Страницы: [1] 2