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

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


Сообщения - Ann

Страницы: [1] 2 3 ... 76
1
Искусственный климат / Re: Субстраты
« : 12 Декабрь 2017, 22:41:42 »
У нас, в Самаре, кокос выходит примерно по 10р за литр готового субстрата, уголь даже покупной выходит около 5р за литр, вот и хотелось сэкономить, проявить изобретательность и сделать открытие  :D
Поищите в 5-килограммовых брикетах, там цена около 5$, в пересчете на готовый субстрат в районе 5руб/л получится.

2
Искусственный климат / Re: Субстраты
« : 12 Декабрь 2017, 22:09:51 »
Главная причина - экономия кокоса, вторая - ну, вроде как антисептик и возможно предупредит какие-никакие болячки.
А что там его экономить, он же дешевле земли стоит, древесный уголь поди не дешевле обойдется. Смысл гидропоники - выращивать в химически нейтральном субстрате, а питание регулировать уже раствором. Уголь далеко не химически нейтрален.
По болячкам: в кокосе я сталкивался только с одной болячкой - грибным комариком. Не уверен, что уголь защитит от него.

3
Искусственный климат / Re: Субстраты
« : 12 Декабрь 2017, 22:01:06 »
А как насчет древесного угля? Ну или может делать его 1*1 с кокосом? У кого какие мысли, мнения?
У каждого действия должен быть смысл. В чем смысл добавления древесного угля?

4
У меня остался есдинственный вопрос.
Когда начинать кормить на кокосе? Где-то пишут, что после появления третьих настоящих листьев. Где-то - с появлением первых, но дозировка 20-30%. Где-то - сразу.

Если кокос промыт, то как быть? Там же полезных веществ не осталось.

Сейчас у всех повылазили уже настоящие листья в баттле, у меня же стоят думают... Сроки те же.
Особой разницы нет, можно вообще не кормить до 2-3 пары, можно сразу дать 20-30%. В земле они со старта получают 300% и ничего, растут.
По думающим баттловцам - температуру им под 30 сделайте, чтоб быстрее чухались. И не поливайте, пока горшок не полегчает.

5
вафля Вемоса в режиме точки или клиента?
Клиент

6
т.е. можно эту и следующую строки собрать в одну?
Конечно

7
Перцебатл / Re: Зимний перцебатл - 2017. Ann
« : 12 Декабрь 2017, 00:37:47 »
То есть, вы как профессионал, рекомендуете замачивать семена в дистиллированной воде, брезгуя всякими селитрами, кипятками, эпинами, барботажами и прочими шаманствами?
Ну, я не профессионал, а всего лишь "инициативный любитель", и да, всегда замачиваю в чистой воде, главное для них условия (температура и воздух) в этот период, а не питание. Какая это вода (осмос или из-под крана) не принципиально.

8
Перцебатл / Re: Зимний перцебатл - 2017. Ann
« : 12 Декабрь 2017, 00:19:22 »
А осмосная вода и дистиллированная вода - это очень разные вещи?
Для гидропоники можно считать их тождественными понятиями.

9
Да просто пытался разобраться почему оно бред выдает да так и осталось.

10
Перцебатл / Re: Зимний перцебатл - 2017. Ann
« : 11 Декабрь 2017, 23:05:39 »
Тоже тянется:

11
Этап 26. Проблемы с утечкой памяти Wemos.
В интернете часто пишут о нестабильности работы ESP. У меня была та же ситуация, примерно каждые 12 часов Вемос ребутился. Пытаясь разобраться с проблемой, пришел к выводу, что причина в утечке памяти.
После загрузки глобальные переменные располагаются в т.н. статической памяти, которая находится внизу адресации. Выше нее идет динамическая память (её называют "куча"), которая динамически выделяется в ходе работы под определенные нужды. И в самом верху находится стек - в котором находятся все данные потока и который растет сверху вниз. Таким образом, при росте либо динамической памяти вверх либо стека вниз может случиться stack overflow - наползание стека на кучу, с затиранием друг друга и приводящей к неадеватному поведению (по нужным адресам уже хранятся другие значения переменных и т.д.) и дальнейшему зависанию или ребуту.
В принципе в ESP немало памяти и для простых задач должно хватать с головой. Но есть еще такое понятие как фрагментирование кучи. Суть в том, что память для определенной задачи выделяется только одним целым куском, и если например нам нужно увеличить строку на один символ, а память выше нее занята другой переменной, то Вемосу приходится выделять её в самом верху кучи, а этот кусок, где располагалась раньше строка, становится свободным. В итоге вся куча может превратиться в голландский сыр с кучей свободного места, но мелкими кусками, вследствие чего длинную строку расположить негде. Вот картинка, хорошо показывающая эту ситуацию:


