кнопки умного дома

alexey80
Offline
Зарегистрирован: 12.11.2021

Ребята помогите разобраться. подключил библиотеку GyverButton.h настроил режимы кнопок на отладочной плате, протестировал все понравилось. припаял кнопки дома. запустил и ни чего. сначала реакция не понятна. думал подтяжка нужна. подтяжка не спасла. не понимаю что делать. оставил в коде всего одну кнопку, реакции вообще никакой.

Мегавольт
Мегавольт аватар
Offline
Зарегистрирован: 10.10.2018

Ща... тебе тут навтыкают...  Во-первых за Гайвера, во-вторых за отсутствие кода.... В-третьих просто так.... что б знал "своё место".... Потому как прикреплённую тему то не прочитал :-)   

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Так то пипец.
Я вот могу самостоятельно без всяких гиверов и форумов, реализовать то что хочет тс.
Но вот почему то знаю, что решения от тех же sonoff или tuya это намного проще и дешевле.
Их и использую. Позавчера вот zigbee датчик температуры/влажности за 600р в ванную поставил, который рулит вентилятором вытяжки через sonoff basic за 300р. (Сопоставимо по цене с нано, при этом имеет встроенный БП и wifi).
Та же умная розетка от tuya стоит ,550р. Умеет по сети, куча режимов и подсчет расхода ЭЭ.
ТС, халява она обычно очень дорогая

alexey80
Offline
Зарегистрирован: 12.11.2021
#include <LCD_1602_RUS.h>
#include <iarduino_RTC.h>
#include <Keypad.h>
#include <SPI.h>
#include <SoftwareSerial.h>
#include <DHT.h> //температура
#include <DHT_U.h> //температура
#include <GyverButton.h>
#define BTN1 34
#define BTN2 35
#define BTN3 36
#define BTN4 32
#define DHTPIN A14 //температура
#define DHTTYPE  DHT11 //температура
DHT_Unified dht(DHTPIN, DHTTYPE);//температура
uint32_t delayMS;   //температура
int tonePin = 13;
LCD_1602_RUS lcd(0x27, 20, 4);
iarduino_RTC time(RTC_DS1302,12,10,11);  // для модуля DS1302 - RST, CLK, DAT
SoftwareSerial SIM800(19,18);        // 19 - RX Arduino (TX SIM800L), 18 - TX Arduino (RX SIM800L)
const uint8_t RELE1=2;
const uint8_t RELE2=3;
const uint8_t RELE3=4;
const uint8_t RELE4=5;
const uint8_t RELE5=6;
const uint8_t RELE6=7;
const uint8_t RELE7=8;
const uint8_t RELE8=9;
const uint8_t DD=A13;
boolean flag1=1;
boolean flag2=1;
boolean flag3=1;
boolean flag4=1;
boolean flag5=1;
boolean flag6=1;
boolean flag7=1;
boolean flag8=1;
const byte ROWS = 4; // четыре строки
const byte COLS = 3; // три столбца
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {22, 23, 24, 25}; // подключить к выводам строк клавиатуры
byte colPins[COLS] = {26, 27, 28};    // подключить к выводам столбцов клавиатуры
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
unsigned long previousMillis = 0;  //в этой переменной будем хранить время, когда светодиод последний раз мигнул
const long period = 2000;         //интервал времени в миллисекундах, через который светодиоду нужно мигать
 
void setup()
{ SPI.begin();
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  dht.begin();                         //температура
  sensor_t sensor;                     //температура
  dht.temperature().getSensor(&sensor);//температура
  dht.humidity().getSensor(&sensor);   //температура
  delayMS = sensor.min_delay / 1000;   //температура
  Serial.begin(9600);               // Скорость обмена данными с компьютером
  Serial.println("Start!");
  SIM800.begin(9600);               // Скорость обмена данными с модемом
  SIM800.println("AT");
    pinMode (DD, INPUT_PULLUP);
    pinMode (RELE1, OUTPUT);
    digitalWrite (RELE1, HIGH);
    pinMode (RELE2, OUTPUT);
    digitalWrite (RELE2, HIGH);
    pinMode (RELE3, OUTPUT);
    digitalWrite (RELE3, HIGH);
    pinMode (RELE4, OUTPUT);
    digitalWrite (RELE4, HIGH);
    pinMode (RELE5, OUTPUT);
    digitalWrite (RELE5, HIGH);
    pinMode (RELE6, OUTPUT);
    digitalWrite (RELE6, HIGH);
    pinMode (RELE7, OUTPUT);
    digitalWrite (RELE7, HIGH);
    pinMode (RELE8, OUTPUT);
    digitalWrite (RELE8, HIGH);
    time.begin();
  time.settime(0, 00, 00, 05, 11, 21, 6); // 0  сек, 30 мин, 18 часов, 12, июня, 2020, четверг
  
  }
