Автор Тема: Инкубатор для проращивания семян на Wemos D1 (ESP8266) с управлением по Wi-Fi  (Прочитано 17411 раз)

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
"Так наказания за это нет. Де юре семена просто запрещены к ввозу и всё, фитосанитарный контроль и все дела.
"

Братское сердце в детали не вникал но чую что поостеречься надо. Ну не бывает в нашей стране так чтоб запрет был а наказания не было. Если по кентовски это еще куда ни шло получатель всегда может сказать что блин ничего не знал(не докажут ничего но в базу занесут и внимание станут уделять больше чем остальным) а если ты отправителю деньги перечислял то это умысел. Ну если ты точно знаешь что засада там ну зайди с другой стороны.
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн vadkoff

Де-юре не возможно доказать, что именно отправитель на конверте указанный отправлял письмо с семенами, хватит мусолить, коллеги. Это бред и не более, не достойный обсуждения. Любой может кинуть письмо то же в любой ящик почтовый с вашим именем или на почте прямо в урну общую для писем. Максиму что будет - письмо не дойдёт до получателя, и точка :D

Оффлайн Mr. Smet

Де-юре не возможно доказать, что именно отправитель на конверте указанный отправлял письмо с семенами, хватит мусолить, коллеги. Это бред и не более, не достойный обсуждения. Любой может кинуть письмо то же в любой ящик почтовый с вашим именем или на почте прямо в урну общую для писем. Максиму что будет - письмо не дойдёт до получателя, и точка :D
Ещё как дойдёт!!! )))
Я ещё и монеты юбилейные слал в США так. Город у нас древний, как  какашка мамонта. Есть две юбилейных денежки с нашим городом. Ну друг американин и говорит пришли. А мне что, жалко что ли? В конверт запаковал, адрес накалякал с ошибками. И отправил. Два раза. И всё дошло. Дело техники. ::)
З.Ы. И тут тема вроде про инкубатор. А мы срач развели неимоверный не по делу. ))))
« Последнее редактирование: 04 Март 2017, 23:04:45 от Mr. Smet »

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
ну хватит так хватит лирические отступления хороши только в меру. :drinks:

вопрос к ТС.
А Вы сразу в железе задумки собираете или есть какая то любимая программа эмулятор. если да то может файлы проектов приложите. начинающим очень поможет
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
ну хватит так хватит лирические отступления хороши только в меру. :drinks:

вопрос к ТС.
А Вы сразу в железе задумки собираете или есть какая то любимая программа эмулятор. если да то может файлы проектов приложите. начинающим очень поможет
Дык, а чего там эмулировать схема то простейшая, управление нагрузкой через транзистор и чтение значений АЦП с делителя напряжения.
Вообще есть классный эмулятор Proteus, там и Ардуину со своими прошивками эмулировать можно. Гляньте в разделе выше, мы с AlexYalta делали ему периодику, вот видео с примером работы программы.

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
ну и мне как раз Proteus нравится. Но хотелось узнать точнее куда копать.
Если еще точнее то я только только начинаю вникать в эту тему. Мозгов хватает только на то что бы повторить уже кем то сделанное. Ну чуть чуть допилить могу под свои нужды. Дело двигается не быстро и думаю эмулятор в этом поможет. Но еще ни один не освоил.
может кому пригодится http://www.ruselectronic.com/news/emulyatsiya-proekta-na-mk-avr-v-programme-proteus/
« Последнее редактирование: 06 Март 2017, 14:51:53 от eddy »
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Ок,eddy, после яиц гекконов обещаю вкинуть туда полсотни семок jalapeno 2012 года (лежат у меня, жалко выкинуть), и сравню с ними же, но на холодильнике.  :)
Как и обещал eddy запустил полевые испытания инкубатора :)
Вот исследовательский материал - по полсотни Jalapeno 2012 года. Одна партия в установку рядом с яйцами гекконов. Вторая - на холодильник.