Какой выход:
1. Экономим память. Нужно понимать, что все строки, указанные в скетче, загружаются в статическую память и хранятся там всегда, бессмысленно занимая полезную память. Например, безобидная служебная строка при старте программы
Serial.print("Программа стартовала");
Приводит к тому что строка "Программа стартовала" навсегда занимает память, хотя толку от нее никакого.
Поэтому нужно свести к минимуму все эти плюшки, а если без них не обойтись, то использовать PROGMEM - хранить строки во флеш-памяти, подгружая их при необходимости. Да, скорость немного падает, но все равно на работоспособность влиять не будет и визуально не заметите.
2. По максимуму отказаться от глобальных строк. Стараться использовать только локальные String, объявленные в функциях, т.к. они хранятся в стеке, а стек мало подвержен фрагментации и периодически, при каждом выходе из функции, очищается.
3. Стараться не использовать длинные строки, при росте длины строки риск фрагментации памяти растет по экспоненте. Если есть возможность, лучше отправить или напечатать строку маленькими кусками.
4. Если все же нужно использовать глобальную строку, то применять финт ушами: Объявлять её и сразу же выделять под неё память в статической памяти, т.к. вот так
String stroka = "0000000000000000000000000000000..."
Длина должна быть равна максимально планируемой длине, которая необходима для этой строки, можно с запасом. В этом случае, объявленная строка будет занимать место в статической памяти, там мы сможем её изменять, наращивать, главное не превышать объявленную в начале длину, поскольку в этом случае место под нее будет выделено уже куче, т.е. появится риск фрагментации.
Второй способ (я не пробовал, но теоретически должен работать) - перед использованием вручную выделить под строку место в куче с помощью string.reserve(size) , тогда по идее все трансформации со строкой будут происходить в пределах выделенного куска не приводя к фрагментации, главное не превышать выделенную длину.

Скетч для Wemos я почти полностью переписал и упростил.
Во-первых, сделал указанные финты ушами, чтоб предотвратить утечку памяти, Вемос отработал 110 часов без перерыва, вроде сработало.
Во-вторых, для приема данных с Меги использовал команду чтения строки до символа-терминатора, в итоге функция чтения информации из Меги свелась к одной строке
while (Serial.available() > 0) data_string = Serial.readStringUntil('>');
Передавать данные на сервер решил тоже одной строкой, а разбивать на данные уже на сервере.
server.send(200, s_plane, data_string + ',' + ESP.getFreeHeap());
Ну и прием и передача команд в Мегу тоже состоит из одной строки
for (uint8_t i=0; i<server.args(); i++){    Serial.print(server.argName(i)+'_' + server.arg(i) + '>');  }

Как видно, проще уже некуда, весь скетч на одну страницу влазит:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

String data_string ="0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
String url ="000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
String line = "00000000000000000000000000000000000000000000000000";
unsigned long command_last_time;

//********************************************************
const char s_zapros[] = "I_1>";
const uint16_t port = 80;
const char host[] = "collider.anndrew.ru";
const String s_get = "GET ";
const char s_url[] = "/data.php?data=";
const char s_reboot[] = "&reboot=";
const char s_count[] = "&count=";
const char s_memory[] = "&memory=";
const char s_zagolovok[] = " HTTP/1.1\r\nHost: collider.anndrew.ru\r\nUser-Agent: ESP8266\r\nConnection: close\r\n\r\n";
const char s_plane[] = "text/plain";

//*********Wi-Fi******************************************
const char ssid[] = "DIR-615";
const char password[] = "11111111";
ESP8266WebServer server(80);
unsigned long transmit_last_time;
int count_reconnect;


//******SERVER******************************************************************
void handleData() {
  server.send(200, s_plane, data_string + ',' + ESP.getFreeHeap());
}