void loop(){
  lcd.setCursor(0,3);
  unsigned long currentMillis = millis(); // сохраняем текущее время
  int d=analogRead (DD);
  if (d>=500){lcd.print("свет в прихожей от ДД");
  digitalWrite (RELE2, LOW);
  flag2=LOW;
  if (currentMillis - previousMillis >= 300000) { // проверяем прошли ли 300000ms 
    previousMillis = currentMillis;       // Приравниваем переменную текущего времени к времени контроллера, чтобы через 1000мс опять сработал наш цикл.
    digitalWrite (RELE2, HIGH);    //здесь любое действие.
    flag2=HIGH;
    lcd.print("выкл свет прих от ДД"); }}
/*
    if (currentMillis - previousMillis >= period) { // проверяем прошли ли 1000ms 
    previousMillis = currentMillis;       // Приравниваем переменную текущего времени к времени контроллера, чтобы через 1000мс опять сработал наш цикл.
    Serial.println (k);//здесь любое действие.
     }*/
/*    GButton butt1 (BTN1, LOW_PULL,NORM_OPEN);
    butt1.setDebounce(50);        // настройка антидребезга (по умолчанию 80 мс)
    butt1.setTimeout(300);        // настройка таймаута на удержание (по умолчанию 500 мс)
    butt1.setClickTimeout(300);   // настройка таймаута между кликами (по умолчанию 300 мс)
    butt1.tick();
      if (butt1.isStep()) {// если удержание кнопки1 все реле выкл
      flag1=1;
      flag2=1;
      flag3=1;
      flag4=1;
      flag5=1;
      flag6=1;
      flag7=1;
      flag8=1;
      digitalWrite (RELE1, HIGH);
      digitalWrite (RELE2, HIGH);
      digitalWrite (RELE3, HIGH);
      digitalWrite (RELE4, HIGH);
      digitalWrite (RELE5, HIGH);
      digitalWrite (RELE6, HIGH);
      digitalWrite (RELE7, HIGH);
      digitalWrite (RELE8, HIGH);
      lcd.print("Все отключено кноп 1");}
      if (butt1.isSingle()) {lcd.print("Звонок              ");    // проверка на один клик
                          tone(tonePin, 1700,200);
                          delay(200);
                          tone(tonePin, 1519,200);
                          delay(200);
                          tone(tonePin, 1432,200);
                          delay(200);
                          tone(tonePin, 1275,200);
                          delay(200);
                          tone(tonePin, 1136,400);
                          delay(400);
                          tone(tonePin, 1014,500);}
       if (butt1.isDouble()) {flag1=!flag1;                 // проверка на двойной клик
                          lcd.print("Уличное освещение   ");
                          digitalWrite(RELE1, flag1); } 
    butt1.setDebounce(50);        // настройка антидребезга (по умолчанию 80 мс)
    butt1.setTimeout(300);        // настройка таймаута на удержание (по умолчанию 500 мс)
    butt1.setClickTimeout(300);   // настройка таймаута между кликами (по умолчанию 300 мс)
    butt1.tick();
      if (butt1.isStep()) {// если удержание кнопки1 все реле выкл
      flag1=1;
      flag2=1;
      flag3=1;
      flag4=1;
      flag5=1;
      flag6=1;
      flag7=1;
      flag8=1;
      digitalWrite (RELE1, HIGH);
      digitalWrite (RELE2, HIGH);
      digitalWrite (RELE3, HIGH);
      digitalWrite (RELE4, HIGH);
      digitalWrite (RELE5, HIGH);
      digitalWrite (RELE6, HIGH);
      digitalWrite (RELE7, HIGH);
      digitalWrite (RELE8, HIGH);
      lcd.print("Все отключено кноп 1");}
      if (butt1.isSingle()) {lcd.print("Звонок              ");    // проверка на один клик
                          tone(tonePin, 1700,200);
                          delay(200);
                          tone(tonePin, 1519,200);
                          delay(200);
                          tone(tonePin, 1432,200);
                          delay(200);
                          tone(tonePin, 1275,200);
                          delay(200);
                          tone(tonePin, 1136,400);
                          delay(400);
                          tone(tonePin, 1014,500);}
       if (butt1.isDouble()) {flag1=!flag1;                 // проверка на двойной клик
                          lcd.print("Уличное освещение   ");
                          digitalWrite(RELE1, flag1); }
      GButton butt2 (BTN2,LOW_PULL,NORM_OPEN);                    
      butt2.setDebounce(50);        // настройка антидребезга (по умолчанию 80 мс)
      butt2.setTimeout(300);        // настройка таймаута на удержание (по умолчанию 500 мс)
      butt2.setClickTimeout(300);   // настройка таймаута между кликами (по умолчанию 300 мс)
      butt2.tick();
      if (butt2.isStep()) {// если удержание кнопки2 все реле выкл
      flag1=1;
      flag2=1;
      flag3=1;
      flag4=1;
      flag5=1;
      flag6=1;
      flag7=1;
      flag8=1;
      digitalWrite (RELE1, HIGH);
      digitalWrite (RELE2, HIGH);
      digitalWrite (RELE3, HIGH);
      digitalWrite (RELE4, HIGH);
      digitalWrite (RELE5, HIGH);
      digitalWrite (RELE6, HIGH);
      digitalWrite (RELE7, HIGH);
      digitalWrite (RELE8, HIGH);
      lcd.print("Все отключено кноп 2");}
      if (butt2.isSingle()) {flag2=!flag2;                 
                          lcd.print("Свет в прихожей кн 2");
                          digitalWrite(RELE2, flag2); }
      if (butt2.isDouble()) {flag1=!flag1;                 
                          lcd.print("Уличное освещение   ");
                          digitalWrite(RELE1, flag1);}
      if (butt2.isTriple()) {flag3=!flag3;                 // проверка на тройной клик
                          lcd.print("Свет в кухне от кн 2");
                          digitalWrite(RELE3, flag3); }
      GButton butt3 (BTN3,LOW_PULL,NORM_OPEN);
      butt3.setDebounce(50);        // настройка антидребезга (по умолчанию 80 мс)
      butt3.setTimeout(300);        // настройка таймаута на удержание (по умолчанию 500 мс)
      butt3.setClickTimeout(300);   // настройка таймаута между кликами (по умолчанию 300 мс)
      butt3.tick();
      if (butt3.isStep()) {// если удержание кнопки3 все реле выкл
      flag1=1;
      flag2=1;
      flag3=1;
      flag4=1;
      flag5=1;
      flag6=1;
      flag7=1;
      flag8=1;
      digitalWrite (RELE1, HIGH);
      digitalWrite (RELE2, HIGH);
      digitalWrite (RELE3, HIGH);
      digitalWrite (RELE4, HIGH);
      digitalWrite (RELE5, HIGH);
      digitalWrite (RELE6, HIGH);
      digitalWrite (RELE7, HIGH);
      digitalWrite (RELE8, HIGH);
      lcd.print("Все отключено кноп 3");}
      if (butt3.isSingle()) {flag3=!flag3;                 
                          lcd.print("Свет в кухне от кн 3");
                          digitalWrite(RELE3, flag3);}
      if (butt3.isDouble()){ flag4=!flag4;                 // проверка на двойной клик
                          lcd.print("Освещение в коридоре");
                          digitalWrite(RELE4, flag4);}
      if (butt3.isTriple()){ flag5=!flag5;                 
                          lcd.print("Освещение в комнате ");
                          digitalWrite(RELE5, flag5);}
 */     GButton butt4 (BTN4,LOW_PULL,NORM_OPEN);
      butt4.tick();
      butt4.setDebounce(50);        // настройка антидребезга (по умолчанию 80 мс)
      butt4.setTimeout(100);        // настройка таймаута на удержание (по умолчанию 500 мс)
      butt4.setClickTimeout(300);   // настройка таймаута между кликами (по умолчанию 300 мс)
      if (butt4.isStep()) {// если удержание кнопки4 все реле выкл
      flag1=1;
      flag2=1;
      flag3=1;
      flag4=1;
      flag5=1;
      flag6=1;
      flag7=1;
      flag8=1;
      digitalWrite (RELE1, HIGH);
      digitalWrite (RELE2, HIGH);
      digitalWrite (RELE3, HIGH);
      digitalWrite (RELE4, HIGH);
      digitalWrite (RELE5, HIGH);
      digitalWrite (RELE6, HIGH);
      digitalWrite (RELE7, HIGH);
      digitalWrite (RELE8, HIGH);
      lcd.print("Все отключено кноп 4");}
      if (butt4.isSingle()) {flag7=!flag7;                 
                          lcd.print("Свет в спальне кн 4 ");
                          digitalWrite(RELE7, flag7);}                        
     if (butt4.isDouble()) {flag3=!flag3;                 
                          lcd.print("Свет в кухне от кн 4");
                          digitalWrite(RELE3, flag3);}
     if (butt4.isTriple()) {flag1=!flag1;                 
                          lcd.print("Уличное освещение   ");
                          digitalWrite(RELE1, flag1);}
                  
if (SIM800.available()){           // Ожидаем прихода данных (ответа) от модема...
    Serial.write(SIM800.read());}   // ...и выводим их в Serial
if (Serial.available())  {         // Ожидаем команды по Serial...
    SIM800.write(Serial.read()); }   // ...и отправляем полученную команду модему   
 lcd.setCursor(0,0);
 lcd.print(time.gettime("d-m-Y,D,H:i"));
 sensors_event_t event;                                //температура начало...
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    lcd.setCursor(0,1);
    lcd.println(F("Error reading temperature!"));
  }
  else {
        lcd.print("Т:");
    lcd.print(event.temperature);
  }
  // Get humidity event and print its value.
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    lcd.print(F("Error reading humidity!"));
  }
  else {
    lcd.print(" Влаж.:");
    lcd.print(event.relative_humidity);
  }                                            //... температура конец
 char key = keypad.getKey();
