Увеличение аналоговых и цифровых входов

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018
[code]
/*Заготовка скетча для расширения портов NodeMCU ESP8266 или ардуино UNO 
 * 74НС595 - две штуки. Расширитель аналоговых портов CD 4051BE - 2 штуки. 
 * При чём аналогвые расширители управляются 5 портами микпрсхемы 74НС595
 * Схема и скетч тестированы на UNO и NodeMCU ESP8266 c контролем на монитор порта
 * Скетч не содержит Delay и millis Однако аналоговый порт считываться успевает
 * Занимая один аналоговый порт микроконтроллера и три цифровых ....
 * получаем 16 аналоговых и 8+3 = 11 цифровых
 Может кому пригодится*/
int latchPin = D5;  //10 Пин Uno 
int clockPin = D8;  //12 Пин Uno  
int dataPin = D7;   //11 Пин Uno   
int number595_1 = (B00001000);   //xxx  INH-2 INH-1 A B C - управление СD4051BE
int number595_2 = (B00000000);   // Расширение выходов
void setup() {
  Serial.begin (115200);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);}
void loop() {
    for ( number595_1 = (B00001000);  number595_1 <= (B00010111); number595_1 ++){ // Перебираем входы управления СD4051BE
    digitalWrite(latchPin, LOW);    //открываем защёлку
    shiftOut(dataPin, clockPin, MSBFIRST, number595_1);  //Заносим даные в первый регистр
     shiftOut(dataPin, clockPin, MSBFIRST, number595_2);  //Заносим даные во второй регистр
     digitalWrite(latchPin, HIGH);  // закрываем защёлку
      int val = analogRead (A0);  // в этом месте можно "перехватывать данные аналоговых
      //сигналов для использования в своих целях
 Serial.print (number595_1 - 8); // -8 чтобы в голове не пересчитывать номер 
 //аналогового входа СD4051BE
     Serial.print ("=");
     Serial.println (val);}
     }

[/code]

 

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Теперь то же самое на I2C....

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

может и пригодится

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

dmitron1036 пишет:

Теперь то же самое на I2C....

Да. Для I2C хочу добавить качественный 16 разрядный, четырёхканальный ADS1115. Сегодня попробую.

165 регистр входов хотел тоже ... да передумал. Цифровой сигнал -  это частный случай аналогового ... только не 0/1023, а 0/1.

И ещё ... в таком виде очень легко дописывать скетч под любую программу.

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Тема и для меня актуальная.

Но у вас......столько хотелок!

поэтому для вас совет:

может мегу купить? глядишь - дешевле выйдет.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

   Есть у меня ESP32. В чём проблема? С расширителями входов программировать удобнее. Порты не надо объявлять входом - выходом. Включать-выключать можно одной строчкой.

    Дело в том, что по непонятной причине новичкам не рассказывают про удобство 74НС595. Все примеры динамические, узкоспециальные с применением сокращённого программирования, сложного для понятия начинающим. А на самом деле ... там кода всего три строчки. Мой скетч тому пример. И ещё ... тоже важное ... 595 полностью снимает нагрузку с пинов микроконтроллера.

    Про хотелки ...  в моём ГАЗ-69     6 передач ... для разных условий движения. Не пересаживаемся же мы на разные машины когда нужно ехать в условиях разной сложности. Мне 8266 нравится за его WIFI. НО !!!!!! Один аналоговый вход!!!! Хиба такое можна сцярпець? Теперь у меня их 16. С перспективой. Неиспользуемые притянул к минусу и выставил условие ... если val не равно нолю отправлять в монитор порта. 

SLKH
Offline
Зарегистрирован: 17.08.2015

Муж_Долговой пишет:

   Есть у меня ESP32. В чём проблема? С расширителями входов программировать удобнее. Порты не надо объявлять входом - выходом. Включать-выключать можно одной строчкой.

    Дело в том, что по непонятной причине новичкам не рассказывают про удобство 74НС595. Все примеры динамические, узкоспециальные с применением сокращённого программирования, сложного для понятия начинающим. А на самом деле ... там кода всего три строчки. Мой скетч тому пример. И ещё ... тоже важное ... 595 полностью снимает нагрузку с пинов микроконтроллера.