void handleSet() {
  for (uint8_t i=0; i<server.args(); i++){    Serial.print(server.argName(i)+'_' + server.arg(i) + '>');  }
}


//========================================================
void setup() {
  Serial.begin(115200);
  Serial.setTimeout(150);
  WiFi.begin(ssid, password);
   
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());

  server.on("/set", handleSet);
  server.on("/data", handleData);
  server.begin();
 
}
//========================================================
void loop() {
  server.handleClient();
  Receive_from_Mega();
  Command_to_Mega(1000);
  Transmit_to_server(300000);
}
//========================================================

void Command_to_Mega(float freq){
  if ((millis()-command_last_time)>freq){
    Serial.print(s_zapros);
    command_last_time = millis();
  }
}

void Receive_from_Mega(){
  while (Serial.available() > 0) data_string = Serial.readStringUntil('>');
}

  //-------------------GET-запрос на сервер------------------------------
void Transmit_to_server (long freq){
   if((millis()-transmit_last_time)>freq){
       
        WiFiClient client;
        client.connect(host, port);
        url = String(s_get) + s_url + data_string + s_reboot + millis() + s_count + count_reconnect + s_memory + ESP.getFreeHeap() + s_zagolovok;
        client.print(url);
        url = "";

       
        delay(100);                                           //Получение ответа от сервера
        line = client.readStringUntil('>');                   //Читаем строку до >
        int i = line.indexOf('<');
        line = line.substring(i+1,line.length());
        Serial.println(line);
        if(line != "success") {
            count_reconnect++;
            WiFi.disconnect();
            delay(1000);
            WiFi.begin(ssid, password);
            }
        delay(10);
        client.stop();
 
    transmit_last_time = millis();
    }
}


12
Этап 25. Работа над ошибками. Мега
В ходе подключения и первых дней работы вылезло несколько ошибок и проблем, в связи с чем вносил изменения в схему. Попробую по памяти все их перечислить:
1. Питание. Я уже писал, что стабилизатор на Меге сильно грелся, т.к. кроме Меги через него мы питали еще и Вемос. После подключения модулей реле нагрев стал просто небезопасным, поэтому пришлось взять step down dc-dc преобразователь (модель уже не помню, мелкий, дешевый) и через него пустить на схему +5 вольт.
2.  tds_calibration = 1000 * o; выдает бред, а вот так нормально  tds_calibration = (long)1000 * o;
3. Была ошибка и неправильно высчитавлся флаг дня den
4. Расставил правильно пины реле освещения.
5. Переделал вычисление медианы. Сделал скользящую медиану (чтоб видно было изменение каждую секунду, ранее обновлялись раз в 20 секунд).
6. Отваливался датчик DHT-21, пока разбирался с причиной (оказалось плохо были коннекторы припаяны) перекинул его на другой пин вместе с питанием. Для питания заюзал два соседних пина Меги. Т.е. чтобы сделать из пинов землю и плюс, прописываем:
  pinMode(DHTPIN_plus, OUTPUT);
  digitalWrite(DHTPIN_plus, 1);
  pinMode(DHTPIN_minus, OUTPUT);
  digitalWrite(DHTPIN_minus, 0);

Разумеется это касается маломощных источников (менее 40мА). Датчик так и оставил на тех пинах, не стал возвращать назад после того как нашел причину.

Вроде бы все, может по мелочи еще что было, не помню уже. Вот окончательный скетч, который сейчас работает в коллайдере. Разумеется, там много мусора и есть еще что улучшать, но пока так.
#include <RTClib.h>
#include <Adafruit_BMP085.h>
#include "DHT.h"
#include <OneWire.h>
#include <EEPROM.h>

//***********BMP085***************************************
Adafruit_BMP085 bmp;
float baro_temperature;
float baro_pressure;
float baro_array[16];
int baro_array_index;

//******DHT-21*******************************************
#define DHTPIN_plus 10
#define DHTPIN 9
#define DHTPIN_minus 8
#define DHTTYPE DHT21
DHT dht(DHTPIN, DHTTYPE);
float DHT_temperature;                                           
float DHT_humidity;
float DHT_temperature_array[20];
float DHT_humidity_array[20];
int DHT_array_index;


