Автор Тема: Продвинутый контроллер для гидропоники на Arduino Mega + Wemos  (Прочитано 1075 раз)

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
Этап 21. Питание.
При подключении вылезла пара моментов.
Во-первых, Мегу я питаю 12 вольтами, в ней стоит стабилизатор LM1117, который снижает их до 5 вольт. Вот он в этом месте стоит.

Если бы была одна Мега, проблем бы не возникло, но мы через Мегу питаем еще и Вемос, который довольно прожорлив, в пике до 200мА может потреблять. Таким образом на нашем стабилизаторе рассеивается до 3 ватт, вследствие чего он очень сильно греется.
Поэтому пришлось приклеить к нему радиатор. Под рукой из подходящего только звезда от светодиода была:

На радиаторе сейчас до 60 градусов. Без него точно перегорел бы.

Далее. Печку я питаю от 12 вольт, которые беру с Меги (а она напрямую с БП). Но эти 12 вольт проходя к пину, идут по тонкой дорожке, вследствие чего эта сторона тоже грелась при 500мА. Потом я увеличил мощность печки до примерно 1А (на сборке Дарлингтона для этого пустил два канала в параллель), пускать такую нагрузку до дорожке Меги явно не следовало.
Поэтому завел питание напрямую от БП, подпаял к разъему на Меге пару проводков:






Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
Этап 22. Добавляем индикацию и ручное управление в веб-морду.
Сразу скажу, что всё-таки вернулся к идее с iframe. Причина - при обновлении страницы, она обновляется, не получая новых данных от Вемоса.
Добавил в веб-морду индикацию и ручное управление.
Во-первых, полезно знать, что в данный момент происходит в коллайдере.
Во-вторых, есть необходимость вручную управлять ЛЕДами и помпой. По ЛЕДам - возможность отключить красные/синие и включить только белые (для "селфи"). По помпе, в моменты когда я меняю раствор, нужна гарантия, что в самый неподходящий момент помпа не включится и все не польется на меня (бывало и такое).
Ну и по вентилятору просто индикация, работает или нет.

На сайте это не сложно:
В начале, когда мы на РНР разбирали GET-запрос, добавляем проверку состояния нужных переменных и объявляем переменные с именем изображения, которое браузер поставит в качестве фона.
                if($manual == 1) {$fon_manual = "manual";}
      else {$fon_manual = "auto";}
      if($r == 1) {$fon_red = "red";}
      else $fon_red = "black";
      if($b == 1) {$fon_blue = "blue";}
      else $fon_blue = "black";
      if($w == 1) {$fon_white = "white";}
      else $fon_white = "black";

      if($c_on == 1) {$fon_fan = "fan_on";}
      else $fon_fan = "fan_off";

      if($p_manual == 1) {$fon_pompa_manual = "pump_manual";}
      else $fon_pompa_manual = "pump_auto";
      if($p_flag == 1) {$fon_pompa = "pompa_on";}
      else $fon_pompa = "pompa_off";


Далее делаем соответсвующие блоки (подставляем РНР-переменные с именем изображения-фона):
                <div id="block_upravlenia">
          <div id="manual_led" onclick="click_led_manual()" style="background-image: url(images/<?php echo $fon_manual ?>.png);"></div>
          <div id="red_led" onclick="click_led_red()" style="background-image: url(images/<?php echo $fon_red ?>.png);"></div>
          <div id="blue_led" onclick="click_led_blue()" style="background-image: url(images/<?php echo $fon_blue ?>.png);"></div>
          <div id="white_led" onclick="click_led_white()" style="background-image: url(images/<?php echo $fon_white ?>.png);"></div>
          <div id="fan" style="background-image: url(images/<?php echo $fon_fan ?>.png);"></div>
          <div id="manual_pompa" onclick="click_pompa_manual()" style="background-image: url(images/<?php echo $fon_pompa_manual ?>.png);"></div>
          <div id="pompa" onclick="click_pompa()" style="background-image: url(images/<?php echo $fon_pompa ?>.png);"></div>
       </div>