По непонятной причине новички не желают читать то, что им рассказано и разжевано, например, http://arduino.ru/Tutorial/registr_74HC595. Куда уж яснее-то?

dmitron1036
Offline
Зарегистрирован: 10.01.2016

Растолкуйте плз:

I2C - это 5-В интерфейс. многие ИМС только от 5 В и работают (DS1307 например).

про 12В - интерфейс слышал (дорого 200 р за ИМС-переходник 5/12В).

а вот с 3,3В I2C как то вакуум у меня в голове.

прошу явить ИМС I2C которые от 3,3В работают. В привязке к целевому МК( пользую, нравится, хочу ещё ).

Можно ли метрах на 15 кабеля работать с I2C 3,3В ИМС (термометром каким-нибудь).

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

dmitron1036 пишет:

а вот с 3,3В I2C как то вакуум у меня в голове.

прошу явить ИМС I2C которые от 3,3В работают. В привязке к целевому МК( пользую, нравится, хочу ещё ).

Можно ли метрах на 15 кабеля работать с I2C 3,3В ИМС (термометром каким-нибудь).

I2С вовсе не привязан к 5в. Он совершенно без проблем работает , к примеру, на СТМ32. На распространенной "блюпилл" STM32F103 аж два I2C интерфейса - зачем бы их вставили на плату с питанием 3.3, если б они работали только от 5в ? :)

Насчет 15 метров кабеля - вопрос в принципе некорректный. I2C расшифровывается с английского как "межблочные коммуникации" - его расчетный радиус действия сантиметры.

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

dmitron1036 пишет:

Растолкуйте плз:

I2C - это 5-В интерфейс. многие ИМС только от 5 В и работают (DS1307 например).

про 12В - интерфейс слышал (дорого 200 р за ИМС-переходник 5/12В).

а вот с 3,3В I2C как то вакуум у меня в голове.

прошу явить ИМС I2C которые от 3,3В работают. В привязке к целевому МК( пользую, нравится, хочу ещё ).

Можно ли метрах на 15 кабеля работать с I2C 3,3В ИМС (термометром каким-нибудь).

Вот преобразователи 3,3 в 5,0 и наоборот

5шт IIC I2C Logic Level Преобразователь Bi-Directional Модуль совета 5V / 3.3V DC для Arduino с булавками

За 0,7$ мне али прислал их пять штук.

Усилитель выхода (7 каналов) возможно есть и у тебя ... он входит в стартовый набор Ардуино. Тоже копеечный, если на Али заказать.

 

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

  Управление микросхемами CD4051BE по двоичному коду A, B, C, INH.  (INH)- это разрешение на считывание. С двумя микросхемами я как то ухитрился. Если брать  от 00001000 прибавлять по 00000001 и так до 00010111) то всё легко получилось в одну строчку.