//******Dallas*******************************************
OneWire  ds(27);
byte dallas_data[2];
byte addr[8] = {0x28, 0x95, 0x15, 0xAE, 0x8, 0x0, 0x0, 0x73};
long dallas_last_time;
boolean dallas_flag;
float DALLAS_temperature;
float DALLAS_array[10];
int DALLAS_array_index;

//************DS3231*************************************
RTC_DS3231 rtc;
int time_current_h;
int time_current_m;
int time_current_s;
String time_current_string;
int time_red_on;
int time_red_off=21;
int time_blue_on;
int time_blue_off;
int time_red_duration = 12;
int time_blue_duration = 8;
boolean den;
unsigned long rtc_last_time;

//************Carlson*************************************
int carlson_pin = 5;
int carlson_temperature = 30;
int carlson_night_power = 30;
int carlson_day_power = 50;
int carlson_extrime_power = 80;
int carlson_freq = 30;
int carlson_dlit = 5;
boolean carlson_flag = false;
long carlson_last_time;

//************Pechka*************************************
int pechka_pin = 6;
int pechka_rastvor_temp = 25;
long pechka_last_time;
boolean pechka_flag;

//************Pompa*************************************
int pompa_pin = 53;
long pompa_freq=60;
long pompa_dlit=5;
long pompa_last_time;
boolean pompa_flag = false;
boolean pompa_manual = false;

//************TDS*************************************
float tds = 0;                      //прочитанное значение из А10
int tds_1 = 0;
int tds_2 = 0;
float tds_volt = 0;               //в вольтах
float tds_res = 0;                //сопротивление
float tds_ppm = 0;                //ррм
unsigned long tds_calibration;
float tds_array[100];
int tds_array_index;
long TDS_last_time;

//************Svet*************************************
boolean red = 0;
boolean blue = 0;
boolean white = 0;
boolean manual = 0;

//************EEPROM*************************************
#define EE_RED_duration 0
#define EE_BLUE_duration 1
#define EE_POMPA_freq 2
#define EE_POMPA_dlit 3
#define EE_TDS_correct 4
#define EE_pechka 5
#define EE_C_temp 6
#define EE_C_np 7
#define EE_C_dp 8
#define EE_C_ep 9
#define EE_C_dlit 10
#define EE_C_freq 11

long klimat_last_time;
long data_last_time;
String receive_string;

//========================================================
//========================================================
void setup() {
  bmp.begin();
  rtc.begin();
  dht.begin();
  Serial.begin(115200);
  Serial1.begin(115200);
 
  pinMode(pechka_pin, OUTPUT);         //SLED
  pinMode(carlson_pin, OUTPUT);         //GND
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);

  pinMode(pompa_pin, OUTPUT);
  pinMode(DHTPIN_plus, OUTPUT);
  digitalWrite(DHTPIN_plus, 1);
  pinMode(DHTPIN_minus, OUTPUT);
  digitalWrite(DHTPIN_minus, 0);
 
  pinMode(A15, INPUT);                              //TDS-пины
  pinMode(49, OUTPUT);
  pinMode(51, OUTPUT);
  pinMode(A14, INPUT);

  pinMode(31, OUTPUT);                              //LED-пины
  pinMode(33, OUTPUT);
  pinMode(35, OUTPUT);
  pinMode(37, OUTPUT);
  pinMode(39, OUTPUT);
  pinMode(41, OUTPUT);

  time_red_duration = EEPROM.read(EE_RED_duration);
  time_blue_duration = EEPROM.read(EE_BLUE_duration);
  pompa_freq = EEPROM.read(EE_POMPA_freq);
  pompa_dlit = EEPROM.read(EE_POMPA_dlit);
  int o = EEPROM.read(EE_TDS_correct);
  tds_calibration = (long)1000 * o;
  pechka_rastvor_temp = EEPROM.read(EE_pechka);
  carlson_temperature = EEPROM.read(EE_C_temp);
  carlson_night_power = EEPROM.read(EE_C_np);
  carlson_day_power = EEPROM.read(EE_C_dp);
  carlson_extrime_power = EEPROM.read(EE_C_ep);
  carlson_freq = EEPROM.read(EE_C_freq);
  carlson_dlit  = EEPROM.read(EE_C_dlit);
 
}
//========================================================
//========================================================
void loop() {
  Klimat(2000);
  Receive_from_Wemos();
  Dallas(2000);
  Carlson();
  Clock(1000);
  Pechka();
  Pompa();
  TDS(1000);
  Rele();
}
//========================================================
//========================================================

