Передача показаний датчиков c Mega в ESP в Blynk

Тема в разделе "Arduino & Shields", создана пользователем RazorLine, 13 фев 2019.

Метки:
  1. parovoZZ

    parovoZZ Гуру

    Могу сказать точно - библиотеки такой нет.
     
  2. RazorLine

    RazorLine Нерд

    именно с этим у меня трудности, если можно напишите пример.
    Имя сына 1 = t_i2c[1] = mlx90615_1.getTemperature(MLX90615_OBJECT_TEMPERATURE);
    Serial.println(t_i2c[1]);
    Но дальше в блинк нельзя.
    Blynk.virtualWrite(V1, t_i2c[1]);
     
  3. b707

    b707 Гуру

    вот эта строчка у вас исполняется на Меге или на Есп?
    То есть ЕСП у вас используется просто как Wi-FI адаптер с управлением АТ-командами или как самостоятельный контроллер с отдельной программаой?
     
  4. RazorLine

    RazorLine Нерд

    Mega прошита сама по себе, ЕСП прошита сама по себе, соединены rx/tx. Мега передает ЕСП данные, от ЕСП ничего не получает. ЕСП подключена к вайфай и шлет на блинк то, что получила от Меги.
     
  5. RazorLine

    RazorLine Нерд

    Эту строчку вы выше обсмеяли (Blynk.virtualWrite(V1, t_i2c[1]);)
     
  6. RazorLine

    RazorLine Нерд

    Проблема в том, что в serial передается не t_i2c, а цифры.
    ESP не знает, что пришедшие цифры это t_i2c.
    Пришедшие цифры нужно сопоставить определенному датчику для передачи далее в Blynk.
    Я пока вижу два решения:
    Вместе с цифрой посылать идентификатор Serial.print("t_i2c1"); и на стороне ЕСП сопоставлять - если пришло t_i2c1 и цифра, значит это датчик 1.
    Собирать в одну связку все сосиски и на стороне ЕСП тоже как-то их делить - первая сосиска датчик 1 и тд.
     
  7. parovoZZ

    parovoZZ Гуру

    зачем?
    Придумай свой протокол. Например: первые байты - это идентификатор датчика, последующие байты - это значения этого датчика. Возможно, что захочешь ещё что-то положить в пакет. Зачем пытаться заставлять общаться МК между собой на человеческом языке? Они его не понимают. Пусть общаются на своем родном - машинном.
     
    b707 нравится это.
  8. RazorLine

    RazorLine Нерд

    Я человек, мне нужно научиться думать как компьютер, чтобы ему было легче ). Я пытаюсь. Прошу помощи в своих попытках. Если можно присылайте примеры.
     
  9. RazorLine

    RazorLine Нерд

  10. parovoZZ

    parovoZZ Гуру

    могу только огорчить - это дается природой.

    Можно через массив, можно структурой. Но структура на первых парах сложна для понимания, поэтому проще через массив. Определяешь массив - первые два элемента - это идентификатор, следующие - показания. Затем передаешь его через serial. На приемной стороне поступаешь также - принимаемые данные складируешь в точно такой же массив. А так как где что лежит в массиве мы знаем, то и вычленить данные не составит никаких проблем.
     
  11. RazorLine

    RazorLine Нерд

    Вот пока последним я и занимаюсь, пытаюсь собрать массив, оправить, разобрать, присвоить, отправить.
     
  12. Daniil

    Daniil Гуру

    Я не знаю как работают ваши датчики, но попробую объяснить на обычном АЦП, т.е. не ваша задача, но, надеюсь, посыл будет понятным.
    На ардуине уно ацп 10-битное, система сама по себе 8-ми битная, поэтому когда вы считываете данные с ацп вы заполняете 2 байта, младший байт полностью занят данными, у старшего только 2 из 8. Получается в старшем байте 6 бит свободных/неиспользуемых, вот в них то и можно запихнуть "идентификатор". 6 бит это 2^6=64 варианта, т.е. в таком методе идентифицирования можно подключить 64 датчика.
    А теперь более конкретно:
    не буду акцентировать внимание, но я буду пользоваться типами, которые проще читаются человеческим глазом, пример:
    uint16_t - беззнаковый integer, занимаемый 16 бит
    Код (C++):
    //N-количество датчиков
    #define N 5
    //массив в которой хранятся данные с ацп
    uint16_t data[N];
    //массив пинов, к которым подключены датчики
    uint8_t pins[N]={0, 1, 2, 3, 4};
    //массив идентификаторов (обратить внимание, что числа должны занимать 6 и менее бит, т.е. они должны быть меньше или равно 63 (нуль тоже считается)) (если id будет занимать более 6 бит, то будет наложение id на data, что приведёт к ошибкам)
    uint8_t id[N]={10, 12, 32, 8, 63};

    //получить данные с пина
    uint16_t getData(uint8_t channel)
    {
        return AnalogRead(channel);
    }

    //сформировать пакет данных
    uint16_t getPacket(uint16_t data, uint8_t adress)
    {
        uint16_t tmp=adress<<(8+2); // нужно сдвинуть данные адреса на 1 байт и ещё 2 бита (10 бит)
        tmp=tmp | data; //логическое сложение
        return tmp
    }

    //расщифровку в обратную сторону оставляю на вас
    ...
    setup()
    {
    ....
    }
    ...
    loop()
    {
    ...
        //где-то в коде вам нужно отправить данные i-ого датчика
        data[i] = getData(pins[i]);
        uint16_t pocket_tmp = getPacket( data[i] , id[i] );
        serial.print(pocket_tmp);//отправляется 2 байта, который прм должен уметь расшифровать
    ...
    }
     
    Это один из огромного количества вариантов. Ваша задача определить закономерность в ваших датчиках (такое как 10 бит у ацп). Добавлять идентификатор, если нужно, то добавлять служебную информацию и отправлять. Если датчики совсем разношёрстные, то можно добавить байт, в котором и будет "адрес" датчика.
    Код написан для понимания основных моментов, не знаю будет ли он компилироваться, если да, то за работоспособность не отвечаю.
     
  13. RazorLine

    RazorLine Нерд

    Спасибо. Этим я собственно и занимаюсь, пытаюсь осознать/слепить общую картину и начать мыслить языком компьютера принимая во внимания особенности, аспекты и ограничения.
     
  14. parovoZZ

    parovoZZ Гуру

    Со сдвигами и прочими булевыми операциями можно потренироваться в стандартном виндовом калькуляторе, вкладка "Программист".