В установке произошли непредвиденные вынужденные изменения. Словил КЗ :D, когда щупами промерял напряжение, выгорело всё подчистую, и датчик температуры LM335, и стабилизатор AMS1117, и транзистор, и Вемос.
Транзистор поменял на RF640N, но он от 3.3 вольт открываться полностью не захотел, других транзисторов под рукой не нашел, поэтому управление нагрузкой сделал на сборке Дарлингтона (приятная штука). Пустил 3 канала в параллель, но наверное и одного хватило бы.
AMS1117 у меня тоже кончились, поставил LM117, но он сильно грелся (вне корпуса - примерно 70 градусов, в корпус такое запихивать страшновато), падение напряжения на нем с 12 вольт слишком видимо большое для прожорливого Вемоса, поэтому сделал Вемосу отдельное питание от зарядки для мобилки (фильтр на 1000мF только добавил).
Датчик температуры поставил Dallas DS18B20. Тоже очень приятная штука, очень точный, разрешение до 0.0625 градуса, повторяемость показаний великолепная. Даже в программе убрал среднеарифметический фильтр (скользящее среднее) за ненадобностью.
Датчик правда в герметичном корпусе в виде зонда, поэтому имеет довольно большую инерционность (масса большая), поэтому показания скачут +/- 0.2 градуса из-за задержки нагрева и остывания.
В программе с целью борьбы и инерционностью датчика добавил возможность установки мощности подогрева, т.е. печка не выключается полностью, а снижает мощность до, например, 10-30%, чтобы не так быстро остывало.

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


Посмотрим, что нам эти пятилетние семена покажут, самому интересно :)

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
 :good: :good: :good:
Очень хочется на скетч посмотреть. Так сказать для обучения развития.
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
:good: :good: :good:
Очень хочется на скетч посмотреть. Так сказать для обучения развития.
Так в первом же посте выкладывал.

Ну вот, если хотите окончательный вариант:
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <OneWire.h>

#define D0 16  //TDS
#define D1 5   //SCL
#define D2 4   //SDA
#define D3 0   
#define D4 2   //LED помпа
#define D5 14  // 3 реле
#define D6 12  // DHT
#define D7 13  // 2 реле
#define D8 15  // 1 реле
#define TX 1
#define RX 3

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

ESP8266WebServer server(80);

//---------Dallas--------------------------------
OneWire  ds(D6);
byte data[2];
byte addr[8] = {0x28, 0x95, 0x15, 0xAE, 0x8, 0x0, 0x0, 0x73};
long dallas_last_time;
boolean dallas_flag;
float t;
String IP;


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

long time_on;
double percent_on;
long time_on_last_time;
boolean power_on = true;

long monitor_last_time;
long transmit_last_time;

int transmit;

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


void handleRoot() {
  char temp[2900];
  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();
  }
   if(server.argName(0) == "power_off") {
    power_off = a.toInt();
    EEPROM.write(4, power_off);
    EEPROM.commit();
  }
  if(server.argName(0) == "transmit") {
    transmit = a.toInt();
    EEPROM.write(5, transmit);
    EEPROM.commit();
  }
  server.send ( 200, "text/plain", "Ok!" );
   
}
//****************************************************************************************
//****************************************************************************************


void setup(void){
  pinMode(D5, OUTPUT);
  pinMode(D4, OUTPUT);
  pinMode(D7, OUTPUT);
  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();
  IP = (String)myIP;
  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);
  power_off = EEPROM.read(4);
  transmit = EEPROM.read(5);

}

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


void loop(void){
  long t = millis();
  server.handleClient();
 
  Dallas(2000);
  Pechka();
  //Monitor(2000);
  Transmit_to_server(transmit*1000);
}

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

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,5, 2, real_temp_c);
char percent_on_c[10];
dtostrf(percent_on,5, 2, percent_on_c);

snprintf ( s, 2900,
"<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.89/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.89/set?correct='+ document.getElementById('cor_temp').value;\">Set</button>\
    </div>\
    <div class=\"block\">\
      <div class=\"podpis\">Power ON:</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.89/set?power='+ document.getElementById('inp_power').value;\">Set</button>\
    </div>\
     <div class=\"block\">\
      <div class=\"podpis\">Power OFF:</div>\
      <div class=\"data\" style=\"color: #aaaa00\">%d\%</div>\
      <input id=\"inp_power_off\" type=\"text\" size=\"2\">\
      <button style=\"background-color: #E26408; border-radius: 10px\" onclick=\"document.location.href = 'http://192.168.0.89/set?power_off='+ document.getElementById('inp_power_off').value;\">Set</button>\
    </div>\
    <div class=\"block\">\
      <div class=\"podpis\">Transmit:</div>\
      <div class=\"data\" style=\"color: #00f\">%d\s</div>\
      <input id=\"transmit\" type=\"text\" size=\"2\">\
      <button style=\"background-color: #E26408; border-radius: 10px\" onclick=\"document.location.href = 'http://192.168.0.89/set?transmit='+ document.getElementById('transmit').value;\">Set</button>\
    </div>\
    <div class=\"block\">\
      <div class=\"podpis\">Time ON:</div>\
      <div class=\"data\" style=\"color: #aa0000\">%s\%</div>\
    </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,
power_off,
transmit,
percent_on_c,
hr, min % 60, sec % 60
);

}


 //-------------------GET-запрос на сервер------------------------------
