Ничего не найдено :(
    В гостях у Самоделкина! » Темы » Советы » SIM800L передача данных с Arduino на сервер

    SIM800L передача данных с Arduino на сервер

    Как подключить модуль SIM800L к интернету а именно к серверу и получить от него какие то данные? Сейчас набегут “ЭКСПЕРТЫ” и скажут да это же элементарно. И с ними не поспоришь, скажут мол в интернете куча примеров и тд и тп. Но порывшись в интернете я ничего подобно не нашёл а нет нашел есть куча примеров с объяснением что из себя представляет сам модуль как им управлять через SMS и скажу вам это всё хорошо но именно как он работает с GPRS нет. Я не являюсь каким то экспертом или программистом. Но в свободное время пытаюсь создавать разные самоделки и мне понадобилось в одной из моих самоделок выводить данные в интернет и получать к ним доступ именно из сети. И я решил использовать данный модуль SIM800L порывшись в интернете ничего вразумительного не нашёл. И уже думал закинуть саму затею как вдруг...

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

    Наш проект будет состоять из следующих комплектующих а именно

    1 Arduino pro mini

    2 Датчика температуры BMP 180

    3 GSM/GPRS модуля SIM800L
    Схема подключения GSM/GPRS модуля SIM800L типичная. Напряжение на модуль подавать не более чем 4,2 вольта, лучше в районе 4 вольт держать тогда и мощность передатчика теряться не будет. Схема ниже.



    Датчик температуры BMP 180 также подключается по типичной схеме и сложностей с ним у вас не должно возникнуть, на всякий случай вот схема.

    SIM800L передача данных с Arduino на сервер


    В качестве сервера мы будем использовать бесплатный сервер https://thingspeak.com.



    Проходим регистрацию на сайте. Для этого нажимаем на вкладку SING IN и переходим далее.



    Если вы когда то уже регистрировались на этом сайте, то можете переходить далее если нет, то проходим регистрацию далее. Нажимаем Create one!



    Переходим на следующую вкладку . В строке Email Address в ней вводим эмейл на который придёт письмо активации. В строке Location выбираете свою страну. В строке First Name пишете свое имя. В строке Last Name вводите свою фамилию и нажимаете далее.



    После чего вам на почту придёт письмо со ссылкой для активации аккаунта. Переходите по ссылке из письма и вводите свой логин и пароль.



    Далее в основном меню сайта выбираем вкладку CHANNELS и из выпадающего списка выберите MY CHANNELS. Тогда перейдете на вкладку MY CHANNELS. Нажимаете NEW CHANNELS.





    В поле Name пишите имя вашего канала. И создайте три поля как на картинке. Заполните их следующими именами: Temperature, Pressure, Altitude. И нажимаем кнопку SAVE.





    Переходим на следующую вкладку. И видим три пустых поля. Далее находим вверху страницы вкладу API KEYS . В ней находим Write API Key и из этой графы скопируйте ключ.





    Далее сворачиваем всё это и открываем среду ардуино для заливки скетча.
    В скетче находим следующею строку и туда вставляем свой ключ.



    Загружаем скетч в ардуино и смотрим результат. Результат будет у вас отображаться на вкладке MY CHANNELS у виде графика.



    Сам скетч не сложный и я его питался сделать максимально понятным . Он хорошо закомментирован для максимального понимания того что и как делает программа и что бы вам можно было его легко модифицировать для своих самоделок. Я его приведу в полном виде как есть, код проверенный и работает сейчас в моем проекте.

    Чуть не забыл SIM800L сам умеет определять настройки интернета и прописывать их совсем нет смысла.

    А вот и сам код непосредственно.

    #include <SoftwareSerial.h>//подключаем библиотеку для работы с серийным портом
    #include <Wire.h>//подключаем библиотеку для работы с кабелем I2C
    #include <Adafruit_BMP085.h>//подключаем библиотеку для работы с датчиком BMP180
    #define seaLevelPressure_hPa 1013.00// определяем давление над уровнем моря
    SoftwareSerial gprsSerial(3, 2);// определяем пины к которым будет подключен датчик BMP180
    Adafruit_BMP085 bmp;//запускаем работу библиотеки
    
    void setup()//цикл конфигурации портов
    {
      gprsSerial.begin(9600);// устанавливаем скорость порта для GPRS 
      Serial.begin(9600);    //устанавливаем скорость серийного порта 
      if (!bmp.begin())//если датчик не начал работу то... 
      {
        Serial.println("датчик неисправен либо отсутствует");// выводим в серийный порт
        while (1) {}//будем ждать когда датчик заработает и тогда переходим дальше
      }
    }
    
    void loop()// основной цикл программы
    {
      if (gprsSerial.available())// если датчик модуль связи отвечает то...
        Serial.write(gprsSerial.read());// пишем в серийный порт а модуль связи 
                                        //прослушивает то что приходит из серийного порта
    
        gprsSerial.println("AT");//пишем в серийный порт
      delay(1000);// ждем ответ от модуля
    
      gprsSerial.println("AT+CPIN?");//проверяем статус SIM карты
      delay(1000);// ждем ответ от модуля
    
      gprsSerial.println("AT+CREG?");//проверяем тип регистрации в сети
      delay(1000);// ждем ответ от модуля
    
      gprsSerial.println("AT+CGATT?");// проверяем подключен ли модуль к GPRS
      delay(1000);// ждем ответ от модуля
    
    
      gprsSerial.println("AT+CIPSHUT");// сброс всех tcp/ip соединений
      delay(1000);// ждем ответ от модуля
    
    
      gprsSerial.println("AT+CIPSTATUS");// проверяет состояние инициализации IP стека
      delay(2000);// ждем ответ от модуля
    
    
      gprsSerial.println("AT+CIPMUX=0");//настраиваем соединение только с одним сервером
      delay(2000);// ждем ответ от модуля
    
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
      gprsSerial.println("AT+CSTT=\"airtelgprs.com\"");//запуск настроек соединения
                                                     //и подключение к заданному серверу,
      delay(1000);// ждем ответ от модуля
    
    
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
      gprsSerial.println("AT+CIICR");//устанавливаем беспроводное подключение GPRS
      delay(3000);// ждем ответ от модуля
    
    
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
      gprsSerial.println("AT+CIFSR");//запрашиваем локальный IP адрес
      delay(2000);// ждем ответ от модуля
    
    
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
      gprsSerial.println("AT+CIPSPRT=0");//отключаем запрос данных
      delay(3000);// ждем ответ от модуля
    
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
      gprsSerial.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");
    //устанавливаем TCP соединение,
                                                                  
    //подключаемся к серверу на порт 80 сервера
      delay(6000);// ждем ответ от модуля
    
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
    
      gprsSerial.println("AT+CIPSEND");//начинаем отправку данных на сервер
      delay(4000);// ждем ответ от модуля
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
      String str = "GET https://api.thingspeak.com/update?api_key=E64T2AQVSXQ4UUAY&field1=" + String(bmp.readTemperature()) + "&field2=" + String(bmp.readSealevelPressure()) + "&field3=" + String(bmp.readAltitude(seaLevelPressure_hPa * 100));
                        //формируем поток данных для отправки на сервер   
      Serial.println(str);
    //выводим в серийный порт поток данных которые будут отправляется на сервер 
      gprsSerial.println(str);//передаем поток данных на отдаленный сервер
    
      delay(4000);// ждем ответ от модуля
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
      gprsSerial.println((char)26);
    //определяем длину потока данных для отправки на отдаленный сервер
      delay(5000);// ждем ответ от модуля
      gprsSerial.println();//передаем данные на сервер
    
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    
      gprsSerial.println("AT+CIPSHUT");//закрываем соединение после передачи данных и перезагружаем соединение
      delay(100);// ждем ответ от модуля
      ShowSerialData();//отображаем процесс формирования и отправки данных на сервер
    }
    void ShowSerialData()//цикл обработки и показа передачи данных на сервер
    {
      while (gprsSerial.available() != 0)//создадим цикл который будет ожидать ответ от передатчика,
                                         //если он исправен или работает то...
        Serial.write(gprsSerial.read());// читаем данные из передатчика и выводим содержимое в серийный порт
        delay(5000);// ждем ответ от модуля
    
    }
    Подборки: Arduino

    Стальная роза

    Изготовление чехла для крыла

    Добавить комментарий

    10 комментариев
    Гость Виталий #87904

    Здравствуйте. Можно ли пожалуйста более подробней объяснить строку формирования данных на сервер,"&field2=" - откуда взято это значение?Если можно пообщаться в соц сетях или через почту для консультаций. .String str = "GET https://api.thingspeak.com/update?api_key=E64T2AQVSXQ4UUAY&field1=" + String(bmp.readTemperature()) + "&field2=" + String(bmp.readSealevelPressure()) + "&field3=" + String(bmp.readAltitude(seaLevelPressure_hPa * 100));

    wariorjam #76111 Автор
    Гость Sergey,


    да

    Гость Sergey #75971

    SoftwareSerial gprsSerial(3, 2);// определяем пины к которым будет подключен датчик BMP180. Всё верно, BMP180?

    Korolev #75890
    Eig,
    Отдаленный сервер – это прекрасно, я считаю.

    А мне больше импонирует "удалённый" (Delete) сервер!  xaxa 

    Eig #75877

    Отдаленный сервер – это прекрасно, я считаю.

    Гость Андрей #75582
    • Если будет работать буду очень благодарен. Тоже долго искал скетч и также забросил.эту часть кода не надо перенести в  void setup()
    • gprsSerial.println("AT");//пишем в серийный порт

      delay(1000);// ждем ответ от модуля


      gprsSerial.println("AT+CPIN?");//проверяем статус SIM карты

      delay(1000);// ждем ответ от модуля


      gprsSerial.println("AT+CREG?");//проверяем тип регистрации в сети

      delay(1000);// ждем ответ от модуля


      gprsSerial.println("AT+CGATT?");// проверяем подключен ли модуль к GPRS

      delay(1000);// ждем ответ от модуля



      gprsSerial.println("AT+CIPSHUT");// сброс всех tcp/ip соединений

      delay(1000);// ждем ответ от модуля



      gprsSerial.println("AT+CIPSTATUS");// проверяет состояние инициализации IP стека

      delay(2000);// ждем ответ от модуля



      gprsSerial.println("AT+CIPMUX=0");//настраиваем соединение только с одним сервером

      delay(2000);// ждем ответ от модуля

    wariorjam #75533 Автор
    Гость Виталий,


    Смотрите комментарий

    Ramzes360 #75509

    Автор в теме,как рыба в воде,лайк однозначно.

    wariorjam #75496 Автор

      ЧИТАТЬ ВСЕМ

    В начале статьи не докопировались начальные строки. Я не заметил принощу извинения вот они ниже.

      


    #include <SoftwareSerial.h>//подключаем библиотеку для работы с серийным портом

    #include <Wire.h>//подключаем библиотеку для работы с кабелем I2C

    #include <Adafruit_BMP085.h>//подключаем библиотеку для работы с датчиком BMP180

    #define seaLevelPressure_hPa 1013.00// определяем давление над уровнем моря

    Гость Виталий #75485

    Пустые #include

    Привет, Гость!


    Зарегистрируйтесь

    Или войдите на сайт, если уже зарегистрированы...

    Войти

    Добавьте самоделку

    Добавьте тему

    Онлайн чат

    Последние комментарии

    Все комментарии