И прописываем обработчики для них (в файле index.php, поскольку используются куски РНР):
<script type="text/javascript">
      function click_led_manual(){
         var v = <?php echo 1-$manual ?>;
         document.location.href = "http://192.168.0.84/set?m="+v;
      };
      function click_led_red(){
         var v = <?php echo 1-$r ?>;
         document.location.href = "http://192.168.0.84/set?r="+v;
      };
      function click_led_blue(){
         var v = <?php echo 1-$b ?>;
         document.location.href = "http://192.168.0.84/set?b="+v;
      };
      function click_led_white(){
         var v = <?php echo 1-$w ?>;
         document.location.href = "http://192.168.0.84/set?w="+v;
      };
      function click_pompa_manual(){
         var v = <?php echo 1-$p_manual ?>;
         document.location.href = "http://192.168.0.84/set?Pm="+v;
      };
      function click_pompa(){
         var v = <?php echo 1-$p_flag ?>;
         document.location.href = "http://192.168.0.84/set?Pflag="+v;
      };
   </script>


В общем реализация незамысловатая. Вот так получилось, не Рубенс, конечно, но функции выполняет (слева и справа разные состояния кнопок):

Оффлайн PowerTech

  • Serrano
  • ***
  • Сообщений: 170
  • Лойсы: +11/-0
  • Василий
    • Просмотр профиля
Отлично вышло   :good:, жаль что это всё целиком не запихнуть на wemos, по крайней мере не с моими знаниями веб программирования.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
Отлично вышло   :good:, жаль что это всё целиком не запихнуть на wemos, по крайней мере не с моими знаниями веб программирования.
Ну, теоретически можно и запихнуть, хранить страницу в PROGMEM и кусками выдавать. И даже небольшие картинки. Правда проще наверное будет болгарку зубами остановить :D
А вообще смысла запихивать не вижу абсолютно никакого.  Эта модель, которая у меня получилась, очень мне по душе. Вемос по сути является просто передатчиком. Принимает инфу от Меги и сразу отсылает на сервер, не разбирая что там, принимает команды от сервера и просто пересылает их в Мегу. Минимум головняков и рисков (даже если подвиснет, Мега продолжит работу в штатном режиме), на сервере свобода действий неограничена, да и удовольствия от веб-кодинга для сервера и для Вемоса, мягко говоря, две большие разницы.
Поэтому рекомендую, веб-программирование не такое сложное, как кажется. По крайней мере разобраться, как нарисовать пару кнопок и повесить на них функцию-обработчик труда не составит никакого.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
Этап 23. Добавляем интерактивности в веб-морду с помощью Ajax.
Давно мне хотелось копнуть Ajax, но все как-то не было подходящих проектов, а тут как раз случай.
Ajax - это технология запросов на другие страницы без перезагрузки самой страницы.
До этого момента я всегда делал мертвые статичные страницы для Вемоса, т.е. если хочешь получить обновленные данные, должен перезагрузить страницу.
С помощью Ajax же можно делать фоновые запросы в Вемос, получать от него инфу, и менять показания на уже загруженной странице.
Страница как бы становится живой, циферки меняются, ты в режиме реального времени смотришь на меняющиеся показания датчиков, управляешь, ощущения шикарные, как-будто смотришь на ардуиновский дисплей, наблюдая в реалтайме за тем, что происходит внутри.
А стоит буквально переделывания пары строк.
Во первых добавим в Вемос маленькую функцию
void handleData() {
  String s;
  for (int i = 0; i < 30; i++){
    s += receive_array [i ];
    s += ",";
    }
  server.send(200, "text/plain", s);
}
Если мы обратимся к Вемосу вот так: 192.168.0.84/data, то вместо веб-морды он нам выдаст просто строку с данными. Вот так это выглядит (скопировал прямо с браузера):
27.95,52.20,751.72,29.81,382.99,12,8,0,0,0,1,30,28,0,60,100,2000,1,1,60,5,1,0,23,9,6,1