void Klimat(float freq){
  if ((millis()-klimat_last_time)>freq){
    baro_array[baro_array_index] = bmp.readPressure()/133.322;
    baro_array_index++;
    if (baro_array_index > 15)baro_array_index = 0;
    baro_pressure = Mediana(baro_array, 16, 4);
   

    DHT_temperature_array[DHT_array_index] = dht.readTemperature();
    DHT_humidity_array[DHT_array_index] = dht.readHumidity();
    DHT_array_index++;
    if(DHT_array_index > 19)DHT_array_index = 0;
    DHT_temperature = Mediana(DHT_temperature_array, 20, 6);
    DHT_humidity = Mediana(DHT_humidity_array, 20, 6);
         
    //Serial.println( time_current_string );
    //Serial.println( "                                   baro: " + (String)baro_pressure);
    //Serial.println( "          " + (String)DHT_temperature + "gr " + (String)DHT_humidity+"%" );
    //Serial.println( "                   DALLAS_temperature - " + (String)DALLAS_temperature );
    //Serial.println("             tds_ppm:" + (String)tds_ppm );
    klimat_last_time = millis();
  }
}

//--------Часы---------------------------------------------------------
void Clock(int freq){
  if((millis()-rtc_last_time)>freq){
    DateTime now = rtc.now();
    time_current_h = now.hour();
    time_current_m = now.minute();
    time_current_s = now.second();
    time_current_string = (String)time_current_h + ":" + (String)time_current_m + ":" + (String)time_current_s;

    time_red_on = 21 - time_red_duration;
    time_blue_on = (21 - time_red_duration/2) - time_blue_duration/2;
    time_blue_off = (21 - time_red_duration/2) + time_blue_duration/2;

    if(time_current_h < 21 && time_current_h >= (21 - time_red_duration) ) {den=true; }
    else{ den = false;}
    rtc_last_time = millis();
  }
}