if (key){
  lcd.setCursor(0,3);  // lcd.print(key);
  switch (key){
case '1':
flag1=!flag1;
lcd.print("RELE1:");
lcd.print(!flag1);
digitalWrite(RELE1, flag1);
break;
case '2':
flag2=!flag2;
lcd.print("RELE2:");
lcd.print(!flag2);
digitalWrite(RELE2, flag2);
break;
case '3':
flag3=!flag3;
lcd.print("RELE3:");
lcd.print(!flag3);
digitalWrite(RELE3, flag3);
break;
case '4':
flag4=!flag4;
lcd.print("RELE4:");
lcd.print(!flag4);
digitalWrite(RELE4, flag4);
break;
case '5':
flag5=!flag5;
lcd.print("RELE5:");
lcd.print(!flag5);
digitalWrite(RELE5, flag5);
break;
case '6':
flag6=!flag6;
lcd.print("RELE6:");
lcd.print(!flag6);
digitalWrite(RELE6, flag6);
break;
case '7':
flag7=!flag7;
lcd.print("RELE7:");
lcd.print(!flag7);
digitalWrite(RELE7, flag7);
break;
case '8':
flag8=!flag8;
lcd.print("RELE8:");
lcd.print(!flag8);
digitalWrite(RELE8, flag8);
break;
case '9':
lcd.print("звонок");
    tone(tonePin, 1700,200);
delay(200);
    tone(tonePin, 1519,200);
delay(200);
    tone(tonePin, 1432,200);
delay(200);
    tone(tonePin, 1275,200);
delay(200);
    tone(tonePin, 1136,400);
delay(400);
    tone(tonePin, 1014,500);
break;
case '0':
lcd.print("выключить освещение");
digitalWrite (RELE1, HIGH);
    digitalWrite (RELE2, HIGH);
    digitalWrite (RELE3, HIGH);
    digitalWrite (RELE4, HIGH);
    digitalWrite (RELE5, HIGH);
    digitalWrite (RELE6, HIGH);
    digitalWrite (RELE7, HIGH);
    digitalWrite (RELE8, HIGH);
        }}}    

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