Теперь в javascript в функции, которая вызывается сразу после загрузки страницы мы устанавливаем таймер, который тикает раз в секунду бесконечно.
При каждом тике таймера происходит этот самый Ajax-запрос на 192.168.0.84/data, в ответ мы получаем строку данных. Разбиваем её на отдельные значения и заносим в массив.
Затем меняем показания на странице согласно этим значениям. Получается показания всех датчиков у нас проверяются и меняются раз в секунду.
window.onload = function(){
var timer = setInterval(function() {
  $.ajax({
    url: "http://192.168.0.84/data",
    success: function(data){
       
        arr = data.split(',');
        document.getElementById('temp').innerHTML = arr[0]+" °С";
        document.getElementById('hum').innerHTML = arr[1]+" %";
        document.getElementById('baro').innerHTML = arr[2]+" mm";
        document.getElementById('temp_dallas').innerHTML = arr[3]+" °С";
        document.getElementById('ppm').innerHTML = arr[4]+" ppm";

        document.getElementById('red').innerHTML = arr[5]+" часов";
        document.getElementById('blue').innerHTML = arr[6]+" часов";

        document.getElementById('carlson_temp').innerHTML = arr[12]+" °С";
        document.getElementById('carlson_np').innerHTML = arr[13]+" %";
        document.getElementById('carlson_dp').innerHTML = arr[14]+" %";
        document.getElementById('carlson_ep').innerHTML = arr[15]+" %";
        document.getElementById('carlson_f').innerHTML = arr[16]+" минут";
        document.getElementById('carlson_d').innerHTML = arr[17]+" минут";

        document.getElementById('freq').innerHTML = arr[19]+" минут";
        document.getElementById('dlit').innerHTML = arr[20]+" минут";

        document.getElementById('podogrev_data').innerHTML = arr[11] +" °С";
        document.getElementById('time').innerHTML = arr[23] + ":" + arr[24] + ":" + arr[25];

        if (arr[10] == "1") {document.getElementById("manual_led").style.backgroundImage ="url(images/manual.png)";}
        else {document.getElementById("manual_led").style.backgroundImage ="url(images/auto.png)";}

        if (arr[7] == "1") {document.getElementById("red_led").style.backgroundImage ="url(images/red.png)";}
        else {document.getElementById("red_led").style.backgroundImage ="url(images/black.png)";}

        if (arr[8] == "1") {document.getElementById("blue_led").style.backgroundImage ="url(images/blue.png)";}
        else {document.getElementById("blue_led").style.backgroundImage ="url(images/black.png";}

        if (arr[9] == "1") {document.getElementById("white_led").style.backgroundImage ="url(images/white.png)";}
        else {document.getElementById("white_led").style.backgroundImage ="url(images/black.png";}

        if (arr[18] == "1") {document.getElementById("fan").style.backgroundImage ="url(images/fan_on.png)";}
        else {document.getElementById("fan").style.backgroundImage ="url(images/fan_off.png)";}

        if (arr[21] == "1") {document.getElementById("manual_pompa").style.backgroundImage ="url(images/pump_manual.png)";}
        else {document.getElementById("manual_pompa").style.backgroundImage ="url(images/pump_auto.png)";}

        if (arr[22] == "1") {document.getElementById("pompa").style.backgroundImage ="url(images/pompa_on.png)";}
        else {document.getElementById("pompa").style.backgroundImage ="url(images/pompa_off.png)";}
       
    }
});
}, 1000);
};
Также проверяется состояние светодиодов, помпы, вентилятора, и в зависимости от них (включены или выключены) ставятся соответсвующие фоновые картинки на наши управляющие кнопки.

