Простейший вывод com->server

Тема в разделе "Arduino & Shields", создана пользователем Gregory, 31 мар 2013.

  1. Gregory

    Gregory Нуб

    Дано
    Термометр, построенный на ардуино (1-ware) + МЭЛТовский дисплейчик куда выводятся показания термометра.​
    Компьютер, куда по usb сливаются значения температуры (ОС или linux или win 7).​
    Программа для определения температуры, отправки её на дисплей и usb порт готова.​
    ЛВС из 5 компьютеров+3 смартфона с фафлей​
    Вопрос:
    Хочется что бы заходя на ip компьютера, к которому подключена Arduino, выводилась температура. Т.е. мне нужно что бы данные из usb порта передавались на веб-сервер.​


    С программированием знаком поверхностно но в голове есть идея складывать значение usb порта в файл, а при обращении к веб-серверу открывался бы этот файл и выдавалось бы всё, что написано в этом файле.

    Очень прошу помощи. Постараюсь ответить на все необходимые вопросы в силу своей компетенции.



    upd 1 от 31.03 Забыл добавить что купить ethernet шилд в данный момент нет возможности :(
     
  2. HighDigital

    HighDigital Гик

    Ежели хотите через С++ записывать данные в файл, а так же считывать оттуда - то могу скинуть свою программку и код, проверенная.
    Так же через С++ можно и с сервером общаться, но никогда этим не пробовал заняться :(
    А Enthernet Shield и не нужен, если вы с СОМ порта читаете.
    Пишите программку в черном окне. При обращении сервера к ней, она считывает с СОМ порта данные, при необходимости обрабатывает, предоставляет информацию серверу, а так же сохраняет её в файл/лог. После да же можно график из данных в логе составлять за день, температура/давление.

    Я то же планировал этим заняться, пока времени нету.
    Попробуйте гуглу задать вопрос.
     
  3. Gregory

    Gregory Нуб

    Скиньте, если не трудно. Буду пытаться разобраться. Гугл уже неделю изучаю, успехов нет. А шилд можно использовать тогда минуя компьютер, я это имел ввиду.
     
  4. HighDigital

    HighDigital Гик

    Пользуйтесь на здоровье - в main.cpp я оставил комментарии по работе. :)
    Так же, вместо in << "hello, world\n"; можно сохранять переменную таким образом:
    Код (Text):
    int x = 0; // Сюда сохраняем полученные данные
    in << x << "\n";
     

    Вложения:

    • FileOUT.zip
      Размер файла:
      529,7 КБ
      Просмотров:
      307
  5. Gregory

    Gregory Нуб

    Спасибо. Буду разбираться и ждать ещё ответов :)
     
  6. Витя

    Витя Гик

    Вот написал быстро простой веб-сервер на Python.
    PHP:
    #!/usr/bin/python

    import socket
    import sys
     
    def showtemp(client):
            f = open('/dev/cu.usbmodem3a21231')
            line = f.readline()
            f.close()
            client.send(line)
     
    port = 8080
     
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('', port))
    s.listen(2)
     
    while 1:
            client, address = s.accept()
            print "Connection from ", address[0]
            client.send("HTTP/1.0 200 OK\r\n")
            client.send("Content-Type: text/plane\r\n")
            client.send("\r\n")
            showtemp(client)
            client.send("\r\n")
     
            client.close()
     
    Запускается на 8080 порту и на любое подключение выдает то, что прочтет из ардуинки. У меня на маке это /dev/cu.usbmodem3a21231, но в виндоус будет com порт какой-нибудь например. Нужно указать в общем где ардуина. Можно изменить чтение данные из ардуино на какой-нибудь файл, просто указав к нему путь, можно считать его весь если вместо .readline() написать .readlines().

    Пример работы:
    Screen Shot 2013-03-31 at 6.46.38 PM.png
     
  7. Gregory

    Gregory Нуб

    Спасибо громадное. :)). Но вот вопрос. С питоном встречаюсь впервые, так что... Скачал-установил-создал файл-сохранил (прямо в директории программы). Но при обращении к командной строке в вин 8(сейчас сижу за основным ПК) пишет ошибку синтаксиса в строке 19 print "Connection from ", address[0]

    И указатель ошибки показывает на закрывающую кавычку.
     
  8. HighDigital

    HighDigital Гик

    Я с ним то же, ничего подсказать не могу. :)
    Все вопросы к Витя
     
  9. Gregory

    Gregory Нуб

    Да... Буду ждать.
     
  10. Витя

    Витя Гик

    Это наверное потому что питон 3 версии. Многие больше любят вторую версию вот и у меня 2.7 а в 3 так много переделали всего что даже код стал несовместим. print в 3 версии нужно в скобках делать это теперь функция.
     
  11. Gregory

    Gregory Нуб

    Скобки не помогают, побывал :). Щас второй питон скачаю, мне не принципиально
     
  12. Витя

    Витя Гик

  13. Gregory

    Gregory Нуб

    Сама страничка даже с локалхоста не открывается. Может быть проблемма в том что вывод происходит малой задержкой (скажите сколько надо-сделаем) и сразу кучей строк:
    ROM = 28 A6 BA D7 2 0 0 CA
    Data = 1 60 1 4B 46 7F FF 10 10 B5 CRC=B5
    Temperature = 22.00 Celsius, 71.60 Fahrenheit
    No more addresses.
     
  14. Витя

    Витя Гик

    А вывод происходит как, как строка или просто поток данных? println должен быть, иначе в коде сервера readline зависнет и будет ждать перевода каретки.
     
  15. Gregory

    Gregory Нуб

    Serial.println (xxx); естественно.
     
  16. Витя

    Витя Гик

  17. Gregory

    Gregory Нуб

    Там при открытии веб-странички браузером, такое ощущение что наступает рекурсия. Ибо ни ошибку не пишет ни открывает значение.
     
  18. Витя

    Витя Гик

    В f.readline() наверное зависает. Добавь вывод строк перед и после этой строки чтобы знать что сервер делает.
     
  19. Gregory

    Gregory Нуб

    Если так понял, то такой вот код (см ниже) тоже не работает
    #!/usr/bin/python


    import socket
    import sys

    def showtemp(client):
    f = open('com3')
    print "Check1"
    line = f.readline()

    print "check2"
    f.close()
    client.send(line)

    port = 8080

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    s.bind(('', port))
    s.listen(2)

    while 1:
    client, address = s.accept()
    print "Connection from ", address[0]
    client.send("HTTP/1.0 200 OK\r\n")
    client.send("Content-Type: text/plane\r\n")
    client.send("\r\n")
    showtemp(client)
    client.send("\r\n")

    client.close()
     
  20. Витя

    Витя Гик

    Не знаю, наверное нельзя просто так похоже в виндоус открыть ком порт как файл и читать без забот. Используй библиотеку которую я выше дал ссылки, там нормальная работа с последовательным портом, выстави скорость.