Проверка интернет соединения на Arduino

Тема в разделе "Глядите, что я сделал", создана пользователем leo141198, 26 авг 2012.

  1. leo141198

    leo141198 Нерд

    Всем привет!
    Нужна помощь в написании скрипта (желательно на python) который будет проверять возможность подключения к сети интернет или же доступность сервера (например: 74.125.232.232 - один из ip-адресов google.com) и отправка данных на COM порт. С написанием скетча справлюсь сам.

    Заранее спасибо! ;)
     
  2. nailxx

    nailxx Официальный Нерд Администратор

    Код (Text):

    # -*- coding: utf-8; -*-
     
    from urllib2 import urlopen, URLError
     
    def check_network():
        try:
            urlopen('http://google.com', timeout=5)
        except URLError, e:
            internet_fail() # ваше поведение без интернета
        else:
            internet_ok() # ваше поведение с интернетом
     
    if __name__ == '__main__':
        check_network()
     
     
  3. leo141198

    leo141198 Нерд

    Это на каком языке написано (на python не похоже (или я чего-то не понимаю))?
     
  4. nailxx

    nailxx Официальный Нерд Администратор

    Python 2.x это. Очень даже pythonic выглядит.
     
    dimka нравится это.
  5. leo141198

    leo141198 Нерд

    Но этот код ведь но отправляет данные на COM порт, не так ли? :)
     
  6. nailxx

    nailxx Официальный Нерд Администратор

    Да, вы же сказали, что сами сделаете.

    Код (Text):

    # -*- coding: utf-8; -*-
     
    import serial
     
    from urllib2 import urlopen, URLError
     
     
    def check_network():
        # Открываем serail на порту /dev/ttyACM0
        io = serial.Serial('/dev/ttyACM0', 9600)
     
        try:
            urlopen('http://google.com', timeout=5)
        except URLError, e:
            io.write("N\n") # нет интернетов — отправляем N
        else:
            io.write("Y\n") # есть интернеты — отправляем Y
     
     
    if __name__ == '__main__':
        check_network()
     
     
  7. leo141198

    leo141198 Нерд

    Не было такого :). Я сказал, что только скетч сам напишу :rolleyes:. Да, кстати, нужны ли сторонние библиотеки (кроме pyserial)?
     
  8. nailxx

    nailxx Официальный Нерд Администратор

    Не нужны. urllib2 — это builtin.

    Ещё я чуть подправил код, скопируйте заново.
     
  9. leo141198

    leo141198 Нерд

    А почему, когда открывается сама программа, то через секунду она закрывается?
     
  10. nailxx

    nailxx Официальный Нерд Администратор

    Потому что так сделано: проверили, отправили, закрылись. Можете организовать бесконечный цикл:

    Код (Text):

    # -*- coding: utf-8; -*-
     
    import serial
     
    from time import sleep
    from urllib2 import urlopen, URLError
     
     
    def check_network():
        # Открываем serail на порту /dev/ttyACM0
        io = serial.Serial('/dev/ttyACM0', 9600)
     
        try:
            urlopen('http://google.com', timeout=5)
        except URLError, e:
            io.write("N\n") # нет интернетов — отправляем N
        else:
            io.write("Y\n") # есть интернеты — отправляем Y
     
     
    def main():
        try:
            while True:
                check_network()
                sleep(5)
        except KeyboardInterrupt:
            pass
     
    if __name__ == '__main__':
        main()
     
     
    paththeir нравится это.
  11. leo141198

    leo141198 Нерд

    Спасибо!!! Все работает
     
  12. nailxx

    nailxx Официальный Нерд Администратор

  13. leo141198

    leo141198 Нерд

    Уже не работает :)
    Вот сам скетч:
    Код (Text):
    int ledPin=13; //светодиод подключен к 13му выходу на плате
    int ser=0; //В эту переменную получаем данные
     
    void setup() {
      pinMode(ledPin,OUTPUT); //13 вывод на плате определяем как выход
      Serial.begin(9600);//работаем с COM-портом на скорости 9600 бит/с (обычно это стандартное значение для последовательного порта)
    }
     
    void loop ()
    {
      ser = Serial.read();//читаем полученное значение
      if (ser == 'Y') //если это  1
      {
          digitalWrite(ledPin,HIGH); //зажигаем диод
      }
      if (ser =='N') //если 2
      {
          digitalWrite(ledPin, LOW);//диод выключаем
      }
    }
    Видимо дело в том, что буква в константу записываться не может, и нужно править код python, но так как я его не знаю, нужна помощь в правке :rolleyes:
     
  14. nailxx

    nailxx Официальный Нерд Администратор

    Попробуйте `char ser` вместо `int`.
     
  15. leo141198

    leo141198 Нерд

    Все равно, светодиод просто мигает
     
  16. Кхм...
    Код (Text):
    # -*- coding: utf-8; -*-
     
    import serial
     
    from time import sleep
    from urllib2 import urlopen, URLError
     
     
    def check_network():
        # Открываем serail на порту /dev/ttyACM0
        io = serial.Serial('/dev/ttyACM0', 9600)
     
        try:
            urlopen('http://google.com', timeout=5)
        except URLError, e:
            io.write("2\n") # нет интернетов — отправляем N
        else:
            io.write("1\n") # есть интернеты — отправляем Y
     
     
    def main():
        try:
            while True:
                check_network()
                sleep(5)
        except KeyboardInterrupt:
            pass
     
    if __name__ == '__main__':
        main()
    Код (Text):
    int ledPin=13; //светодиод подключен к 13му выходу на плате
    int ser=0; //В эту переменную получаем данные
     
    void setup() {
      pinMode(ledPin,OUTPUT); //13 вывод на плате определяем как выход
      Serial.begin(9600);//работаем с COM-портом на скорости 9600 бит/с (обычно это стандартное значение для последовательного порта)
    }
     
    void loop ()
    {
      ser = Serial.read();//читаем полученное значение
      if (ser == '1') //если это  1
      {
          digitalWrite(ledPin,HIGH); //зажигаем диод
      }
      if (ser =='2') //если 2
      {
          digitalWrite(ledPin, LOW);//диод выключаем
      }
    }
    Сложно так сделать? :)
     
  17. leo141198

    leo141198 Нерд

    Я не знаю в чем проблема, но светодиод просто мигает, означая, что на него поступает сигнал, но не включается / выключается, когда есть / нету доступа в сеть
     
  18. Попробуйте ещё так:
    Код (Text):
    # -*- coding: utf-8; -*-
     
    import serial
     
    from time import sleep
    from urllib2 import urlopen, URLError
     
     
    def check_network():
        # Открываем serail на порту /dev/ttyACM0
        io = serial.Serial('/dev/ttyACM0', 9600)
     
        try:
            urlopen('http://google.com', timeout=5)
        except URLError, e:
            io.write("2") # нет интернетов — отправляем N
        else:
            io.write("1") # есть интернеты — отправляем Y
     
     
    def main():
        try:
            while True:
                check_network()
                sleep(5)
        except KeyboardInterrupt:
            pass
     
    if __name__ == '__main__':
        main()
    Код (Text):
    int ledPin=13; //светодиод подключен к 13му выходу на плате
    char ser; //В эту переменную получаем данные
     
    void setup() {
      pinMode(ledPin,OUTPUT); //13 вывод на плате определяем как выход
    digitalWrite(ledPin, LOW); // выключаем светодиод
      Serial.begin(9600);//работаем с COM-портом на скорости 9600 бит/с (обычно это стандартное значение для последовательного порта)
    }
     
    void loop ()
    {
      ser = char(Serial.read());//читаем полученное значение
      if (ser == '1') //если это  1
      {
          digitalWrite(ledPin,HIGH); //зажигаем диод
      }
      if (ser =='2') //если 2
      {
          digitalWrite(ledPin, LOW);//диод выключаем
      }
    }
     
  19. Должно помочь 100%!
     
  20. mike124

    mike124 Нерд

    Ну что, заработало?