Также обработчики нажатий кнопок чуть изменяем под Ajax-запрос.
function click_setup(){
var date = new Date();
var s = "http://192.168.0.84/set?" +
'Th='+date.getHours()+'&'+
'Tm='+date.getMinutes()+'&'+
'Ts='+date.getSeconds()+'&';
if(document.getElementById('inp_red').value != "") s+='Red='+document.getElementById('inp_red').value+'&';
if(document.getElementById('inp_blue').value != "") s+='Blue='+document.getElementById('inp_blue').value+'&';
if(document.getElementById('inp_freq').value != "") s+='Pf='+document.getElementById('inp_freq').value+'&';
if(document.getElementById('inp_dlit').value != "") s+='Pd='+document.getElementById('inp_dlit').value+'&';

if(document.getElementById('inp_calibr').value != "") s+='calibration='+document.getElementById('inp_calibr').value+'&';
if(document.getElementById('inp_podogrev').value != "") s+='rastvor='+document.getElementById('inp_podogrev').value+'&';

if(document.getElementById('inp_c_temp').value != "") s+='Ct='+document.getElementById('inp_c_temp').value+'&';
if(document.getElementById('inp_c_night').value != "") s+='Cnp='+document.getElementById('inp_c_night').value+'&';
if(document.getElementById('inp_c_day').value != "") s+='Cdp='+document.getElementById('inp_c_day').value+'&';
if(document.getElementById('inp_c_extrime').value != "") s+='Cep='+document.getElementById('inp_c_extrime').value+'&';
if(document.getElementById('inp_c_freq').value != "") s+='Cf='+document.getElementById('inp_c_freq').value+'&';
if(document.getElementById('inp_c_dlit').value != "") s+='Cd='+document.getElementById('inp_c_dlit').value+'&';

$.get(s);
};


function click_led_manual(){
var v = 1-arr[10] ;
$.get("http://192.168.0.84/set?m="+v);
};

function click_led_red(){
var v = 1-arr[7] ;
$.get("http://192.168.0.84/set?r="+v);
};

function click_led_blue(){
var v = 1-arr[8] ;
$.get("http://192.168.0.84/set?b="+v);
};

function click_led_white(){
var v = 1-arr[9] ;
$.get("http://192.168.0.84/set?w="+v);
};

function click_pompa_manual(){
var v = 1-arr[21] ;
$.get("http://192.168.0.84/set?Pm="+v);
};

function click_pompa(){
var v = 1-arr[22] ;
$.get("http://192.168.0.84/set?Pflag="+v);
};
И кстати, теперь мы можем убрать абсолютно весь РНР-код, больше он нам не нужен, все на чистом javascript (ну понятно с jQuery, куда ж без него).
Рекомендую, на порядок приятнее пользоваться такой веб-мордой, ощущения, что работаешь не с ограниченной браузерной страницей, а с полноценной программой, специально написанной для Вемоса.
« Последнее редактирование: 30 Ноябрь 2017, 02:28:50 от Ann »

Оффлайн Ouroboros

  • Pimento
  • *
  • Сообщений: 49
  • Лойсы: +0/-0
    • Просмотр профиля
Я вот пытаюсь понять как оно у Вас вкупе работает. Есть сайт с коллайдером, есть веб-морда вемос. Куда инфу шлет девайс?) И где хранится история показаний? И зачем вообще на девайсе сервак поднимать (ддос из интернета передает привет)?

P.S.: GET для отправки данных это хня, POST наше всё.

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
Я вот пытаюсь понять как оно у Вас вкупе работает. Есть сайт с коллайдером, есть веб-морда вемос. Куда инфу шлет девайс?) И где хранится история показаний? И зачем вообще на девайсе сервак поднимать (ддос из интернета передает привет)?
Есть веб-морда, которая выдается при заходе на локальный адрес Вемоса (с облачной частью, которая хранится на моем сервере). С помощью веб-морды мы можем смотреть текущие показания, изменять настройки и управлять. На веб-морду можно зайти только дома (поскольку у меня нет белого IP, а костыли по превращению динамического в статический я еще не пробовал, да и необходимости пока нет, может потом как-нибудь, под настроение).
Кроме того, есть сайт-коллайдер, куда Вемос раз в пять минут шлет статистику, там она заносится в базу MySQL, где и хранится. Ну и выдается при заходе на сайт в виде графиков, табло. Управлять нельзя, только отображение информации.

