Вывод данных полученных через hc4051 на LCD дисплей

Всем добрый день,
с помощью ФЛпрог я как новичок “наворотил” прилагаемый код.
сразу предупреждаю, что он не совсем рабочий! и в нем очень много недостатков.
Суть задачи: подключить через “расширитель” аналоговых входов HC4051 несколько датчиков влажности и вывести их данные на LCD дисплей

  • с подключением датчиков на прямую к ардуино отдельности я разобрался
  • с выводом нанных на дисплей тоже
  • с выводом данных с Сериал Монитор тоже
    Пересмотрел кучу информации и везде коды и скетчи только на вывода данных в Serial монитор
    но это совсем бесполезная инфа!
    мне нужно чтобы данные поступающие через HC4051 выводились на дисплей
    кто знает какую функцию или что для этого использовать в коде?
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
int AnalogOut_29477153_1;
float Sens1_29477153_1;
float Sens2_29477153_1;
float Sens3_29477153_1;
const int selectPins_29477153_1[3] = {11,12, 13}; // подключение управляющих пинов6 S0~ S1~ S2
const int zOutput_29477153_1= 5;
const int zInput_29477153_1= AnalogOut_29477153_1; // определение аналогового входа Ардуино по которому будут передаваться данные
int _gtv2; //Датчик влажности почвы № 1
int _gtv1; //Датчик влажности № 2, аналоговый
float _gtv10; //Данные с датчика влажности № 1, преобразование из аналога в 2-х значное число
float _gtv9; //Данные с датчика влажности № 2, преобразование аналога в двухзначное число
bool _gtv17; //Гланое меню активно
int _disp1oldLength = 0;
int _disp5oldLength = 0;
void setup()
{
    Wire.begin();
    delay(10);
    _lcd1.init();
    _lcd1.backlight();
    Serial.begin(9600); // запуск порта 
      for (int i=0; i<3; i++)
    {
        pinMode(selectPins_29477153_1[i], OUTPUT);
        digitalWrite(selectPins_29477153_1[i], HIGH);
    }
    pinMode(zInput_29477153_1, INPUT); // Set up Z as an input
    Serial.println("Sens1_29477153_1\Sens2_29477153_1\Sens3_29477153_1\Sens4\Sens5\Sens6\Sens7\Sens8");
    Serial.println("---\H---\H---\H---\H---\H---\H---\H---\H---\H---\H---\H---\H---\H---\H--");
}
void loop()
{
    if (_isNeedClearDisp1) 
    {
        _lcd1.clear();
        _isNeedClearDisp1= 0;
    }
    //Плата:1
      for (byte pin=0; pin<=7; pin++)
    {
        selectMuxPin(pin); // Select one at a time
            int inputValue = analogRead(zInput_29477153_1); // and read Z
            Serial.print(String(inputValue) + "\t");
    }
    Serial.println();
    delay(2000);
}
// The selectMuxPin function sets the 11, 12, and 13 pins
// accordingly, given a pin from 0-7.
void selectMuxPin(byte pin)
{
    for (int i=0; i<3; i++)
    {
        if (pin & (1<<i))
        digitalWrite(selectPins_29477153_1[i], HIGH);
        else
        digitalWrite(selectPins_29477153_1[i], LOW);
    }
    _gtv9 = Sens2_29477153_1;
    _gtv10 = Sens1_29477153_1;
    //Плата:2
    _gtv10 = (map((_gtv2), (0), (1023), (0), (670)));
    _gtv9 = (map((_gtv1), (0), (1023), (0), (670)));
    //Плата:3
    if (_gtv17) 
    {
        _dispTempLength1 = ((((String("Н- ")) + ((_floatToStringWitRaz(_gtv9,2))) + (String("%"))))).length();
        if (_disp1oldLength > _dispTempLength1) 
        {
            _isNeedClearDisp1 = 1;
        }
        _disp1oldLength = _dispTempLength1;
        _lcd1.setCursor(10, 1);
        _lcd1.print((((String("Н- ")) + ((_floatToStringWitRaz(_gtv9,2))) + (String("%")))));
    }
     else 
    {
        if (_disp1oldLength > 0) 
        {
            _isNeedClearDisp1 = 1;
            _disp1oldLength = 0;
        }
    }
    if (_gtv17) 
    {
        _dispTempLength1 = ((((String("Н- ")) + ((_floatToStringWitRaz(_gtv10,2))) + (String("%"))))).length();
        if (_disp5oldLength > _dispTempLength1) 
        {
            _isNeedClearDisp1 = 1;
        }
        _disp5oldLength = _dispTempLength1;
        _lcd1.setCursor(10, 0);
        _lcd1.print((((String("Н- ")) + ((_floatToStringWitRaz(_gtv10,2))) + (String("%")))));
    }
     else 
    {
        if (_disp5oldLength > 0) 
        {
            _isNeedClearDisp1 = 1;
            _disp5oldLength = 0;
        }
    }
}
String  _floatToStringWitRaz(float value, int raz)
{
    return String(value,raz);
}```

Никто не станет разбираться. Сори((

а может кто уже делал такие проекты
мне бы только направление определить
как я догадываюсь с HC4051 данные с датчиков идут “потоком”
нужно как то разделить данные с каждого входа HC4051
Подозреваю что это делается с помощью разбивки по “case”
(нашел один ролик на ютубе - но там скетч не выложен!)

Вот так:

_lcd1.print(значение с мультиплексора);

Несколько это сколько? В Нано 8 аналоговых входов. И даже если минус 2 на I2C - остается 6 - мало?

Чушь собачья!
Если Вам нужно вычислить значение выражения 2 * 3 * 4, то для этого, по Вашим словам, таблица умножения содержит абсолютно бесполезную инфу т.к. в таблице умножения показано только одно умножение, а Вам нужно выполнить целых два.

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

А вот это уже

Нет, чтобы просто вписать в код ТС правильную строку, они тут вечно: «хочут свою образованность показать и всегда говорят про непонятное»! :frowning:

1 лайк

и это уже не изменить :frowning:

Всем добрый день,
всем спасибо за неадекватные коменты и бесполезные рекомендации))
но вчера ночью я нашел видео на ютубе, в котором был ответ на мой вопрос
видос на английском, спасибо зарубежным товарищам из кап стран - они оказались более продвинутые в поставленном мной вопросе))
я нашел нужный кусок кода
нужно просто “прописать” адрес каждой ножки мультиплексора HC4051 и каждую такую ножку считывать и выводить отдельно через несколько связанных переменных.
будет время - проверю работоспособность и размещу тут этот код.

будем ждать, поможет и нам скилы прокачать

да, 6 мало
мне нужно чтобы был резерв на перспективу - установка более 10 … датчиков в разные горшки (у каждого вида растений будет своей режим полива)
поэтому мне нужно увеличить количество аналоговых датчиков - и для этого я купил HC4051 и заказал еще разных модулей расширения
вот сейчас пробую с какой схемой будет лучше.
I2c конечно тоже можно использовать для датчиков - но в такой схеме есть большой недостаток: в полевых условиях нужно будет перепрописывать адреса датчиков, что очень не удобно.

Спасибо, паржал. Всё действительно так просто, аказываецца.

1 лайк

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

Ну да, “нужно всего лишь написать правильный код” :slight_smile: - мы примерно так вам и ответили.

Зачем было искать какие видосы на ютуюе, когда всего-то нужно было найти пример работы с мультиплексором HC4051. Их просто море в инете
Вот например, со схемой и кодом

Скажу вам по секрету, я принципе не понял, что именно вы спрашивали. Учитесь правильно задавать вопросы

всё вы прекрасно поняли…
просто злобно не захотели ответить на вопрос:)

ссылка с образцом который вы прислали не подходит - вернее не совсем подходит.
таких сайтов и роликов я пересмотрел несколько десятков.
и ни где в них не было куска кода позволяющего использовать данные с конкретной ножки и выводить его на LCD дисплей
(как указал выше - такой ролик я нашел только вчера)
присланный вами образец содержит код в котором данные с ножек идут “потоком” и “вываливаются” в Serial
а мне нужны были данные с конкретной одной ножки! которой можно присвоить свою, собственную переменную и использовать данные с неё самостоятельно.
и поэтому в таком виде этот код не подойдёт.

мало того - так я еще усложнил ситуацию тем - что не пишу код в ручную - а использую FLprog - а там нет такого блока как HC4051
поэтому мне пришлось сначала понять и создать какое то подобие пользовательского блока для FLprog, а потом уже “покарёжить” код под свои нужды)))

еще нашел на ютубе ролик 4-6 летней давности какого то там автора по фамилии Писанец - у него как раз оказался подходящий по смыслу код для скетча
но этот вредный тип не выложил файлы со скетчем
и мне пришлось вручную с экрана переписывать код - в итоге он оказался не рабочим - там не хватает каких то кусков, которые не попали в кадр - Ардуино ИДЕ отвергает его и пишет что код имеет недоделки.
короче перебрал кучу вариантов…
в общем ждите продолжения)))

Таки да! Приятно видеть понимающего человека! :slight_smile:

Ужас. Напоминает “Родители меня в 35 лет!!! выгнали из дома, и я вынужден САМ зарабатывать себе на хлеб. ПАМАГИТЕ кто чем может…”

нет, всё намного хуже!
в описанной выше ситуации (переписывание кода вручную с экрана) - “родители в 20 лет меня сразу привезли на шахту работать и бросили там”)))
так как при увеличении на экране часть символов было не разобрать, комментарий автора был сумбурный (сценарий для ролика он точно не готовил)))
и часть кода он скорее всего скрыл или он не попал в кадр.