21     for ( number595_1 = (B00001000);  number595_1 <= (B00010111); number595_1 ++){ // Перебираем входы управления СD4051BE

 а вот как управлять третьей, четвёртой и пятой (больше  не нужно, так как у 74НС595 больше нету выходов) знаний у меня не хватило.

Если проще поставить вопрос ... как сделать перебор    от В11101000 до В11110111    от 11011000 до 11011000  от  10111000 до 10111111 и от 01111000 до 01111111 в одной строке for?  При чём организовать перебор можно на любых пинах лишь бы три бита (А В С) перебирались от 000 до 111  (0 до 7), а в остальных пяти (INH1, INH2 ... INH5) ноль перебегал в следующую ячкйку (01111, 10111, 11011, 11101, 11110).

Если это невозможно - буду другие способы искать. Например ... Можно создать в сетапе массив, потом в for спокойно его перебирать. Тогда и адаптировать под количество микросхем было бы легче. 

   Отвечать можно десятичными цмфрами. Строка  for ( number595_1 = 8;  number595_1 <= 23; number595_1 ++) работает точно так же.

   

sadman41
Онлайн
Зарегистрирован: 19.10.2016

То, что нельзя сделать одним циклом, делается двумя. Можно, конечно, и экзотику придумать со сбросом бита в одном цикле, но есть ли в этом смысел...

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

А что? Нельзя разве ... сдесь читаем, здесь не читаем, а сдесь селёдку заварачивали?

1<a<10 & 100<a<110 ... что нибудь такое

Конечно такой перебор, как хочу ... строк за 10 ... 15 смогу сотворить. Но есть же ГУРУ, владеющие сокращённым программированием

  

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Ну вот так и пишите селёдку в цикле.

Думаете, что у ГУРУ другие ЦЫКЛЫ - секретные и эти циклы в прошивке вообще ничего не занимают?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Проблему в лоб решить не получилось

[code]
В следующем сообщении
[/code]
пишет ошибку
   expected identifier before numeric constant
Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018
[code]
/*Заготовка скетча для расширения портов NodeMCU ESP8266 или ардуино UNO 
 * 74НС595 - две штуки. Расширитель аналоговых портов CD 4051BE - 2 штуки. 
 * При чём аналогвые расширители управляются 5 портами микпрсхемы 74НС595
 * Схема и скетч тестированы на UNO и NodeMCU ESP8266 c контролем на монитор порта
 * Скетч не содержит Delay и millis Однако аналоговый порт считываться успевает
 * Занимая один аналоговый порт микроконтроллера и три цифровых ....
 * получаем 16 аналоговых и 8+3 = 11 цифровых
 Может кому пригодится*/
int latchPin = 10;  //10 Пин ESP D5
int clockPin = 12;  //12 Пин ESP  D8
int dataPin = 11;   //11 Пин ESP  D7 
int number595_2 = (B00000000);   // Расширение выходов
byte number595_1 []={8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,32,33,34,35,36,37,38,39,64,65,66,67,68,69,70,71,128,129,130,131,132,133,134,135};
void setup() {
  Serial.begin (115200);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);}
void loop() {
    for ( number595_1 = [0];  number595_1 <= [39]; number595_1 ++){ // Перебираем входы управления СD4051BE
    digitalWrite(latchPin, LOW);    //открываем защёлку
    shiftOut(dataPin, clockPin, MSBFIRST, number595_1);  //Заносим даные в первый регистр
     shiftOut(dataPin, clockPin, MSBFIRST, number595_2);  //Заносим даные во второй регистр
     digitalWrite(latchPin, HIGH);  // закрываем защёлку
      int val = analogRead (A0);  // в этом месте можно "перехватывать" данные аналоговых сигналов для использования в своих целях
      if (val!=0){
 Serial.print (number595_1 + 1); // +1 чтобы в голове не пересчитывать номер аналогового входа СD4051BE
     Serial.print ("=");
     Serial.println (val);}
     }
}
[/code]

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вот так читаешь человека... Вроде умные вещи пишет, что-то там полезное мастерит, а потом херак и

byte number595_1 [] = {...}
...
for ( number595_1 = [0];  number595_1 <= [39]; number595_1 ++)

Что это вообще означает?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Грех над стариком пиариться. Ну исправь, если знаешь как

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Так я и спрашиваю - что это означает по-человечески?

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Это и означает, что хотел последовательно назначать ножкам 74НС595 перебором подряд из соответствующего массива

sadman41
Онлайн
Зарегистрирован: 19.10.2016
uint8_t inh[] = { B01111000, B10111000, B11011000, B11101000, B11110000 };
for (uint8_t i = 0x00; sizeof(inh) > i; i++) {
    for (uint8_t k = B000; B111 >= k; k++) {
        uint8_t l = inh[i] | k;
        Serial.println(l, BIN);  
    }
}

 

SLKH
Offline
Зарегистрирован: 17.08.2015

Муж_Долговой пишет:

Грех над стариком пиариться. Ну исправь, если знаешь как

Исправить - что? ведь  "Схема и скетч тестированы на UNO и NodeMCU ESP8266 c контролем на монитор порта"

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Ты не дочитал. Тестировано для двух CD4051BE

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018
 