void Receive_from_Wemos(){
  while (Serial1.available() > 0) {         
    char incomig_char = Serial1.read();                          //прием строки
    receive_string += (String)incomig_char;
    if ((String)incomig_char == ">") {
      String stroka = receive_string;
      receive_string = "";
      Serial.println(stroka);
      stroka = stroka.substring(0,stroka.length()-1);
         
      String value[2];
      /*
      int index = 0;                                            //разбитие строки и занесение в массив
      char separator = '_';
      int strIndex[] = { 0, -1 };
      int maxIndex = stroka.length() - 1;
      for (int i = 0; i <= maxIndex; i++) {
        if (stroka.charAt(i) == separator || i == maxIndex) {
            strIndex[0] = strIndex[1] + 1;
            strIndex[1] = (i == maxIndex) ? i+1 : i;
            value[index] = stroka.substring(strIndex[0], strIndex[1]);
            index++;
        }
      }
*/
      int i = stroka.indexOf('_');
      value[0] = stroka.substring(0,i);
      value[1] = stroka.substring(i+1,stroka.length());
      //Serial.println(" value[0] " +  value[0]);
      //Serial.println(" value[1] " +  value[1]);
     
      if(value[0] == "Red"){
        time_red_duration = value[1].toInt();
        EEPROM.write(EE_RED_duration, time_red_duration);
      }

      if(value[0] == "Blue"){
        time_blue_duration = value[1].toInt();
        EEPROM.write(EE_BLUE_duration, time_blue_duration);
      }

      if(value[0] == "r"){
        red = value[1].toInt();
        manual = 1;
      }

      if(value[0] == "b"){
        blue = value[1].toInt();
         manual = 1;
      }

      if(value[0] == "w"){
        white = value[1].toInt();
         manual = 1;
      }

      if(value[0] == "m"){
        manual = value[1].toInt();
      }

      if(value[0] == "rastvor"){
        pechka_rastvor_temp = value[1].toInt();
        EEPROM.write(EE_pechka, pechka_rastvor_temp);
      }

      if(value[0] == "Ct"){
        carlson_temperature = value[1].toInt();
        EEPROM.write(EE_C_temp, carlson_temperature);
      }

      if(value[0] == "Cnp"){
        carlson_night_power = value[1].toInt();
        EEPROM.write(EE_C_np, carlson_night_power);
      }

      if(value[0] == "Cdp"){
        carlson_day_power = value[1].toInt();
        EEPROM.write(EE_C_dp,carlson_day_power );
      }

      if(value[0] == "Cep"){
        carlson_extrime_power = value[1].toInt();
        EEPROM.write(EE_C_ep, carlson_extrime_power);
      }

      if(value[0] == "Cf"){
        carlson_freq = value[1].toInt();
        EEPROM.write(EE_C_freq, carlson_freq);
      }

      if(value[0] == "Cd"){
        carlson_dlit = value[1].toInt();
        EEPROM.write(EE_C_dlit, carlson_dlit);
      }

      if(value[0] == "Pf"){
        pompa_freq = value[1].toInt();
        EEPROM.write(EE_POMPA_freq, pompa_freq );
      }

      if(value[0] == "Pd"){
        pompa_dlit = value[1].toInt();
        EEPROM.write(EE_POMPA_dlit, pompa_dlit);
      }

      if(value[0] == "Pflag"){
        pompa_flag = value[1].toInt();
        pompa_manual = 1;
      }
     
      if(value[0] == "Pm"){
        pompa_manual = value[1].toInt();
      }

      if(value[0] == "Th"){
        int hh = value[1].toInt();
        DateTime now = rtc.now();
        rtc.adjust(DateTime(now.year(), now.month(), now.day(), hh, now.minute(), now.second()));
      }

      if(value[0] == "Tm"){
        int mm = value[1].toInt();
        DateTime now = rtc.now();
        rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), mm, now.second()));
      }

      if(value[0] == "Ts"){
        int ss = value[1].toInt();
        DateTime now = rtc.now();
        rtc.adjust(DateTime(now.year(), now.month(), now.day(), now.hour(), now.minute(), ss));
      }

      if(value[0] == "calibration"){
        tds_calibration = tds_calibration * (value[1].toInt()/tds_ppm);
        int k = tds_calibration/1000.0;
        EEPROM.write(EE_TDS_correct, k);
      }

      if(value[0] == "I"){
        Send_to_Wemos();
        //Serial.println(" sEND to Wemos ");
      }
    }
  }
}

void Send_to_Wemos(){
 
    String stroka = "<";   
    stroka += (String)DHT_temperature + ","; 
    stroka += (String)DHT_humidity + ",";
    stroka += (String)baro_pressure + ",";
    stroka += (String)DALLAS_temperature + ",";
    stroka += (String)tds_ppm + ",";
    stroka += (String)time_red_duration + ",";
    stroka += (String)time_blue_duration + ",";
    stroka += (String)red + ",";
    stroka += (String)blue + ",";
    stroka += (String)white + ",";
    stroka += (String)manual + ",";
    stroka += (String)pechka_rastvor_temp + ",";
    stroka += (String)carlson_temperature + ",";
    stroka += (String)carlson_night_power + ",";
    stroka += (String)carlson_day_power + ",";
    stroka += (String)carlson_extrime_power + ",";
    stroka += (String)carlson_freq + ",";
    stroka += (String)carlson_dlit + ",";
    stroka += (String)carlson_flag + ",";
    stroka += (String)pompa_freq + ",";
    stroka += (String)pompa_dlit + ",";
    stroka += (String)pompa_manual + ",";
    stroka += (String)pompa_flag + ",";
    stroka += (String)time_current_h + ",";
    stroka += (String)time_current_m + ",";
    stroka += (String)time_current_s + ",";
    stroka += (String)pechka_flag + ">";
       
    Serial1.print(stroka);
}