За выложенный в таком виде код присовывают с особым цинизмом.

Ps. Молодец, понятливый

alexey80
Offline
Зарегистрирован: 12.11.2021

напряжение на PIN 32 появляется при нажатии на кнопку. а реакции нет

Kakmyc
Offline
Зарегистрирован: 15.01.2018

В общем проблема твоя в том, что ты объявил объект локально.
Он создаётся в каждом цикле и уничтожается в конце цикла. Ты его либо обьяви как static(за результат не ручаюсь) либо сделай глобальным(вынеси из цикла loop строку 242, а 4 следующие строки перенеси в setup)
В общем учи матчасть. Желательно без участия гивера и его говноуроков.

alexey80
Offline
Зарегистрирован: 12.11.2021

243 опрос
247 проверка на длительное нажатие
265 одинарное нажатие
268 двойное нажатие
271 тройное нажатие

alexey80
Offline
Зарегистрирован: 12.11.2021

Спасибо. Попробую

Kakmyc
Offline
Зарегистрирован: 15.01.2018

243 нужно оставить в цикле loop

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Столько мусора и воды в используемой библиотеке...

http://arduino.ru/forum/pesochnitsa-razdel-dlya-novichkov/biblioteka-kak...

Вот тут ссылка есть на библиотеку простую до ужаса.
Один метод read() и тот же функционал.
До ресурсов совсем не жадная , 8 байт(может 9, точно не помню) ОЗУ на экземпляр кнопки и байт 180 флеша на саму библиотеку.

