Подружим PHP и Arduino

Тема в разделе "Arduino & Shields", создана пользователем Denis.cpp, 9 дек 2012.

  1. Denis.cpp

    Denis.cpp Нерд

    вообщем надо это как то довести до такого состояния
    как в мониторе порта

    допустим вот так

    929
    930
    926

    мне в принципе достаточно одного значения, но чтобы оно с течением времени обновлялось,
    и потом я планирую это значение обработать,если вдруг приходит значение от 900 до 950, то такое действие(), если меньше 900 то такое действие() вот как то так, но будет несколько значений вот таких
    1 датчик 2 датчик
    920 0
    924 0
    926 1
    922 1

    и значения второго датчика будут тоже точно также обрабатываться.
     
  2. Vir

    Vir Гик

    Это значит, что в течении 30 секунд (которые отпущены скрипту для отработки), он так и не дождался 0xA.
     
  3. Vir

    Vir Гик

    Как вариант, можно самостоятельно передавать, какой-нибудь символ в конце строки, который будет читаться скриптом, как конец строки.
     
  4. Витя

    Витя Гик

    Я нашел в чем ошибка! php всеже работает нормально с типами и поэтому fread возврашала строку а мы его сравнивали с числом. Нужно число привести к строке или наоборот. 0xA можно сделать символом через chr. Вот я загрузил в свою ардуино такой же код который постоянно пишет что то и прочитал правильно. Все работает! :D :p ;)
    [​IMG]
     
  5. Denis.cpp

    Denis.cpp Нерд

    Level UP! :) ;) Да с задачей справились!Но есть по прежнему косяки вот смотри когда я обновляю страничку она иногда не все значения списывает, она списывает 92 или просто 9 или 927 или 27 или просто 7 как избавиться от таких приколов?И как организовать динамическое обновление веб страницы?, Можно её перезагружать постоянно? или можно допустим сделать чтобы только одно значение обновлялось?Есть соображения?
     
  6. Denis.cpp

    Denis.cpp Нерд

    Вот по поводу динамического обновления, я нашел!http://codething.ru/ajax.php , но всё равно не могу понять как сделать чтобы она нормально читала значения, она читает выборочный кусок, а иногда и весь кусок.Что с этим делать?
     
  7. Витя

    Витя Гик

    Странно, это физически не возможно должно быть. Я на ардуине все проверил сам и все работает. А покажите одновременно что выводит скрипт и что в этот момент поступает с порта?
     
  8. Vir

    Vir Гик

    Если кому надо, вот мой класс для считывания с датчиков информации, по запросу.
    PHP:
    <?php

    namespace Arduino\DefaultBundle\Services\Arduino;

    class ArduinoLibrary
    {
        const TEMPERATURE_SENSOR = 1;
        const HUMIDITY_SENSOR   = 2;
        const GRAYSCALE_SENSOR   = 3;
       
        private $port;
       
        /**
         * @param string $port
         */

        public function __construct($port)
        {
            if (empty($port))
            {
                throw new \InvalidArgumentException('Empty parameter $port');
            }
           
            $this->port = $port;
        }
       
        public function read($sensor)
        {
            $portHandle = fopen($this->port, 'r+');
           
            if (!$portHandle)
            {
                return false;
            }
           
            $result = '';
            $writed = false;
           
            while (true)
            {
                if (!$writed)
                {
                    fwrite($portHandle, $sensor);
                    $writed = true;
                }
               
                $line = fread($portHandle, 1);
                $result .= $line;
               
                if ($line == chr(0xA))
                {
                    break;
                }
            }
           
            fclose($portHandle);
            return $result;
        }
    }
    P.S. Не без вашей помощи написанный, кстати.
     
  9. Vir

    Vir Гик

  10. hibiki

    hibiki Гик

    по поводу 30 секунд - найдите в файле php.ini параметр max_execution_time и поставьте там нужное время в секундах

    тонкие материи... попробуйте после открытия порта вставить
    Код (Text):
    stream_set_blocking($handle,false);
     
    Denis.cpp нравится это.
  11. Denis.cpp

    Denis.cpp Нерд

    Вообщем с порта как обычно 926 идёт ну или что то в этом роде, а когла постоянно обновляю страничку приходит что то вроде 926, 92, 26, и тому подобное слишком часто часть приходит, сейчас думаю над динамическим обновлением страницы так что я даже не знаю стоит ли настраивать PHP.ini но за совет спасибо если что воспользуюсь!
    PHP:
    <?php
    $content = "";
    $handle = fopen("com6", "rb+");
    if (!$handle) die ("Печалька! Порт не открылся!");
    {
        while (fread($handle, 1) != chr(0xA)){}
            $a = fgets($handle);
            echo "value: ", $a;
    }  
    fclose($handle);
    ?>
     
  12. Vir

    Vir Гик

    Во-первых, зачем "rb+"?
    Во-вторых, значения Arduino посылает в loop'е или по запросу?
     
  13. hibiki

    hibiki Гик

    человек хочет еще и писать в тот же порт, поэтому и r+. а b - для поддержки штанов
     
  14. Vir

    Vir Гик

    Про "b" и так понятно, а то, что он ещё хочет писать в порт, в теме не нашёл как-то. Поэтому не понял, зачем "r+".
     
  15. Витя

    Витя Гик

    Сотрите арудино посылает данные так: 9 2 6 0xD 0xA 9 2 6 0xD 0xA 9 2 6 0xD 0xA 9 2 6 ...
    Вот мой лог:
    Код (Text):
    iMac:Desktop victor$ php -f ./test.php
    330d0a320d0a3139370d0a3232330d0a3231370d0a3139310d0a3230300d0a3232340d0a3231330d0a3139300d0a3230340d0a3232350d0a3231300d0a3139310d0a3230380d0a3232340d0a3230340d0a313930^C
     
    У вас такой же был.
    0xD 0xA значат конец строки, символы перевода и возврата каретки, enter короче. Данные поступают без остановки постоянно. Мы подключаемся к ним в неизвестный момент, поэтому чтобы не начать читать случайные данные мы ждем когда попадется первый 0xА, это значит нужно читать пока его не встретим. что мы и делаем:
    PHP:
    while (fread($handle, 1) != chr(0xA)){}
    Как только его прочли дальше значат будут цифры. Мы их читаем через fgets. fgets читает данные до тех пор, пока не встретит символы 0xd 0xa, т.е. конец строки.
    У нас это есть. Поэтому я не понимаю что за фантастика такая что не прочитывается все. Разве что какой то таймер по времени который ограничивает долгое чтение. Но не логично данные ведь поступают от ардуино постоянно и быстро.

    Можно попробовать еще такой способ. Тут все тоже самое только данные склеиваются по одному байту пока не встретится 0xd:
    PHP:
    <?php
    $h = fopen("/dev/cu.usbmodem3a21211", "rb");
    if (!$h) die ("Arduino not faund.");
     
    $a = "";
    while (fread($h, 1) != chr(0xA)) { }
    do {
      $t = fread($h, 1);
      if ($t == chr(0xD))
        break;
      $a = $a.$t;
    } while (1);

    echo "value: ", $a;
     
    fclose($h);
    ?>
     
  16. Vir

    Vir Гик


    Зачем учить новичка таким ужасным вещам? Die, архаичный do..while, if без скобок, плохая конкатенация...
     
  17. hibiki

    hibiki Гик

    чем вам в данном случае if без скобок не угодил? :) форматирование, конечно, оставляет желать, но почему все-таки нет?
     
  18. Vir

    Vir Гик

    Всё просто. Только одна операция будет выполнена после if'а без фигурных скобок. И когда, нам понадобится, чем-то дополнить алгоритм в условии, мы не задумываясь засунем туда ещё одну строку. И получим ошибку... а потом, по невнимательности (говорю, как программист с проф. стажем 8 лет), будем 10 минут втыкать, и не догонять, что же тут не так.
     
  19. hibiki

    hibiki Гик

    хм.. *смущенно* лет 10 уже пишу на языках с С-подобным синтаксисом, и именно такой ошибки никогда не было.
    честно - даже не подумал бы, что для кого-то "автоматизм скобок" может быть проблемой. спасибо за мнение :)

    p.s. у меня другая "фича" - ставлю кучу скобок в арифметических и логических выражениях - читается легче, имхо.
     
  20. Vir

    Vir Гик

    Если довод о выполнении только одной конструкции не возымел подобающего эффекта, то могу ещё привести сворачивание условий/циклов/методов в IDE =)

    Ну и плюс, эта тема (об ошибках в условиях без скобок) всплывает не только у меня, а ещё у доброй половины программистов =)

    Пишу-то я тоже с 16 лет, но проф. стаж работы программистом, только с 18. И для меня, это не теоретически возможная ошибка, а реальные случаи из практики.