void Transmit_to_server (long freq){
   if((millis()-transmit_last_time)>freq){
   
        WiFiClient client;
        const uint16_t port = 80;
        const char * host = "anndrew.tk";
        client.connect(host, port);
        String url;
        url = "/data2.php?pass=password&";
        url.concat("set_temp="); url.concat(set_temp);url.concat("&");
        url.concat("real_temp="); url.concat(real_temp);url.concat("&");
        url.concat("power_on="); url.concat((int)power_on);
       
        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");
       
        delay(100);                                           //Получение ответа от сервера
        String line = client.readStringUntil('>');                   //Читаем строку до >
        char *y = new char[line.length() + 1];                //Создаем массив символов
        strcpy(y, line.c_str());                              //Помещаем строку в массив
       
        char * pch;
        pch = strtok (y,"<");                                 //Отсекаем все до <
        pch = strtok (NULL, ">");                             //Получаем нужное сообщение
        String pp = (String)pch;                              //Преобразовываем в строку
        Serial.println(pp);
        if(pp == "success") {
       
          }else{
         
            WiFi.disconnect();
            delay(1000);
            WiFi.begin(ssid, password);
            }
         
        delay(10);
        client.stop();
 
    transmit_last_time = millis();
    }
}


//---------Pechka-------------------------------------------------------
void Pechka(){
  float x = time_on/1000.0;
  if(power_on) x += (millis() - time_on_last_time)/1000.0;
  float y = millis()/1000.0;
  percent_on = x/y*100.0f;
  int p = power*2.55;
  int p_off = power_off*2.55;
  if(real_temp<set_temp){
    if (!power_on){time_on_last_time=millis();power_on=true;}
    digitalWrite(D7,1);
    if(power==100)digitalWrite(D5,1);
    else analogWrite(D5, p);
    }else {
       if (power_on){time_on+=millis()-time_on_last_time;power_on=false;}
       digitalWrite(D7,0);
       if(power_off==0)digitalWrite(D5,0);
       else analogWrite(D5, p_off);
       }
}

//---------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);       
 
    data[0] = ds.read();
    data[1] = ds.read();
   
    int16_t raw = (data[1] << 8) | data[0];
    t = (float)raw / 16.0;
   
    array_temp[ind] = t;
    ind++;
    if(ind>9) ind=0;
    float summ = 0;
    for(int n = 0; n<10; n++){
      summ += array_temp[n];
    }
    real_temp=summ/10.0;
    real_temp = t;
    real_temp += correct_temp;
   
    dallas_flag = false;
    }
 }


//---------------Monitor--------------------------------------
void Monitor(int freq){
  if((millis()-monitor_last_time)>freq){
   
    String m;
    real_temp<set_temp ? m="ON" : m="OFF";
    Serial.println(real_temp);
    Serial.println("Mgnoven: "+(String)t);
    Serial.println("Pechka: " + m);
    Serial.println("tive on: " + (String)(time_on/1000)+" s");
    Serial.println("Percent: " + (String)percent_on);
   
    monitor_last_time = millis();
  }
}

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

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
да да хочу именно все варианты видеть. В динамике так сказать. У меня в "таймере" тоже изменения есть подключил вентилятор. В нищебродство врядли кто заглятет может здесь тему создать?
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
да да хочу именно все варианты видеть. В динамике так сказать. У меня в "таймере" тоже изменения есть подключил вентилятор. В нищебродство врядли кто заглятет может здесь тему создать?
А я Вас давно призывал создать тему с Вашими ардуиновыми приключениями. :) А иначе как еще заинтересовать народ.
Я всего лишь год назад рассказал о своей ардуине, был наверное на форуме единственным, кто нею страдал. А после того уже и AlexYalta, и Вы, и kido, и PowerTech, и bottica, и, уверен, скоро будет и vadkoff её страдать :D

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Промежуточный отчет о полевых испытаниях инкубатора.