b707
Offline
Зарегистрирован: 26.05.2017

это говнокод в самом худшем виде.... я про код ТС

alexey80
Offline
Зарегистрирован: 12.11.2021

что такое код ТС?

b707
Offline
Зарегистрирован: 26.05.2017

alexey80 пишет:

что такое код ТС?

код - это код, а ТС - это вы.

"код ТС" - это та программа, что вы тут выложили чуть выше

alexey80
Offline
Зарегистрирован: 12.11.2021

боюсь узнать расшифровку аббревиатуры ТС

alexey80
Offline
Зарегистрирован: 12.11.2021

занялся этим 2 недели назад без знаний совершенно

b707
Offline
Зарегистрирован: 26.05.2017

alexey80 пишет:

занялся этим 2 недели назад без знаний совершенно

вы знаете, это очень заметно. Не приходила в голову мысль какую-то книжку почитать сначала?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

alexey80 пишет:

боюсь узнать расшифровку аббревиатуры ТС

ТС = Topic starter, то бишь зачинщик срачика

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

alexey80 пишет:

занялся этим 2 недели назад без знаний совершенно

Так а пошто в ардуино-то сразу?  Начал бы лучше с хирургии, там теперь и без знаний люди работают. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:
Начал бы лучше с хирургии, там теперь и без знаний люди работают.
Хирургия - неактуально! С вирусологии надо!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Мегавольт пишет:

Ща... тебе тут навтыкают...  Во-первых за Гайвера, во-вторых за отсутствие кода.... В-третьих просто так.... что б знал "своё место".... Потому как прикреплённую тему то не прочитал :-)   

На самом деле:

В-третьих - за отсутствие схемы, в четвертых - за отсутствие фото. 

Ибо, судя по описанию, имеет место обычная ошибка монтажа.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

andriano пишет:

Ибо, судя по описанию, имеет место обычная ошибка монтажа.

Да не, там объект объявлен локально в loop без учёта времени жизни.
Стр 242

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

alexey80 пишет:

занялся этим 2 недели назад без знаний совершенно

Так а пошто в ардуино-то сразу?  Начал бы лучше с хирургии, там теперь и без знаний люди работают. 

вот не надо вот, там цена ошибки какая?, а тут максимум запиленная ардуина, приветствовать надо начинания, человек за две недели 300 строк кода одолел, код это не картины, главное чтобы работал без ошибок, а память ОЗУ и ФЛЭШ это совсем не то, что можно передать по наследству...