Сейчас только подумал: в принципе Вемос в отображении веб-морды (самой страницы) может и не принимать участия, можно сразу заходить на облачный сайт. Единственное, ему остается только выдавать инфу при запросе на 192.168.0.84/data. 

P.S.: GET для отправки данных это хня, POST наше всё.
А в чем принципиальное преимущество POST-метода над GET-методом при отправке пары десятков байт информации ?

Оффлайн alex_step

  • Serrano
  • ***
  • Сообщений: 162
  • Лойсы: +5/-0
  • Александр, Украина, Жмеринка
    • Просмотр профиля
Этап 8. TDS-метр.
тут бы пины объявить вверху - чтоб было легко изменить в одном месте, а не по всему коду отыскивать...

Этап 3. Часы.
Этап 8. Реле LED-освещения.
тут часы в обоих присутствуют - и похоже Klimat нужно бы переделать в DHT

и два 8-ых этапа - тоже не комильфо  ;)

пин 37 зарезервирован под Rele, но не используется
« Последнее редактирование: 11 Декабрь 2017, 14:41:00 от alex_step »

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
Ну а как ты хотел, наваять 500 строка кода (а если добавить и серверную часть, то под 2000) и чтоб не было ни одного ляпа?  :D

Я там много переделок делал, я ж говорил, хочу убедиться в стабильности работы, чтоб потом выложить окончательные варианты.
А скетч для Вемоса практически полностью переписал, теперь его основаная работа состоит всего из 3 строк: 1 строка - прием данных вемоса, 1 строка - примем и передача команд в Мегу, 1 строка - отправка данных на сервер.

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

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

Оффлайн alex_step

  • Serrano
  • ***
  • Сообщений: 162
  • Лойсы: +5/-0
  • Александр, Украина, Жмеринка
    • Просмотр профиля
Этап 10. Повышаем точность датчиков.

В TDS:
 tds_array[tds_array_index] = tds_calibration * 1000 / (tds_res);
      tds_array_index++;
      if(tds_array_index > 99) {
        tds_array_index = 0;
        tds_ppm = Mediana(tds_array, 100, 20);
        }   
tds_calibration не объявлена. и вообще ничего не понятно что заменить - там было два разнополярных замера, а тут совсем третье...
так же и в Dallas


Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
Видимо забыл указать tds_calibration.
Смотри итоговый скетч Меги из 14 этапа. Все работоспособно.

По ТДС, там двухполярный замер и остался, просто я указал, что добавить и изменить, думал, это понятно будет и так.
     //--------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] = tds_calibration / (tds_res);
      tds_array_index++;
      if(tds_array_index > 99) {
        tds_array_index = 0;
        tds_ppm = Mediana(tds_array, 100, 20);
        }     
     
     
      //Serial.println("          TDS1:" + (String)tds );
        //Serial.println("          tds_volt:" + (String)tds_volt );
          //Serial.println("          tds_res:" + (String)tds_res );
           
   
   TDS_last_time = millis();
  }
}

Оффлайн alex_step

  • Serrano
  • ***
  • Сообщений: 162
  • Лойсы: +5/-0
  • Александр, Украина, Жмеринка
    • Просмотр профиля
Цитировать
//LED-пины
-> не понятно какой к чему и для какого света

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
Цитировать
//LED-пины
-> не понятно какой к чему и для какого света
Ну, из этого куска, вроде как должно быть понятно:
      digitalWrite(31, red);
      digitalWrite(39, red);
      digitalWrite(33, blue);
      digitalWrite(41, blue);
      digitalWrite(35, white);

И я их потом все переиначил, когда уже подключал на месте.