По состоянию на сегодня, 9-е сутки проращивания, проклюнулось:

ДеньИнкубаторХолодильник
   6    3    -
   7    3    -
   8    11    -
   9    17    1
Всего:     34     1

В инкубаторе на 9-й день всхожесть уже 68%, на холодильнике - 2%.

Температура в инкубаторе поддерживалась 28 градусов. На холодильнике - в районе 24-25, изредка 22.
« Последнее редактирование: 20 Март 2017, 19:24:25 от Ann »

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн vadkoff

скоро будет и vadkoff её страдать :D

уже :D главное до ума довести теперь начинания)

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
« Последнее редактирование: 25 Март 2017, 13:51:50 от eddy »
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Начинаю собирать железяки. что скажете?
https://ru.aliexpress.com/store/product/Atmospheric-Humidity-Temperature-Sensor-Breakout-Barometric-Pressure-BMP280-SI7021-for-Arduino-GY-21P-By-DIY-FZ2536/1962508_32797485976.html
У меня стоит более ранняя версия BMP085, без измерения влажности. Замечаний нет, работает чётко, повторяемость показаний высокая, соответствует интернетному давлению, чувствительность высокая, замечает перепады давления просто при поднятии на полметра вверх.
По его влажности внимательно погуглите форумы, насколько он точно её отображает. Например, DHT21 влажность показывает очень точно, а DHT11 показывает влажность на Марсе (по отзывам).
По быстрому гуглению, вроде как особых претензий к нему нет, можно брать.

В чем разница между
https://ru.aliexpress.com/item/2015-New-product-Wireless-module-NodeMcu-Lua-Wifi-Nodemcu-WIFI-Network-Development-Board-Based-ESP8266-High/32521100830.html
и
https://ru.aliexpress.com/item/New-Wireless-module-CH340-NodeMcu-V3-Lua-WIFI-Internet-of-Things-development-board-based-ESP8266/32562464572.html
Вторая - новая версия. Лично не сталкивался, на первый взгляд вижу три отличия:
1. Доп. выведены 4 выхода протокола MOSI/MISO. Редко используемая штука, на моей памяти я её использовал лишь раз для подключения модуля SD-card. В общем преимуществ не дает.
2. Смотрю на плате стоит более мощный стабилизатор питания, вроде как похож на AMS1117. Поэтому можно ему подавать не только 5 или 3.3 вольта, но и до 12. Хотя 12 я всё же подать не рискнул бы, плата прожорливая, до 240мА может потреблять, и если на AMS1117 будет падать 9 вольт, то при 240 мА на нем будет рассеиваться 2 ватта. Будет сильно греться.
3. Размеры. Первые два пункта привели к увеличению размера, что не очень приятно.

Только сейчас обратил внимание, что Вы спрашивали об отличии двух новых версиях модуля, а я написал его отличие от Wemos D1 mini. Ну да ладно, пусть остается.
По сути: визуально вижу только одно отличие на одной стоит микросхема CH340, а на второй СР2102. Эти микросхемы предназначены для подключения к USB компьютера. Обе работают нормально, разницы нет.

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
Спасибо. Один тепличник где то писал что DHT22 в условиях теплицы больше 6месяцев не живут. Рекомендовал si7021.
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1847
  • Лайков: 10
    • Просмотр профиля
Спасибо. Один тепличник где то писал что DHT22 в условиях теплицы больше 6месяцев не живут. Рекомендовал si7021.
Мой DHT21 (аналог DHT22) второй год работает нормально.

Оффлайн kido

от шо вы прицепились к этому dht22?
купите пригоршню dht11 и хрен  бы с ними, пусть сдыхают (с такой-то ценой)
или что вы собрались поддерживать с точностью 0,1?   ;)

Оффлайн eddy

  • Habanero
  • *****
  • Сообщений: 1378
  • Лайков: 2
  • 300 не надо хватит и одного
    • Просмотр профиля
« Последнее редактирование: 25 Март 2017, 19:21:29 от eddy »
Опыт - самый лучший учитель. Берет правда дорого, но зато объясняет доходчиво.