PS А красоту кода (какие краски, какая экспрессия) как и в живописи понимают немногие...и скажи мне где живопись, а где покраска фасадов и заборов... )))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Kakmyc пишет:
andriano пишет:

Ибо, судя по описанию, имеет место обычная ошибка монтажа.

Да не, там объект объявлен локально в loop без учёта времени жизни. Стр 242

Обсуждаемое сообщение:

alexey80 пишет:

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

Где здесь стр. 242?

Если дивайс работает на отладочной плате, а после сборки не работает, при этом в сообщении не приведены ни код, ни схема, то первое подозрение - на качество сборки.

Kakmyc
Offline
Зарегистрирован: 15.01.2018

andriano пишет:

Где здесь стр. 242?

Если дивайс работает на отладочной плате, а после сборки не работает, при этом в сообщении не приведены ни код, ни схема, то первое подозрение - на качество сборки.

Чем не устраивает код в #4 ?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Слишком много ненужного.

alexey80
Offline
Зарегистрирован: 12.11.2021

Код переделал. Из цикла перенёс. Все заработало. Качество сборки в норме. Просто экспериментировал с кодом. Хотел использовать этот код а кнопки подключить к одному аналоговому входу. В цикле if хотел объявлять кнопку и тут же ее опрашивать. Не вышло, или тямы не хватило. Вернул все обратно и получилось. В самом начале не подтянул в монтаже дома. На стенде подтятутые работали. Мысль вместо подтяжки была про сопротивление проводов при монтаже. В общем вышел из цикла и подтянул кнопки. Все работает. Спасибо за советы.

alexey80
Offline
Зарегистрирован: 12.11.2021

Пытаюсь осилить w5500 и sim800l. Не могу добиться обратной связи. Подскажите пожалуйста куда двигаться? Нужно ли новую тему открыть?

alexey80
Offline
Зарегистрирован: 12.11.2021

Кстати эти манипуляции тоже присутствуют в коде. В коде ТС

alexey80
Offline
Зарегистрирован: 12.11.2021

Пытаюсь осилить w5500 и sim800l. Не могу добиться обратной связи. Подскажите пожалуйста куда двигаться? Нужно ли новую тему открыть?

b707
Offline
Зарегистрирован: 26.05.2017

Советую переместится со своими вопросами на форум гайвера, где как не там вам смогут обьяснить все нюансы его кода

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Мегавольт пишет:

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

нет, как раз наоборот, про всех не скажу, но критикуют его те, кто умеет составлять олимпийские задачи по программированию...программу на олимпиаде напишут все, а победитель определяется когда программе "скармливают" определенные входные условия, вот в программах и библиотеках у Гайвера с этим проблемы, а так то они работают, в принципе...ИМХО (мнение ненастоящего сталевара)

MaksVV
Offline
Зарегистрирован: 06.08.2015

ua6em пишет:
.....программах и библиотеках у Гайвера .... а так то они работают, в принципе...ИМХО

до поры до времени...

Green
Offline
Зарегистрирован: 01.10.2015

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

rkit
Offline
Зарегистрирован: 23.11.2016

Green пишет:

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

Потому что чем глубже знания тем уже аудитория.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мегавольт пишет:
Чем же он Вам тут не угодил? Тем , что доносит информацию лучше ? Тем что знает и умеет больше Вас?
В корень зрите! От зависти это всё! :-)

lilik
Offline
Зарегистрирован: 19.10.2017

Вот ответ от самого про всякие обвинения. Так что по библиотекам не все шишки в его огород :-)

Он реальный популяризатор, а не спец.  

https://alexgyver.ru/inside/

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Мегавольт пишет:

вот вы бы по делу что то посоветовали.... Вот это было бы зачётно. 

Сказали же - советы по делу дают форуме Гайвера, а не тут. Переходи туда лучше.

rkit
Offline
Зарегистрирован: 23.11.2016

Jeka_M пишет:

Мегавольт пишет:

вот вы бы по делу что то посоветовали.... Вот это было бы зачётно. 

Сказали же - советы по делу дают форуме Гайвера, а не тут. Переходи туда лучше.

Нет, не дают. Нигде не делают чужую работу бесплатно.