Увеличение аналоговых и цифровых входов
- Войдите на сайт для отправки комментариев
Ср, 24/04/2019 - 03:07
[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]
Теперь то же самое на I2C....
может и пригодится
Теперь то же самое на I2C....
Да. Для I2C хочу добавить качественный 16 разрядный, четырёхканальный ADS1115. Сегодня попробую.
165 регистр входов хотел тоже ... да передумал. Цифровой сигнал - это частный случай аналогового ... только не 0/1023, а 0/1.
И ещё ... в таком виде очень легко дописывать скетч под любую программу.
Тема и для меня актуальная.
Но у вас......столько хотелок!
поэтому для вас совет:
может мегу купить? глядишь - дешевле выйдет.
Есть у меня ESP32. В чём проблема? С расширителями входов программировать удобнее. Порты не надо объявлять входом - выходом. Включать-выключать можно одной строчкой.
Дело в том, что по непонятной причине новичкам не рассказывают про удобство 74НС595. Все примеры динамические, узкоспециальные с применением сокращённого программирования, сложного для понятия начинающим. А на самом деле ... там кода всего три строчки. Мой скетч тому пример. И ещё ... тоже важное ... 595 полностью снимает нагрузку с пинов микроконтроллера.
Про хотелки ... в моём ГАЗ-69 6 передач ... для разных условий движения. Не пересаживаемся же мы на разные машины когда нужно ехать в условиях разной сложности. Мне 8266 нравится за его WIFI. НО !!!!!! Один аналоговый вход!!!! Хиба такое можна сцярпець? Теперь у меня их 16. С перспективой. Неиспользуемые притянул к минусу и выставил условие ... если val не равно нолю отправлять в монитор порта.
Есть у меня ESP32. В чём проблема? С расширителями входов программировать удобнее. Порты не надо объявлять входом - выходом. Включать-выключать можно одной строчкой.
Дело в том, что по непонятной причине новичкам не рассказывают про удобство 74НС595. Все примеры динамические, узкоспециальные с применением сокращённого программирования, сложного для понятия начинающим. А на самом деле ... там кода всего три строчки. Мой скетч тому пример. И ещё ... тоже важное ... 595 полностью снимает нагрузку с пинов микроконтроллера.
По непонятной причине новички не желают читать то, что им рассказано и разжевано, например, http://arduino.ru/Tutorial/registr_74HC595. Куда уж яснее-то?
Растолкуйте плз:
I2C - это 5-В интерфейс. многие ИМС только от 5 В и работают (DS1307 например).
про 12В - интерфейс слышал (дорого 200 р за ИМС-переходник 5/12В).
а вот с 3,3В I2C как то вакуум у меня в голове.
прошу явить ИМС I2C которые от 3,3В работают. В привязке к целевому МК( пользую, нравится, хочу ещё ).
Можно ли метрах на 15 кабеля работать с I2C 3,3В ИМС (термометром каким-нибудь).
а вот с 3,3В I2C как то вакуум у меня в голове.
прошу явить ИМС I2C которые от 3,3В работают. В привязке к целевому МК( пользую, нравится, хочу ещё ).
Можно ли метрах на 15 кабеля работать с I2C 3,3В ИМС (термометром каким-нибудь).
I2С вовсе не привязан к 5в. Он совершенно без проблем работает , к примеру, на СТМ32. На распространенной "блюпилл" STM32F103 аж два I2C интерфейса - зачем бы их вставили на плату с питанием 3.3, если б они работали только от 5в ? :)
Насчет 15 метров кабеля - вопрос в принципе некорректный. I2C расшифровывается с английского как "межблочные коммуникации" - его расчетный радиус действия сантиметры.
Растолкуйте плз:
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 каналов) возможно есть и у тебя ... он входит в стартовый набор Ардуино. Тоже копеечный, если на Али заказать.
Управление микросхемами CD4051BE по двоичному коду A, B, C, INH. (INH)- это разрешение на считывание. С двумя микросхемами я как то ухитрился. Если брать от 00001000 прибавлять по 00000001 и так до 00010111) то всё легко получилось в одну строчку.
21for( 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 ++) работает точно так же.То, что нельзя сделать одним циклом, делается двумя. Можно, конечно, и экзотику придумать со сбросом бита в одном цикле, но есть ли в этом смысел...
А что? Нельзя разве ... сдесь читаем, здесь не читаем, а сдесь селёдку заварачивали?
1<a<10 & 100<a<110 ... что нибудь такое
Конечно такой перебор, как хочу ... строк за 10 ... 15 смогу сотворить. Но есть же ГУРУ, владеющие сокращённым программированием
Ну вот так и пишите селёдку в цикле.
Думаете, что у ГУРУ другие ЦЫКЛЫ - секретные и эти циклы в прошивке вообще ничего не занимают?
Проблему в лоб решить не получилось
[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]Вот так читаешь человека... Вроде умные вещи пишет, что-то там полезное мастерит, а потом херак и
byte number595_1 [] = {...} ... for ( number595_1 = [0]; number595_1 <= [39]; number595_1 ++)Что это вообще означает?
Грех над стариком пиариться. Ну исправь, если знаешь как
Так я и спрашиваю - что это означает по-человечески?
Это и означает, что хотел последовательно назначать ножкам 74НС595 перебором подряд из соответствующего массива
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); } }Грех над стариком пиариться. Ну исправь, если знаешь как
Ты не дочитал. Тестировано для двух CD4051BE
[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]А это скетч исправленый
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); } }Я всё правильно сделал?
Если работает, как ожидалось, то значит правильно.
sizeof(inh) >= i или i < sizeof(inh).
sizeof(inh) >= i или i < sizeof(inh).
Это к чему?
Проверить оба варианта пока схему не разобрал?
В том виде скетч с помощью sadman41 всё работает как задумано. Монитор порта подтвердил.
Это к чему?
Не обращайте внимания.) Это я уже засыпал.