//---------Dallas-------------------------------------------------------
void Dallas(int freq){
  if((millis()-dallas_last_time)>freq){
    ds.reset();
    ds.select(addr);
    ds.write(0x44, 1);
    dallas_last_time = millis();
    dallas_flag = true;   
    }
  if((millis()-dallas_last_time)>1000 && dallas_flag){
    ds.reset();
    ds.select(addr);   
    ds.write(0xBE);       
 
    dallas_data[0] = ds.read();
    dallas_data[1] = ds.read();
   
    int16_t raw = (dallas_data[1] << 8) | dallas_data[0];

    DALLAS_array[DALLAS_array_index] = (float)raw / 16.0;
    DALLAS_array_index++;
    if(DALLAS_array_index > 9) DALLAS_array_index = 0;
    DALLAS_temperature = Ariphmetic(DALLAS_array, 10);
   
    dallas_flag = false;
    }
 }

//---------Carlson-------------------------------------------------------
void Carlson(){
  if(den && DHT_temperature < carlson_temperature ){
    if(  (millis()-carlson_last_time)>(carlson_freq*60000) && !carlson_flag ){
      analogWrite(carlson_pin, (int)(carlson_day_power*2.55));
      carlson_flag = true;
      carlson_last_time = millis();
      }
    if(  (millis()-carlson_last_time)>(carlson_dlit*60000) && carlson_flag ){
      analogWrite(carlson_pin, 0);
      carlson_flag = false;
      }
   }

   if (den && DHT_temperature >= carlson_temperature && DHT_temperature < carlson_temperature+1){
     analogWrite(carlson_pin, (int)(carlson_day_power*2.55));
     carlson_flag = true;
    }

   if (den && DHT_temperature >= carlson_temperature+1){
     analogWrite(carlson_pin, (int)(carlson_extrime_power*2.55));
     carlson_flag = true;
    }
   
   if(!den){
    analogWrite(carlson_pin, (int)(carlson_night_power*2.55));
    carlson_flag = true;
    }
}

//---------Pechka-------------------------------------------------------
void Pechka(){
  if(DALLAS_temperature < pechka_rastvor_temp ){
     digitalWrite(pechka_pin, HIGH);
     pechka_flag = true;
   }else{
    digitalWrite(pechka_pin, LOW);
    pechka_flag = false;
   }
}

//----------Помпа-------------------------------------------------
void Pompa(){
  if(!pompa_manual){
    if(  (millis()-pompa_last_time)>(pompa_freq*60000) && !pompa_flag ){
      digitalWrite(pompa_pin, HIGH);
      pompa_flag=true;
      pompa_last_time=millis();
    }
    if(  (millis()-pompa_last_time)>(pompa_dlit*60000) && pompa_flag ){
      digitalWrite(pompa_pin, LOW);
      pompa_flag=false;
    }
  }else{
      digitalWrite(pompa_pin, pompa_flag);
  }
}

//--------TDS---------------------------------------------------------
void TDS(int freq){
  if((millis()-TDS_last_time)>freq){

      pinMode(49, OUTPUT);
      digitalWrite(49, 1);
      tds_1 = analogRead(A15);
      digitalWrite(49, 0);
      pinMode(49, INPUT);

      pinMode(51, OUTPUT);
      digitalWrite(51, 1);
      tds_2 = analogRead(A14);
      digitalWrite(51, 0);
      pinMode(51, INPUT);
       
      tds = (float)tds_1 + ((float)(tds_2-tds_1)) / 2;
      tds_volt = (float)tds*5/1023;
      tds_res = 440.0*5.0/tds_volt-440.0;

      tds_array[tds_array_index] = (float)tds_calibration  / tds_res;
      tds_array_index++;
      if(tds_array_index > 99) tds_array_index=0;
      tds_ppm = Mediana(tds_array, 100, 20);
           
     
   TDS_last_time = millis();
  }
}

//------------------------------Работа реле-----------------------------
void Rele(){
  if(!manual){
    if(time_current_h >= time_red_on && time_current_h <time_red_off) {
      digitalWrite(31, HIGH);
      digitalWrite(39, HIGH);
      red = 1;
    }else{
      digitalWrite(31, LOW);
      digitalWrite(39, LOW);
      red = 0;
    }

    if(time_current_h >= time_blue_on && time_current_h <time_blue_off) {
      digitalWrite(35, HIGH);
      digitalWrite(37, HIGH);
      digitalWrite(41, HIGH);
      blue= 1;
      white=1;
    }else{
      digitalWrite(35, LOW);
      digitalWrite(37, LOW);
      digitalWrite(41, LOW);
      blue= 0;
      white=0;
    }
  }else{
      digitalWrite(31, red);
      digitalWrite(39, red);
      digitalWrite(35, blue);
      digitalWrite(41, blue);
      digitalWrite(37, white);
  }
}

