1 2 3 4 5 6 7 8 9 10 9/10 9,18оценок: 11

Контроллер для теплицы на Arduino

Тема в разделе "Теплицы и парники", создана пользователем Cofessor, 20.10.15.

Статус темы:
Закрыта.
  1. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Почему?
    Так в блоке питания уже стоят. Я просто уже на плате хочу добавить для исключения пико-всплесков.
    В каких именно?
    Так это для другой цели, чтобы минимизировать питание МК и питать его от мини аккумулятора, и попутно это защитит МК от сетевых помех.
    Вовсе нет. Все выводы +5V и GND соединены между собой внутри МК, проверьте прозвонкой.
    Сгорят рано или поздно. Тогда уж лучше стабилитроны. Но TVS - идеал, отличаются гигантской поглощаемой мощностью и сверхбыстродействием.
    Нано пока меня вполне устраивают.
     
  2. timon2006
    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356

    timon2006

    Живу здесь

    timon2006

    Живу здесь

    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356
    Потому, что прошедшая помеха, или программный глюк может их выключить точно также, как Вы их включаете.

    Налицо нежелание ознакомиться с шикарнейшими книгами товарищей Хилла и Хоровица:).
    К узлу схемы питание и GND подводятся через блокирующий конденсатор, который ставится максимально близко к соответствующим пинам этого узла.

    Если не ошибаюсь, на плате ардуино нано стоит линейный стабилизатор. Если выкинуть ардуинскую плату и сделать свою, попутно разместив там нормальный импульсный стаб, то получите возможность немного:) подольше питать МК от аккумулятора, заодно улучшите защиту от сетевых помех.
    Практически все дисплеи имеют sleep режим. Если Ваш не имеет, или этот режим Вас не устраивает, пмсм, проще поставить ключ на питание дисплея и выключать его, когда не нужен. Периферией управляет МК, что ему мешает выставить уровни (отправить команды), деактивирующие периферию?

    Если не секрет, где у Вас "гигантская" мощность, которую нужно поглотить, да еще и выделяющаяся сверхбыстро? :)

    Ну, если куча лишнего устраивает...
     
    Последнее редактирование: 22.12.16
  3. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Согласен, но мне проще соединить их с GND.
    Думаю что действительно не стоит, ведь всех узлов то - RTC да МК. Просто поставлю 3-4 кондюка на шины питания, естественно, не за 3 км от выводов.
    Нет, на это мы не пойдём, уже писал что все схемы в ближайшем будущем буду делать на нано. А вот гасить экран - вообще не проблема - завести команду включения подсветки при нажатии любой клавиши. Опто-реле запитать от "грязного" в этой версии уже не получится, потому что оно тоже от +5V, а исполнительные механизмы от +12v и от ~220.
    Я говорю об ЭДС самоиндукции при выключении индуктивностей.
     
  4. timon2006
    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356

    timon2006

    Живу здесь

    timon2006

    Живу здесь

    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356
    А теперь, зная, что направление пина (вход-выход) также переключается программно, предположим, что глюк переключил пин, соединенный с GND, на выход в 1:).

    Дело, конечно, хозяйское, но, пмсм, лучше будет своя платка универсального контроллера, типа этого: https://www.forumhouse.ru/attachments/4548497/
    никто же не мешает оформить ардуинские прибамбасы типа FTDI и USB в виде отдельного прибора (программатора:))
    Пмсм, нужно не только подсветку гасить, но и контроллер дисплея отключать.

    Какой-нибудь 1N4001 (рубль ведро:)) решит все проблемы с самоиндукцией.
     
  5. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Да, ты прав, а сам как делаешь - все свободные выводы сажаешь через резисторы на + или -? Может, проще оставить их висящими? Или же, по уже знакомому сценарию, в результате сбоя может выработаться какая-нибудь случайная команда, которая считает этот вход и может повлиять на работу программы?
    Да любая ардуинка может выполнять функции такого программатора. Ещё и 2 кб из-под bootloader-а освободится. Но, я полагаю, для меня пока это не актуально, в дальнейшем - может быть.
    Я просто написал про то, что нужно сделать в первую очередь, поскольку подсветка много жрёт. Пирог, как говорят, надо кусать с краю.
    Сомневаюсь. А что, tvs тебя разорит? Тоже копейки стоит, но сделает работу намного чище и надёжней и по габаритам не больше. В конце концов, он разработан специально для этих целей.
     
  6. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Вот окончательный канонический вариант программы:
    Код:
    #include "DHT.h"            //библ. для датчика DHT22
    #include <LiquidCrystal.h>  //библ. для дисплея LCD1602
    #include <OneWire.h>        //библ. для датчика DS18B20
    #include <DS1307.h>         //библ. для RTC
    DS1307 rtc(A4,A5);
    OneWire ds(A2);             //DS18B20 подключен к A2
    LiquidCrystal lcd(8,9,10,11,12,13);
    #define DHTPIN A1           //DHT22 подключен к А1
    #define DHTTYPE DHT22
    DHT dht(DHTPIN,DHTTYPE);    //Создаём объект dht
    byte l_kr[8]={0x3,0x5,0x5,0x9,0x9,0x9,0x11,0x0};       //Русские символы
    byte p_kr[8]={0x1f,0x11,0x11,0x11,0x11,0x11,0x11,0x0};
    byte grad_kr[8]={0x6,0x9,0x9,0x6,0x0,0x0,0x0,0x0};
    byte u_kr[8]={0x11,0x11,0x11,0xf,0x1,0x11,0xe,0x0};
    byte d_kr[8]={0x2,0x6,0xa,0xa,0xa,0xa,0x1f,0x11};
    byte i_kr[8]={0x11,0x11,0x11,0x13,0x15,0x19,0x11,0x11};
    byte g_kr[8]={0x1f,0x11,0x10,0x10,0x10,0x10,0x10,0x10};
    float t,h,TReading,TempLSB,TempMSB2;                   //Переменные для датчиков
    long prevMillis=0,prevMillis1=0,prevMillis2=0,prevMillis3=0,prevMillis4=0,prevMillis5=0; //Начала отсчёта времён
    byte t_heat=15,t_close=25,t_open=27,t_cool=30;        //пороговые значения температур
    byte hhourW1,lhourW1,hminW1,lminW1;                   //часы и минуты включения полива
    byte hhourW2,lhourW2,hminW2,lminW2;                   //часы и минуты выключения полива
    byte hhourL1,lhourL1,hminL1,lminL1;                   //часы и минуты включения освещения
    byte hhourL2,lhourL2,hminL2,lminL2;                   //часы и минуты выключения освещения
    byte present=0,i,j,flag,param=0,waterInterv,currentWInterv;
    
    int TempMSB,key;
    
    void setup(){//Здесь добавить включение/выключение подсветки
      rtc.halt(false);             //Инициализация и установка часов
      rtc.setDOW(SUNDAY);          //Установлено воскресенье
      rtc.setTime(17,8,0);         //Время в 24ч формате
      rtc.setDate(8,12,2015);      //Дата
      rtc.setSQWRate(SQW_RATE_1);  //Установить SQW, выход на 1 Гц,
      rtc.enableSQW(true);         //включить SQW
      lcd.createChar(1,l_kr);      //Знак Л
      lcd.createChar(2,p_kr);      //Знак П
      lcd.createChar(3,grad_kr);   //Знак градуса
      lcd.createChar(4,u_kr);      //Знак У
      lcd.createChar(5,d_kr);      //Знак Д
      lcd.createChar(6,i_kr);      //Знак И
      lcd.createChar(7,g_kr);      //Знак Г
      lcd.begin(16,2);             //Инициализация LCD1602
      dht.begin();                 //Инициализация DHT22
    }
    void loop() {
      if(millis()-prevMillis>2000)_DHT21();     //Опрос датчика температуры и влажности DHT21 1 раз за 2 сек
      if(millis()-prevMillis1>1000)DS18B20();   //Опрос датчика температуры DS18B20 1 раз в сек
      if(millis()-prevMillis2>1000)actuators(); //Управление исполнительными механизмами
      if(millis()-prevMillis3>200)menu();       //Выбор меню
      if(analogRead(A0)<1000) {      //Нажатие кнопки
        prevMillis4=millis();        //Сброс счётчика тайм-аута
        int knopka();                //Уход на процедуру обработки нажатия кнопки
        key=knopka();                //Сохранили № кнопки
        if(key==1)param++;           //Движение по меню вперёд
        if(key==3)param--;           //Движение по меню назад
        if(key==2)flag=1;    }       //Установка параметров
      if(flag!=0)setParameters();    //
      if(millis()-prevMillis4>60000)param=0;//Если нет нажатий минуту - возврат в осн. меню
    } //End LOOP
    //-------Управление исполнительными механизмами------------------------
    void actuators(){
      prevMillis2=millis();
      DDRD=DDRD|B00111100;        //Настроить разряды порта D (2-5) на вывод
    //Управление ИМ по времени
      const Time& temp=rtc.getTime();       //Считываем текущее время и дату:
      int hour=temp.hour;                   //часы
      int min=temp.min;                     //и минуты
    //  int date=temp.date;                 //число      
    //  int mon=temp.mon;                   //месяц
    //  int year=temp.year;                 //год
    //Уставки времени включения/выключения досветки
      int lHour1=hhourL1*10+lhourL1;        //Часы включения
      int lMin1=hminL1*10+lminL1;           //Минуты включения
      int lHour2=hhourL2*10+lhourL2;        //Часы выключения
      int lMin2=hminL2*10+lminL2;           //Минуты выключения
      if((hour*60+min)>=(lHour1*60+lMin1)&&(hour*60+min)<(lHour2*60+lMin2))PORTD=PORTD|B00100000;//Включить досветку
      else PORTD=PORTD&B11011111;           //Выключить досветку
    //Уставки времени включения/выключения полива
      int wHour1=hhourW1*10+lhourW1;        //Часы включения
      int wMin1=hminW1*10+lminW1;           //Минуты включения
      int wHour2=hhourW2*10+lhourW2;        //Часы выключения
      int wMin2=hminW2*10+lminW2;           //Минуты выключения
      if((hour*60+min)>=(wHour1*60+wMin1)&&(hour*60+min)<(wHour2*60+wMin2)){
      if(currentWInterv==0)        {        //Настал день полива  
        PORTD=PORTD|B00010000;//Включить полив
        currentWInterv=waterInterv;  }      //Переустановить интервал полива
      }
      else PORTD=PORTD&B11101111;           //Выключить полив
    //Управление ИМ по сигналам датчиков
      if(t<t_heat)PORTD=B00000100;          //Если t<t_heat - включить нагрев
      if(t>t_heat+1)PORTD=PORTD&B11111011;  //Если t>t_heat+1 - выключить нагрев
    }
    //----- Установка параметров -----------------------------------------------
    void setParameters(){
        flag=0;
          if(param==1)             {
            t_heat++;
            if(t_heat>20)t_heat=12;}
    //Установка времени включения досветки    
          else if(param==2)           {
            hhourL1++;
            if(hhourL1>2)hhourL1=0; }
          else if(param==3)  {
            lhourL1++;
            if((lhourL1>3&&hhourL1>1)||lhourL1>9)lhourL1=0;}
          else if(param==4)        {
            hminL1++;
            if(hminL1>5)hminL1=0;}
          else if(param==5)        {
            lminL1++;
            if(lminL1>9)lminL1=0;}
    //Установка времени выключения досветки    
           else if(param==6)          {
            hhourL2++;
            if(hhourL2>2)hhourL2=0; }
          else if(param==7)  {
            lhourL2++;
            if((lhourL2>3&&hhourL2>1)||lhourL2>9)lhourL2=0;}
          else if(param==8)        {
            hminL2++;
            if(hminL2>5)hminL2=0;}
          else if(param==9)         {
            lminL2++;
            if(lminL2>9)lminL2=0; }
    //Установки времени включения полива      
          else if(param==10)          {
            hhourW1++;
            if(hhourW1>2)hhourW1=0;}
          else if(param==11)  {
            lhourW1++;
            if((lhourW1>3&&hhourW1>1)||lhourW1>9)lhourW1=0;}
          else if(param==12)        {
            hminW1++;
            if(hminW1>5)hminW1=0; }
          else if(param==13)        {
            lminW1++;
            if(lminW1>9)lminW1=0; }
    //Установка времени выключения полива      
          else if(param==14)          {
            hhourW2++;
            if(hhourW2>2)hhourW2=0;}
          else if(param==15)  {
            lhourW2++;
            if((lhourW2>3&&hhourW2>1)||lhourW2>9)lhourW2=0;}
          else if(param==16)        {
            hminW2++;
            if(hminW2>5)hminW2=0;}
          else if(param==17)        {
            lminW2++;
            if(lminW2>9)lminW2=0; }
          else if(param==18)          {
            waterInterv++;
            currentWInterv=waterInterv;
            if(waterInterv>7)waterInterv=0; }
          else if(param>18)param=1;  
    }  //Конец setParametrs()
    //-------Опрос датчика DHT21 1 раз за 2 сек---------------------------
    void _DHT21(){
        prevMillis=millis();
        h = dht.readHumidity();               //и считать текущее значение
        t = dht.readTemperature();            //температуры и влажности
        if (isnan(t)||isnan(h)){              //Если не удалось,
        lcd.setCursor(0, 0);
        lcd.print("Failed read DHT");}       //пишем на LCD "Ошибка чтения"
    }
    //-------Опрос датчика DS18B20 1 раз в сек----------------------------
    void DS18B20(){
       prevMillis1=millis();
       byte data[12];          // массив для хранения информации с датчиков
       byte addr[8];           // массив для хранения адреса датчиков
       if (!ds.search(addr)) { //Если адрес DS18B20 не найден - возврат
          ds.reset_search();
          return;    }
        ds.reset();
        ds.select(addr);       //Выбираем датчик
        ds.write(0x44);        //запускаем конвертацию, 1 - оставляем питание на линии
        present=ds.reset();
        ds.select(addr);       //выбираем датчик
        ds.write(0xBE);        //считываем ОЗУ датчика
        for (i=0;i<9;i++) {    //записываем 9 байт полученных с ОЗУ датчика
          data[i]=ds.read();
          }
        TempLSB=data[0];       //высчитываем температуру
        TempMSB=data[1];
        TempMSB2=TempMSB<<4 ;
        if(TempMSB2>1000){
          TempMSB2=TempMSB2-3968;
          TReading=TempMSB2+TempLSB/16-128;
        }
        else {TReading = (TempMSB << 4) + TempLSB/16;}
    }
    //---------Меню на 3 экрана----------------------------------
    void menu(){
      prevMillis3=millis();
        if(param==0){                       //Меню №1(главное)
          lcd.home();
          lcd.print("TE\2\1=");
          lcd.print(t, 0);                 //Температура в теплице
          lcd.print("\3C B\1=");
          lcd.print(h, 0);                 //Влажность в теплице
          lcd.print("%");
          lcd.print(" ");
          lcd.setCursor(0, 1);
          lcd.print("HA\4\1=");
          lcd.print(TReading, 0);           //Температура на улице
          lcd.print("\3C");
          lcd.print(" ");
          lcd.setCursor(10, 1);
          lcd.print(rtc.getTimeStr());      //Текущее время
          lcd.setCursor(15, 1);
          lcd.print(" ");
        }    
    //Меню №2 - Установка порога включения ТЭНа и времени вкл/выкл досветки
        if(param>0&&param<10){
          lcd.home();                      //Меню №2
          lcd.print("BK\1 HA\7PEB ");      //ВКЛ НАГРЕВ
          lcd.print(t_heat);                //t° вкл.
          lcd.print(" \3C");      
          lcd.setCursor(0, 1);
          lcd.print("CBET ");               //СВЕТ    
          lcd.print(hhourL1);              //Время вкл дес. час
          lcd.print(lhourL1);              //ед. час
          lcd.print(":");
          lcd.print(hminL1);               //дес. мин
          lcd.print(lminL1);               //ед. мин
          lcd.print(" ");
          lcd.print(hhourL2);              //Время выкл дес. час
          lcd.print(lhourL2);              //ед. час
          lcd.print(":");
          lcd.print(hminL2);               //дес. мин
          lcd.print(lminL2);               //ед. мин
        }
        else if(param>9&&param<19){
    //Меню №3 - Установка времени вкл/выкл полива и периодичности полива
          lcd.home();                          //Меню №3
          lcd.print("\2O\1\6B \6HTEP "); //ПОЛИВ ИНТЕР
          lcd.print(waterInterv);              //Установить интервал полива
          lcd.print(" \5H");                   //ДН
          lcd.setCursor(0, 1);                 //Установить время полива
          lcd.print("BPEM ");                  //ВРЕМ  
          lcd.print(hhourW1);                  //Время включения дес. час
          lcd.print(lhourW1);                  //ед. час
          lcd.print(":");
          lcd.print(hminW1);                   //дес. мин
          lcd.print(lminW1);                   //ед. мин
          lcd.print(" ");
          lcd.print(hhourW2);                  //Время выключения дес. час
          lcd.print(lhourW2);                  //ед. час
          lcd.print(":");  
          lcd.print(hminW2);                   //дес. мин
          lcd.print(lminW2);                   //ед. мин      
          lcd.print(" ");    
        }
        else if(param>18 ){param=0;}
    }
    //------------Опрос кнопок------------------------------------
    int knopka(){
    uint16_t pitch, key_values[4]={100,200,400,600};
    uint32_t presstime;
      if(millis()-presstime>100){        //Дождаться окончания дребезга
        presstime=millis();  
        pitch=analogRead(A0);            //и считать снова
        for(int j=0;j<4;j++){
          if(pitch<key_values[j]){
            while(analogRead(A0)<1000);  //Ждать, пока кнопка отпустится
            return j+1;//Возвращает № нажатой кнопки
          }
        }
      }
    }  

    Код получился, с моей точки зрения, компактным, понятным и хорошо структурированным, так что любой может взять его за основу или использовать как есть. Плата тоже будет, но позже. Подработаю её, видимо, где-то уже после нового года. Необходимость доработки диктуется тем, что решил заменить китайский модуль на опто-реле твердотельными опто-реле. Ранее потратил чуть не месяц на разработку варианта с модулем, потому что нужно было скомпоновать печатную плату, экран и модуль реле. Теперь всё будет на одной плате. В результате, всё получится ещё компактней, но, правда, дороже.
     
    Последнее редактирование: 23.12.16
  7. timon2006
    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356

    timon2006

    Живу здесь

    timon2006

    Живу здесь

    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356
    Чаще через 10к на плюс. Иногда (как в том, что по ссылке) висят в воздухе (всегда как выходы и периодически перезаписываются).
    В готовом устройстве все эти прибамбасы не нужны (а кушают и место занимают - всегда:)). А если отдельным блоком - другое дело.
    А я знаю, поэтому ни малейшего сомнения:). Впрочем, хозяин - барин.
     
  8. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Понятно что не нужны, смысл в том чтобы ардуину использовать в качестве программатора.
     
  9. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Пока у меня перерыв в работе: переехали в новый дом, а там нет провайдера dom. ru. Интернет и телик конечно проведу после НГ, но будет намного дороже.
     
  10. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Заметил на аналоговом входе ардуины, используемом для подключения кнопок, такую херню: иногда при частом нажатии кнопок вход фиксируется в нуле. МК сам при этом зависает. Причём, обычно это происходило при нажатии первой кнопки, которая действительно ноль создаёт на входе, но один раз наблюдал и от нажатия 2-й кнопки, которая образует делитель напряжения, то есть уровень не равный нулю.
     
  11. timon2006
    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356

    timon2006

    Живу здесь

    timon2006

    Живу здесь

    Регистрация:
    09.03.15
    Сообщения:
    979
    Благодарности:
    1.356
    Пмсм, может быть что угодно: от глюка симулятора, до глюка программы.
    Если не глюк симулятора, то, как минимум, вход переключается на выход. Отсюда и плясать.
     
  12. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Видимо устранил мимоходом, когда в последний раз марафет в программе наводил. Сейчас заехал на старую квартиру, минут 10 нажимал на кнопки - всё работает, ничего не зависает.
    Но специально для повышения помехоустойчивости плату всё равно буду дорабатывать серьёзно. Только уж после нового года и на новой квартире. Завтра с провайдером свяжусь, договорюсь о подключении сети.
     
  13. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Я как то недостаточно серьёзно отнёсся к защите от помех при разработке платы контроллера. Фактически, на плате сейчас нет ни одного элемента защиты. Изготавливать плату в таком виде, пожалуй, вряд ли стоит, всё равно потом придётся напаивать поверху резисторы, диоды, конденсаторы защит, но это будут уже сопли. Придётся и это аспект проработать, чтобы сделать плату уже такой, чтобы на ней всё было чики-чики.
    Сижу на старой квартире, договорился назавтра о проводке интернета в новой, а тут ещё день рождения у внучки - ехать надо, там - доделки на новой квартире, там - заготовки уже на новый год. В общем теперь продолжение разработок уже в следующем только, после 1-го или 2-го - как получится. Перерыв на праздники, так сказать.
     
  14. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Ну хорошо, все свободные выводы контроллера нужно подключить к шине +5V через резисторы 10 кОм. А что делать с выводами RXD и TXD? Тоже подключить через резисторы 10 кОм к +5V или просто оставить не подключенными? Хм-м, наверное нужно поискать схему контроллера и посмотреть просто, как эти выходы подключены к разъёму USB.
     
  15. Cofessor
    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467

    Cofessor

    Виталий

    Cofessor

    Виталий

    Регистрация:
    23.06.13
    Сообщения:
    9.290
    Благодарности:
    8.467
    Адрес:
    Брянск
    Ага, вот схема модуля Arduino Nano V3:
    org.png
    Всё в порядке, выходы RxD и TxD подключены к соответствующим входам м/схемы - контроллера USB через резисторы 1 кОм на плате модуля Ардуино нано. Никакие дополнительные резисторы не требуются, оставляем выводы RxD и TxD как есть.
     
Статус темы:
Закрыта.