Нужна помощь с кодом.

Тема в разделе "Arduino & Shields", создана пользователем AngelLeo, 17 июн 2016.

  1. AngelLeo

    AngelLeo Нуб

    Доброго времени суток уважаемые форумчане.

    Есть dataFile в котором хнанится значение raw в формате Char (точнее значение храниться в документе на флешке и считываеться в dataFile)

    это значение Char нужно перевести в unsigned int для вставки значения.

    unsigned int irSignal[67] ={тут значение Char};

    в оригинале значения raw равны (4550,4450, 600,1650, 550,1700, 600,1650, 550,550, 600,550, 550,550, 550,550, 600,550, 550,1700, 550,1700, 550,1650, 550,600, 550,550, 550,600, 550,550, 600,500, 600,550, 550,1700, 550,1650, 600,1650, 550,600, 550,550, 550,550, 600,550, 550,1700, 550,550, 550,550, 600,550, 550,1700, 550,1650, 600,1650, 550,1700, 600)

    Занимаюсь Arduino не так давно поэтому возникают проблемы в программировании.

    Заранее спасибо.
     
  2. AlexU

    AlexU Гуру

    Я так понимаю, что в Вы используете двух-байтовый тип int.
    Тогда что бы ответить на этот вопрос нужно знать в каком виде данные хранятся в файле, а именно порядок байт (big-endian/little-endian). "значение raw в формате Char" -- почти не о чём не говорит.
     
  3. AngelLeo

    AngelLeo Нуб

    Я немного далек от программирования(((
    вот кусок моего кода

    File dataFile = SD.open(String(val,DEC)); // Открываем файл
    if (dataFile) {
    while (dataFile.available()) { // Проверяем что файл не пустой
    Serial.write(dataFile.read()); // выводим содержимое в сериал
    unsigned int irSignal[67] = {тут нужно вставить значение из dataFile} ; // Тут вставляем raw код из datafile
    irsend.sendRaw(irSignal, 67, 38);

    SD.open открывает текстовый файл на флешке в котором записано значение raw
    в каждом файле содержится одинаковое содержимое вида

    4550,4450, 600,1650, 550,1700, 600,1650, 550,550, 600,550, 550,550, 550,550, 600,550, 550,1700, 550,1700, 550,1650, 550,600, 550,550, 550,600, 550,550, 600,500, 600,550, 550,1700, 550,1650, 600,1650, 550,600, 550,550, 550,550, 600,550, 550,1700, 550,550, 550,550, 600,550, 550,1700, 550,1650, 600,1650, 550,1700, 600
    код кнопки.
    тоесть при отправке определенной команды, на флешке открывается определенный файл, его содержимое считывается и это содержимое нужно вставить в
    unsigned int irSignal[67] = {тут нужно вставить значение} ;
    для отправки этого содержимого.
     
  4. ZAZ-965

    ZAZ-965 Гуру

    Привести значение char к unsigned int
    Код (C++):
     unsigned_int_value = (uint16_t) char_value;
    Вот только вам, по-моему, не преобразование типов нужно.
    Может вбить массив сразу в программу?
     
  5. AngelLeo

    AngelLeo Нуб

    знать бы как ((( С программированием знаком поверхностно самообучение и то с delphi. Сейчас начал изучать arduino но тут многое отличается.
     
  6. AlexU

    AlexU Гуру

    Один из вариантов как заполнить массив целых при условии, что данные в файле хранятся в little-endian и размер файла строго 134 байта:
    Код (C++):

    File dataFile = SD.open(String(val,DEC)); // Открываем файл
    if (dataFile) {
      unsigned int irSignal[67]; // выделяем память под массив целых
      unsigned char *charBuffer = (unsigned char *) irSignal; // создаём указатель типа u. char, который указывает
                                               // на участок памяти выделенный под массив целых
      while (dataFile.available()) { // Проверяем что файл не пустой
        *(charBuffer++) = dataFile.read(); // заполняем память массива целых
      }
      irsend.sendRaw(irSignal, 67, 38);
    }
     
    Если вышеперечисленные условия не выполняются, то код должен быть другим...
     
  7. AlexU

    AlexU Гуру

    Правильно, простое преобразование типов даст неверный результат.
    Как вариант, всё можно загнать в виде констант во flash. Если памяти хватит.
     
  8. ZAZ-965

    ZAZ-965 Гуру

    Код (C++):
    unsigned int irSignal[67] = {4550,4450, 600,1650, 550,1700, 600,1650, 550,550, 600,550, 550,550, 550,550, 600,550, 550,1700, 550,1700, 550,1650, 550,600, 550,550, 550,600, 550,550, 600,500, 600,550, 550,1700, 550,1650, 600,1650, 550,600, 550,550, 550,550, 600,550, 550,1700, 550,550, 550,550, 600,550, 550,1700, 550,1650, 600,1650, 550,1700, 600};
    Здесь http://forum.amperka.ru/threads/Пульт-ду-с-одной-кнопкой.6102/ человек решал похожую проблему.
     
  9. AngelLeo

    AngelLeo Нуб

    По подобному я изначально делал! Все заработало но мне нужно много кнопок прикрутить и от разных устройств код получается слишком огромным? что один только пульт влезет на 3-4- уны, а мне нужно помимо кнопок прикрутить еще управление по wifi или buetooch
     
    Последнее редактирование: 17 июн 2016
  10. ZAZ-965

    ZAZ-965 Гуру

    AngelLeo, irsend.sendRaw используют когда не получилось определить тип сигнала. При использовании sendNEC, sendPanasonic, sendRC5 и т.д объем кода сильно сократится. Если не нужно декодирование посылок можно дополнительно отключить все DECODE.
     
  11. AngelLeo

    AngelLeo Нуб

    Беда в том, что на пульт samsung в библиотеке не нашел sendSamsung как и на 10 прочих устройств. Поэтому приходиться использовать sendRaw. я уже пару недель сижу с этим чудо аппаратом. Пытаясь максимально ужать код и облегчить добавление новых функций. Вариант с картой памяти мне кажется идеальным. Так можно добавить всю квартиру. прикрутить все вплоть до управления светом и теплыми полами.
     
  12. AngelLeo

    AngelLeo Нуб

    попытался прикрутить код но не получается.
    файлы весят каждый по 316 байт.
     
  13. AlexU

    AlexU Гуру

    Прикрепите один из файлов к сообщению. Что-то есть сомнения насчет
     
  14. ZAZ-965

    ZAZ-965 Гуру

  15. AngelLeo

    AngelLeo Нуб

    прикрепил файл. таких 50 штук содержимое отличается исключительно в цифрах
     

    Вложения:

    • 1.txt
      Размер файла:
      316 байт
      Просмотров:
      505
  16. AngelLeo

    AngelLeo Нуб

    беда в том что если поменять что то к примеру убрать запятые, то код перестает работать. а запятые иногда стоят в разных местах к примеру
    1 вариант 4600,650,4000
    2 вариант 600,4800,550,
     
  17. AlexU

    AlexU Гуру

    Прошу прощения за неполное предыдущее сообщение -- отправлял с планшета, но что-то пошло не так....
    Представленный Вами файл содержит не 'raw' данные, а данные в формате csv (comma separated values). Читать такие файлы надо по другому. Пример кода привести не могу, нет времени.
    Почему не хотите использовать действительно 'raw' данные?
     
  18. AngelLeo

    AngelLeo Нуб

    Вот получается считал с кнопки
    Encoding : SAMSUNG
    Code : E0E030CF (32 bits)
    Timing[67]:
    +4600, -4450 + 600, -1650 + 600, -1600 + 650, -1600
    + 650, - 500 + 600, - 500 + 650, - 450 + 650, - 500
    + 600, - 500 + 650, -1600 + 650, -1600 + 600, -1650
    + 600, - 500 + 650, - 450 + 650, - 500 + 600, - 500
    + 650, - 500 + 600, - 500 + 650, - 450 + 650, -1600
    + 650, -1600 + 650, - 450 + 650, - 500 + 600, - 500
    + 650, - 500 + 600, -1600 + 650, -1600 + 650, - 500
    + 600, - 500 + 650, -1600 + 600, -1650 + 600, -1600
    + 650, -1600 + 650
    unsigned int rawData[67] = {4600,4450, 600,1650, 600,1600, 650,1600, 650,500, 600,500, 650,450, 650,500, 600,500, 650,1600, 650,1600, 600,1650, 600,500, 650,450, 650,500, 600,500, 650,500, 600,500, 650,450, 650,1600, 650,1600, 650,450, 650,500, 600,500, 650,500, 600,1600, 650,1600, 650,500, 600,500, 650,1600, 600,1650, 600,1600, 650,1600, 650}; // SAMSUNG E0E030CF
    unsigned int data = 0xE0E030CF;

    мне нужно именно
    unsigned int rawData[67] = {4600,4450, 600,1650, 600,1600, 650,1600, 650,500, 600,500, 650,450, 650,500, 600,500, 650,1600, 650,1600, 600,1650, 600,500, 650,450, 650,500, 600,500, 650,500, 600,500, 650,450, 650,1600, 650,1600, 650,450, 650,500, 600,500, 650,500, 600,1600, 650,1600, 650,500, 600,500, 650,1600, 600,1650, 600,1600, 650,1600, 650}; // SAMSUNG E0E030CF

    проблема в том, что в библиотеке нет возможности использовать коды Samsung вида unsigned int data = 0xE0E030CF

    а у меня все TV samsung
     
  19. DIYMan

    DIYMan Guest

    @AngelLeo, я вам на ардуинору полный пример уже выложил, пробуйте. И да - если хотите заниматься программированием - надо начинать с основ, читать учебники, самообразовываться, в общем.
     
  20. AlexU

    AlexU Гуру

    У Вас неверно старая версия. Посмотрите здесь: https://github.com/z3t0/Arduino-IRremote там есть функция 'sendSAMSUNG'.