1111000 / 120   = 56
1111001 / 121   = 72
1111010 / 122   = 70
1111011 / 123   = 71
1111100 / 124   = 69
1111101 / 125   = 57
1111110 / 126   = 34
1111111 / 127   = 39
10111000 / 184   = 43
10111001 / 185   = 46
10111010 / 186   = 46
10111011 / 187   = 83
10111100 / 188   = 84
10111101 / 189   = 85
10111110 / 190   = 83
10111111 / 191   = 84
11011000 / 216   = 51
11011001 / 217   = 50
11011010 / 218   = 50
11011011 / 219   = 53
11011100 / 220   = 52
11011101 / 221   = 85
11011110 / 222   = 92
11011111 / 223   = 93
11101000 / 232   = 1023
11101010 / 234   = 1023
11101011 / 235   = 217
11101100 / 236   = 1023
11101101 / 237   = 90
11110001 / 241   = 17
11110010 / 242   = 21
11110011 / 243   = 65
11110100 / 244   = 46
11110101 / 245   = 43
11110110 / 246   = 36
11110111 / 247   = 33
 
1111000 / 120   = 29
1111001 / 121   = 30
1111010 / 122   = 33
1111011 / 123   = 38
1111100 / 124   = 39
1111101 / 125   = 62
1111110 / 126   = 77
 Это скрыншот работы скетча. Всё отлично получилось. Спасибо большое.
Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018
[code]
/*Заготовка скетча для расширения портов NodeMCU ESP8266 или ардуино UNO 
 * 74НС595 - три штуки. Расширитель аналоговых портов CD 4051BE - 5 штук. 
 * При чём аналогвые расширители управляются 8 портами микросхемы 74НС595_1
 * Схема и скетч тестированы на UNO и NodeMCU ESP8266 c контролем на монитор порта
 * Скетч не содержит Delay и millis Однако аналоговый порт считываться успевает
 * Занимая один аналоговый порт микроконтроллера и три цифровых ....
 * получаем 40 аналоговых входов и 2*8 = 16 цифровых выходов
 Может кому пригодится*/
int latchPin = 10;  //10 Пин ESP D5
int clockPin = 12;  //12 Пин ESP  D8
int dataPin = 11;   //11 Пин ESP  D7 
int number595_2 = (B00000000);   // Расширение выходов
int number595_3 = (B00000000);
uint8_t inh[] = { B01111000, B10111000, B11011000, B11101000, B11110000 };
void setup() {
  Serial.begin (115200);
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);}
void loop() {
  for (uint8_t i = 0x00; sizeof(inh) > i; i++) {
    for (uint8_t k = B000; B111 >= k; k++) {
        uint8_t number595_1 = inh[i] | k;
    digitalWrite(latchPin, LOW);    //открываем защёлку
    shiftOut(dataPin, clockPin, MSBFIRST, number595_1);  //Заносим даные в первый регистр
     shiftOut(dataPin, clockPin, MSBFIRST, number595_2);  //Заносим даные во второй регистр
     shiftOut(dataPin, clockPin, MSBFIRST, number595_3);  //Заносим даные в третий регистр
     digitalWrite(latchPin, HIGH);  // закрываем защёлку
      int val = analogRead (A0);  // в этом месте можно "перехватывать" данные аналоговых сигналов для использования в своих целях
      if (val!=0){ //Если неподключенные пины притянуть к "земле", то их можно не печатать
 Serial.print (number595_1, BIN); //   номер аналогового входа СD4051BE
 Serial.print (" / ");
 Serial.print (number595_1 );
     Serial.print ("   = ");
     Serial.println (val);
        }
     }
  }
}

[/code]

А это скетч исправленый

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

sadman41 пишет:

uint8_t inh[] = { B01111000, B10111000, B11011000, B11101000, B11110000 };
for (uint8_t i = 0x00; sizeof(inh) > i; i++) {
    for (uint8_t k = B000; B111 >= k; k++) {
        uint8_t l = inh[i] | k;
        Serial.println(l, BIN);  
    }
}

 

Я всё правильно сделал?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Если работает, как ожидалось, то значит правильно.

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

sizeof(inh) >= i или i <  sizeof(inh).

Муж_Долговой
Муж_Долговой аватар
Offline
Зарегистрирован: 07.10.2018

Green пишет:

sizeof(inh) >= i или i <  sizeof(inh).

Это к чему?

Проверить оба варианта пока схему не разобрал?

В том виде скетч с помощью sadman41  всё работает как задумано. Монитор порта подтвердил.

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

Муж_Долговой пишет:

Это к чему?

Не обращайте внимания.) Это я уже засыпал.