//*******************************************************************************
float Mediana(float array[], int razmer, int factor){
  float temp_array[razmer];
  for (int n = 0; n < razmer ; n++){         
     temp_array[n] = array[n];
  }

  int min;
  float smena;
  for (int n = 0; n <  razmer ; n++){                 
        min = n;
        for(int j = n+1; j <  razmer ; j++){             
            if(temp_array[j] < temp_array[min]){
                    min = j;
            }
        }
        smena = temp_array[n];
        temp_array[n] = temp_array [min];
        temp_array [min] = smena;
    }


  int start = razmer/2-factor/2;
  float summa =0;
    for (int n = start; n < start+factor ; n++){         
        summa += temp_array[n];
    }
  return summa/factor;
}


float Ariphmetic(float array[], int razmer){
  float summa =0;
    for (int n = 0; n < razmer ; n++){         
        summa += array[n];
    }
    return summa / razmer;         
}


13
Может крамольный вопрос задам, а сколько сейчас на всходах нужно? Чтоб не перечитывать всю тему :)
Под 30 градусов.

14
А ты в настройках поставил Мегу ? Если у тебя стоит Вемос, то может и не хавать.
точно. не сменил  8)
а он даже и не сопротивлялся - памяти хватает и под ESP :drinks:

нужно будет порыться в описалове Mega+ESP - может можно одним скетчем в ESP юзать (если пины ей доступны)..?
А с чего ты взял, что они ей доступны? Вемос с Мегой в твоем аппарате связаны только двумя пинами Serial. А то, что в IDE не предусмотрели защиту от дурака (т.е. можно вписать левый номер пина и не получить ошибку), так это бока разработчиков софта.

15
Одна проблема есть, греются эти прожектора прилично, в "боксе" за полдня до 29 нагрелось, приходится проветривать.
Это не проблема, это счастье.  :) Вот когда 15 градусов и ты поднять не можешь - вот это проблема.

16
Пины у нас максимум 55 бывают.
Не у Меги...
У меня вот А14/А15 хавать не хочет, а на те же, но прописанные как 68/69 не сопротивляется
А ты в настройках поставил Мегу ? Если у тебя стоит Вемос, то может и не хавать.
А вообще "А15" - это та же самая директива препроцессора, если порыться в либах, то можно найти строку #define А15 69, просто она скрыта от тебя, и ты просто юзаешь А15.

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

А теперь по сути предложенного тобой варианта.
int - целочисленный тип, хранящий число от -32 768 до 32 767. Занимает эта переменнам 2 байта. Пины у нас максимум 55 бывают. Поэтому разумнее использовате тип byte, он от 0 до 255 и зазнимает один байт, как раз для пинов хватит. Вот только на этом можно сэкономить пару десятков байт.
Но это еще все.
Нам нет смысла создавать переменную под пины и хранить ее в памяти, поскольку они у нас меняться не будут. Проще пользоваться директивой препроцессора #define, в этом случае память под пины вообще не будет тратиться.
Для Меги это конечно не критично, 8кБ - хватит под многое. А вот если кодить Про Мини например, то на таких мелочах можно уйму памяти сыэкономить.


18
Цитировать
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
это про кого?
А ни про кого :D Это ШИМ-пины, под которые я подключил сборку Дарлингтона (эти и два выше), прописал их в скетче сразу, чтоб не забыть, но в текущей конфигурации они не используются, можно убрать.

19
проблема проматывать всю простыню выискивая ВСЕ места где указать пины
Юзай Code Folding, удобная штука. Файл > Настройки > Включить сворачивание кода

20
:D
это тебе понятно что ты куда подключил...
и ты вот ну никак не хочешь просто и понятно написать в коде распиновку (для тех кто впервые код видит)
а после всех пояснений так и не понятно: 5 пинов - 3 канала на 19 Вольт + красный на 42 Вольт + синий на 220 Вольт => а в коде красный двумя пинами и синий тремя пинами...
Белый канал работает синхронно с синим в крейсерском режиме. Я его отдельно вывел, чтобы вручную можно отдельно для селфи включить.

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