Часы на esp8266 и max7219 + android управление

Тема в разделе "Глядите, что я сделал", создана пользователем IvanUA, 28 авг 2017.

?

Вы повторили это проект?

  1. Нет (просто ознакомился)

    35 голосов
    13,2%
  2. Да, один раз (попробовал)

    111 голосов
    41,9%
  3. Да, не однократно

    123 голосов
    46,4%
Можно выбрать сразу несколько вариантов.
  1. yrbas

    yrbas Нерд

    Скиньте если не трудно-попробую а то как то с чужим ключем не очень.
     
  2. big_alex

    big_alex Гик

  3. Fedoss

    Fedoss Нерд

  4. saha74

    saha74 Гик

    Что то у меня ни как не получается заставить часы получать данные с наружного датчика температуры через mqtt. На сайте clodmqtt данные с датчика в топике Ulica/temp отображается.
     
  5. IvanUA

    IvanUA Гуру

    Для того что бы отображалась температура с внешнего датчика, данные должны приходить в следующем формате:
    -0.1
    -11.3
    0.5
    27.4
    Первый символ проверяется на соответствие или знаку "-" или любой цифре от 0 до 9.
    Все остальные символы проверяются на наличие точки или любой цифры.
    Если вы в данных получаете что либо отличающееся от знака "-" или точки или любой цифры, то вы естественно не сможете "сложить" и корректно отобразить температуру.

    Я уже кому то из форума пояснял как проверить коды приходящих символов. Если никто не откликнется, то вечером постараюсь расписать, как это проверить.
     
    saha74 нравится это.
  6. big_alex

    big_alex Гик

    Было такое, вот код
    Код (C++):
    Serial.println(ul_temp);
         
    for(int i=0;  i<ul_temp.length(); i++) Serial.ptintln(payload[i]);


              t3 = 0;
              t4 = 0;    
     
  7. Oleksandr54

    Oleksandr54 Нерд

    Данние могут приходить правильние. У меня било такое. Для начала надо прописать настройки MQTT в WEB часов и зберечь их там, не забиваем про топик "Для отримання зовнішньої температури" -Ulica/temp. Потом на отображение влияет "Назва пристрою (ESP)" в WEB часов . Если несколько устройств MQTT, то названия у них должни бить разние.
     
    Последнее редактирование: 25 фев 2018
    IvanUA нравится это.
  8. saha74

    saha74 Гик

    Как можно посмотреть какие данные приходят на часы и приходят ли они вобще?
     
  9. IvanUA

    IvanUA Гуру

    Да, конечно можно...
    В скетче есть блок который вызывается в момент входящего сообщения по MQTT.
    Код (C++):
    void callback(char* topic, byte* payload, unsigned int length) {
      if(String(topic) == "Inform/mess") {
        String Text = "        ";
        for(int i = 0; i < length; i++) {
          Text += ((char)payload[i]);
        }
        Text += "        ";
        for(int i = 0; i < 4; i++) {
          tone(buzzerPin, 2000, 100);
          delay(200);
        }
        printStringWithShift(Text.c_str(), 30);
      }
      if(String(topic) == mqtt_sub){
        t3 = 0;
        t4 = 0;
    ИТАКДАЛЕЕ
    Так вот, в String(topic) - хранится название топика в котором пришло сообщение.
    Если вы ничего не меняли то в случае когда String(topic) == mqtt_sub, (а char mqtt_sub[21] = "Ulica/temp"; - обратите внимание что название топика не может превышать 20 символов. Иначе они не полностью сохранятся в памяти устройства.

    Идем далее.

    Если название нашего топика Ulica/temp - то проверяем содержимое сообщения...
    Оно побайтно хранится в переменной payload.

    Как писали ранее можно вывести его на экран и понять в чем проблема...

    В том месте где ИТАКДАЛЕЕ следует вставить следующую строку в скетче

    Код (C++):
    for(int i=0;  i<length; i++) Serial.ptintln(payload[i]);
    К примеру температура на внешнем датчике будет -12.5 градусов, то в мониторе порта вы увидите следующие строки:
    45
    49
    50
    46
    53
    что соответствует
    - (минус)
    1
    2
    . (точка)
    5
     
    Последнее редактирование: 24 фев 2018
    om1212 и saha74 нравится это.
  10. saha74

    saha74 Гик

    Вот что приходит в порт
    Publish in topic Temperature: 20.50
    32
    50
    50
    46
    49
    57
     
    Последнее редактирование: 24 фев 2018
  11. IvanUA

    IvanUA Гуру

    32 - это получается что у вас первым идет пробел. Нужно как то его пропустить....
     
  12. IvanUA

    IvanUA Гуру

    На скорую руку набросал кусок кода с учетом пробела в начале... а точнее пробела вместо знака "+"
    Короче пробуйте, но что бы быть уверенным что данный кусок кода будет работать корректно в вашем случае, то его стоит проверить в таких диапазонах: 0.5; 1.5; 11.5 ну и тоже самое но со знаком "-".
    Код (C++):
    void callback(char* topic, byte* payload, unsigned int length) {
      if(String(topic) == "Inform/mess") {
        String Text = "        ";
        for(int i = 0; i < length; i++) {
          Text += ((char)payload[i]);
        }
        Text += "        ";
        for(int i = 0; i < 4; i++) {
          tone(buzzerPin, 2000, 100);
          delay(200);
        }
        printStringWithShift(Text.c_str(), 30);
      }
      if(String(topic) == mqtt_sub){
        t3 = 0;
        t4 = 0;
        if((payload[0] >= 48 && payload[0] < 58) || payload[0] == 45 || payload[0] == 32) {
          if(payload[0] == 45 || payload[0] == 32) {
            if(payload[0] == 45) t5 = -1;
              else t5 = 1;
            if(payload[1] >= 48 && payload[1] < 58) {
              t3 = payload[1] - 48;
              if(payload[2] >= 48 && payload[2] < 58) {
                t3 = t3 * 10 + (payload[2] - 48);
              }
            }
            if(payload[3] == 46) {
              if(payload[4] >= 48 && payload[4] < 58) t4 = payload[4] - 48;
            }
            if(payload[2] == 46) {
              if(payload[3] >= 48 && payload[3] < 58) t4 = payload[3] - 48;
            }
          } else {
            t5 = 1;
            t3 = payload[0] - 48;
            if(payload[1] >= 48 && payload[1] < 58) {
              t3 = t3 * 10 + (payload[1] - 48);
              if(payload[2] == 46) {
                if(payload[3] >= 48 && payload[3] < 58) t4 = payload[3] - 48;
              }
            }
            if(payload[1] == 46) {
              if(payload[2] >= 48 && payload[2] < 58) t4 = payload[2] - 48;
            }
          }
        }
      }
    }
     
  13. saha74

    saha74 Гик

    Плюсовая температура показывает корректно а с минусовой у меня проблема в топике отображается как 4086.63 при минус 10 гр. Буду дальше ковырять датчик наружный. Большое спасибо Вам за оперативность и код.
     
    IvanUA нравится это.
  14. IvanUA

    IvanUA Гуру

    А что у вас за датчик и схема?
     
  15. yrbas

    yrbas Нерд

  16. IvanUA

    IvanUA Гуру

    Ну вам как бы сообщают что у вас не верный ключ. ;-)
     
  17. Oleksandr54

    Oleksandr54 Нерд

    Точно неверний (неправильний, ложний, плохой, нерабочий ...) ;)
     
  18. jgupdimon

    jgupdimon Гик

    Привет,
    Ivan Можно спросить как добавить в скетч других углов разворота матриц, (даже с зеркальным отображением и минусовыми углами) попалась матрица на общих анодах вот и не знаю как угол поменять. Спасибо.
     
  19. jgupdimon

    jgupdimon Гик

    И еще вопрос, можно добавить датчики DS1820, DS18S20?
     
  20. saha74

    saha74 Гик

    С датчиком наружной температуры у меня полная лажа не могу найти рабочей схемы. Брал скетч с 145 поста но с ним не заработал не один датчик что есть у меня (временами хочет работает хочет нет). Может кто то подкинет рабочий проект что бы датчик ds18b20 через esp8266 отправлял данные на cloudmqtt.com так ка самому не хватает ума написать.