Оффлайн alex_step

  • Serrano
  • ***
  • Сообщений: 162
  • Лойсы: +5/-0
  • Александр, Украина, Жмеринка
    • Просмотр профиля
нууууууу.....
в комплексе: два синих и два красных - не понятно который к чему, а комментариев нет
(у меня то другой "набор", но в любом случае кому другому понять что тут к чему совсем не просто => и либо копируй 1:1, либо атакуй автора вопросами)
а финальные скетчи есть?
а пока тут складываю все элементы по этапам нашел что таки нужно объявлять еще многие моменты для облегчения возможности наследования с модернизацией

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
нууууууу.....
в комплексе: два синих и два красных - не понятно который к чему, а комментариев нет
(у меня то другой "набор", но в любом случае кому другому понять что тут к чему совсем не просто => и либо копируй 1:1, либо атакуй автора вопросами)
а финальные скетчи есть?
а пока тут складываю все элементы по этапам нашел что таки нужно объявлять еще многие моменты для облегчения возможности наследования с модернизацией
Я ж там писал, что у меня в перспективе 3 лампы, которые работают на разных напряжениях, одна на три канала на 19 вольт, вторая (красная) на 42 вольтах, третья - (больше синяя) на 220вольтах, поэтому одним реле их выключать нельзя, пришлось заюзать по два реле на синий и красный канал. У других не думаю, что будет такая же ситуация, в любом случае пины под себя настроить, я думаю, это не проблема.
Тем более там по названиям переменных понятно, какой блок за что отвечает:
  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(33, HIGH);
      digitalWrite(35, HIGH);
      digitalWrite(41, HIGH);
      blue= 1;
    }else{
      digitalWrite(33, LOW);
      digitalWrite(35, LOW);
      digitalWrite(41, LOW);
      blue= 0;
    }

Оффлайн alex_step

  • Serrano
  • ***
  • Сообщений: 162
  • Лойсы: +5/-0
  • Александр, Украина, Жмеринка
    • Просмотр профиля
 :D
это тебе понятно что ты куда подключил...
и ты вот ну никак не хочешь просто и понятно написать в коде распиновку (для тех кто впервые код видит)
а после всех пояснений так и не понятно: 5 пинов - 3 канала на 19 Вольт + красный на 42 Вольт + синий на 220 Вольт => а в коде красный двумя пинами и синий тремя пинами...
« Последнее редактирование: 11 Декабрь 2017, 16:38:42 от alex_step »

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
:D
это тебе понятно что ты куда подключил...
и ты вот ну никак не хочешь просто и понятно написать в коде распиновку (для тех кто впервые код видит)
а после всех пояснений так и не понятно: 5 пинов - 3 канала на 19 Вольт + красный на 42 Вольт + синий на 220 Вольт => а в коде красный двумя пинами и синий тремя пинами...
Белый канал работает синхронно с синим в крейсерском режиме. Я его отдельно вывел, чтобы вручную можно отдельно для селфи включить.

Оффлайн alex_step

  • Serrano
  • ***
  • Сообщений: 162
  • Лойсы: +5/-0
  • Александр, Украина, Жмеринка
    • Просмотр профиля
воОот! а ты об это м и не упомянул... и пойди тут догадайся...
в любом случае пины под себя настроить, я думаю, это не проблема.
прописать - не проблема. проблема проматывать всю простыню выискивая ВСЕ места где указать пины

Оффлайн Ann

  • Глобальный модератор
  • Habanero
  • *****
  • Сообщений: 1514
  • Лойсы: +118/-0
    • Просмотр профиля
проблема проматывать всю простыню выискивая ВСЕ места где указать пины
Юзай Code Folding, удобная штука. Файл > Настройки > Включить сворачивание кода

Оффлайн alex_step

  • Serrano
  • ***
  • Сообщений: 162
  • Лойсы: +5/-0
  • Александр, Украина, Жмеринка
    • Просмотр профиля
Цитировать
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
это про кого?