2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 178
1

Arduino UNO + модуль SIM800L

19.05.2023, 12:59. Показов 361. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Никогда до этого ничего не делал на arduino. Но вот решил сделать проект авто-полива. Суть его проста:

На участке находится насос, который из бочки качает воду. Его нужно включать/выключать. Этим делом будет заниматься Arduino Uno R3 (долго выбирал, в итоге остановился на ней, хотя были другие варианты. Если подскажите другой вариант, и он будет дешевле то я буду только рад). Я понимаю, что можно просто настроить время полива и так далее, но меня интересует управления этой системой полива, через телефон. Для этого я напишу приложение под android/ios. Для того, чтобы на больших расстояниях управлять arduino, было решено подключить к ней модуль SIM800L (долго подбирал модуль, в итоге на чипе A6 такой модуль в продаже не нашёл, а вот вариант с синей платой SIM800L оказывается можно подключить без делителя напряжения, так написано на хабре). Суть в том, что в приложении можно настраивать на каждую культуру полив (время, кол-во воды, периодичность). Так же чтобы в любой момент можно было отключить полив (вдруг дождь) или же полить внепланово.

Посмотрел как это делается, суть там в том, что в arduino уже написана программа и на неё приходят данные (например задержка между поливом, время полива и т.д.). Но что если мне в какой-то момент понадобится кардинально поменять программу, логику переделать или же оптимизировать код. В силу своей неопытности с arduino, я идеально его с первого раза не напишу и уж тем более всех моментов не учту. Была бы не проблема просто прийти и зашить новую программу в arduino, но такую систему я хочу сделать не одну (родственников и знакомых у меня много), не буду же я ходить ко всем вставлять программатор и заливать новую программу. В интернете прочитал, что есть возможность заливать новую программу по "воздуху", но я не пойму как это сделать. Нужно ли какой-то код заранее в программу написать (я думаю что это костыль, но если нет другого способа, то уже ничего не поделаешь), чтоб он сигнал на обновление отправлял. Или вот например можно же программатор вставить, он же обновляет как-то программу, может ли прийти такой же сигнал от SIM800L. Подскажите нормальный способ. Возможно, какой-то модуль нужно докупить (смысл правда как можно дешевле сделать).

Вот перечень компонентов (ещё раз повторю, я новичок в этом деле), которые я выбрал, может чего-то не хватает или как-то удешевить можно, подскажите:
Контроллер
SIM800L
Насос
USB-Serial
USB для arduino (Uno можно через 12B разъём подключить, в розетку. Не знаю как лучше сделать: или купить переходник, который в розетку вставляется и с другой стороны много usb, так как там 12v насос ещё будет, но насос может поменяться, так как может понадобится мощнее и его тоже в розетку. Поэтому провод этот может и не понадобиться.)
Кабель M-M
Кабель F-F
Кабель F-M
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2023, 12:59
Ответы с готовыми решениями:

Arduino UNO + SIM800L
Доброго времени суток,прошу помочь мне с моей не задачей)). Приобрел с китая UNO и SIM800L,не как...

Arduino UNO. Как работать c RFID-сканнером и Arduino на одном Serial-порту?
Рас уж тут речь зашла об ардуине и многопоточности COM порта, думаю могу обратиться именно сюда за...

Arduino uno + arduino ethernet + delphi для чайников
Доброго времени суток. У меня такая задача нужно реализовать программу на Delphi которая...

Arduino sim800l
Ребята нашел хорошую рабочую статью, подредактировал под себя ну там что мне надо оставил то что не...

Arduino + sim800l
Помогите с кодом для ардуино. Включение реле по звонку с sim800l. Все перепробовал, так ничего не...

7
65 / 26 / 8
Регистрация: 06.03.2022
Сообщений: 150
24.05.2023, 17:14 2
Я так понимаю, что интернета там нигде нет? Просто если интернет есть, то проще поставить esp32.
У нее, к тому же, есть обновления по воздуху.
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 178
25.05.2023, 13:42  [ТС] 3
janis, интернета нет. Если бы esp32 мне подходил бы, я бы не создавал тему, так как по ней много информации. А вот по этой связке не нашёл решения, поэтому обращаюсь сюда. Если у вас есть другой вариант, с другими компонентами, но при этом интернет будет через симку, то я бы его рассмотрел
0
259 / 136 / 31
Регистрация: 25.08.2011
Сообщений: 799
25.05.2023, 13:52 4
KopHack, звучит как то масштабно.

если там есть связь то может быть рассмотреть все таки вопрос с интернетом?

По идее вам частая смена прошивок не нужна. Достаточно разработать базовую систему команд. Включить полив, отключить и др.
Затем при соединении через интернет с основным сервером просто забирать список команд и хранить его в еепром.
ну либо через смс отправлять последовательность команд но в смс сильно ограничен размер сообщения.

Принимать через интернет можно например вот так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include <SoftwareSerial.h>
 
// Пины подключения модуля SIM800L к Arduino
#define SIM800_TX_PIN 10
#define SIM800_RX_PIN 11
 
// Создание экземпляра SoftwareSerial для связи с модулем SIM800L
SoftwareSerial sim800(SIM800_TX_PIN, SIM800_RX_PIN);
 
// APN (Access Point Name) для вашего оператора связи
const char apn[] = "your_APN";
 
// URL файла для скачивания
const char fileURL[] = "http://example.com/file.txt";
 
void setup() {
  // Инициализация последовательного порта с модулем SIM800L
  sim800.begin(9600);
  
  // Подключение к сети оператора
  connectToNetwork();
  
  // Получение файла с сервера
  downloadFile();
}
 
void loop() {
  // Оставьте пустой цикл или добавьте необходимую логику
}
 
void connectToNetwork() {
  // Проверка готовности модуля SIM800L
  sim800.println("AT");
  delay(1000);
  
  while (!sim800.find("OK")) {
    // Если модуль не готов, ждем 1 секунду и повторяем попытку
    sim800.println("AT");
    delay(1000);
  }
 
  // Установка режима текстового режима для ответов модуля
  sim800.println("AT+CMGF=1");
  delay(1000);
  
  // Установка APN для подключения к сети оператора
  sim800.print("AT+CSTT=\"");
  sim800.print(apn);
  sim800.println("\"");
  delay(1000);
  
  // Активация GPRS
  sim800.println("AT+CIICR");
  delay(3000);
 
  // Ожидание установки связи с сетью
  while (!sim800.find("OK")) {
    // Если связь не установлена, повторяем попытку через 1 секунду
    sim800.println("AT+CIICR");
    delay(1000);
  }
  
  // Получение IP-адреса
  sim800.println("AT+CIFSR");
  delay(2000);
}
 
void downloadFile() {
  // Установка режима прозрачной передачи данных
  sim800.println("AT+CIPMODE=0");
  delay(1000);
  
  // Установка многопользовательского режима
  sim800.println("AT+CIPMUX=0");
  delay(1000);
 
  // Установка URL для скачивания файла
  sim800.print("AT+HTTPPARA=\"URL\",\"");
  sim800.print(fileURL);
  sim800.println("\"");
  delay(1000);
 
  // Начало загрузки файла
  sim800.println("AT+HTTPACTION=0");
  delay(2000);
  
  // Чтение ответа от модуля SIM800L
  String response = sim800.readString();
  
  // Поиск кода ответа HTTP
  int httpCodeIndex = response.indexOf("+HTTPACTION: 0,");
  if (httpCodeIndex != -1) {
    int httpCode = response.substring(httpCodeIndex + 16).toInt();
    
    // Проверка кода ответа HTTP (200 - OK)
    if (httpCode == 200) {
      // Получение размера файла
      int contentLengthIndex = response.indexOf("CONTENT-LENGTH:");
      if (contentLengthIndex != -1) {
        int contentLength = response.substring(contentLengthIndex + 16, response.indexOf("\r\n", contentLengthIndex)).toInt();
        
        // Чтение содержимого файла
        sim800.println("AT+HTTPREAD=0," + String(contentLength));
        delay(2000);
        
        // Вывод содержимого файла в монитор порта
        while (sim800.available()) {
          Serial.write(sim800.read());
        }
      }
    }
  }
  
  // Завершение HTTP-соединения
  sim800.println("AT+HTTPTERM");
  delay(1000);
}

Хотя мне кажется что лучше бы подошла какая нибудь платформа где можно самостоятельно определить рабочий поток. Что нибудь на STM32. на алике полно плат:
https://aliexpress.ru/item/100... 77027OMmsc

или https://aliexpress.ru/item/100... 77027OMmsc
0
65 / 26 / 8
Регистрация: 06.03.2022
Сообщений: 150
25.05.2023, 14:04 5
Если интернет через симку работает, может взять какой-нибудь недорогой роутер с симкой и wifi. Возможностей-то больше.

p.s. У меня на даче так и сделано.
0
259 / 136 / 31
Регистрация: 25.08.2011
Сообщений: 799
25.05.2023, 14:05 6
Логика даже еще проще получается.
допустим есть датчик дождя, и датчик света.
есть 5 линий с насосами.

Настроить таймер например на каждую минуту.
При срабатывании прерывания проверять разные программы:
тогда каждая программа будет иметь вид:
[№линии][Время ВКЛ][Время ВЫКЛ].

Также про прерыванию с датчика дождя выключаем все линии.

в еепром хранить блоки этих команд для 24 часового периода. Вот и все.
0
1004 / 624 / 211
Регистрация: 08.08.2014
Сообщений: 1,942
26.05.2023, 12:52 7
Цитата Сообщение от KopHack Посмотреть сообщение
Uno можно через 12B разъём подключить, в розетку
При выборе адаптера/блока питания (и DC-DC-конвертера, если он будет в схеме) смотрите на максимальный выдаваемый ток, т.к. SIM800L в пике потребляет до 2 ампер и, если ему это не предоставить, начинает терять сеть, отключаться в момент получения вызова или просто переходит в ошибочное состояние при первой же попытке найти сеть.

Насчёт делителя напряжения - это относится к тому пину SIM800L, по которому он получает данные от микроконтроллера (RX). А вот напряжение питания ему в любом случае придётся снижать до ~4 вольт, т.к. при больших значениях у него попросту будет срабатывать защита.

Добавлено через 38 минут
* хотя нет, ошибся, в "синем" исполнении оно и в самом деле может от 5V питаться.
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 178
Сегодня, 14:33  [ТС] 8
Цитата Сообщение от janis Посмотреть сообщение
Если интернет через симку работает, может взять какой-нибудь недорогой роутер с симкой и wifi. Возможностей-то больше.
Вариант конечно не плохой, но есть ряд минусов:
1. Цена этой системы увеличится (SIM800L 300р, а wifi роутеры 1500, может конечно дешевле есть, ну я не думаю, что меньше 1000 выйдет)
2. Нужна розетка (может конечно и есть роутеры, где она не нужна), а хотелось бы, чтобы была возможность сделать такую систему без розетки на каких-нибудь батарейках (в каких то частных случаях).
3. Громоздкость. Хочу всё это дело потом в корпус запихать (вообще по хорошему плату бы разработать со всеми нужными мне модулями на одном текстолите, изучил этот момент, кажется не так это невозможно. Вот и хочется сначала на arduino отладить, а потом уже на новый уровень выходить, а с wifi в этом смысла нет).

Добавлено через 3 минуты
Цитата Сообщение от Worldmaster Посмотреть сообщение
По идее вам частая смена прошивок не нужна. Достаточно разработать базовую систему команд. Включить полив, отключить и др.
Затем при соединении через интернет с основным сервером просто забирать список команд и хранить его в еепром.
ну либо через смс отправлять последовательность команд но в смс сильно ограничен размер сообщения.
Цитата Сообщение от Worldmaster Посмотреть сообщение
Логика даже еще проще получается.
допустим есть датчик дождя, и датчик света.
есть 5 линий с насосами.
Настроить таймер например на каждую минуту.
При срабатывании прерывания проверять разные программы:
тогда каждая программа будет иметь вид:
[№линии][Время ВКЛ][Время ВЫКЛ].
Также про прерыванию с датчика дождя выключаем все линии.
в еепром хранить блоки этих команд для 24 часового периода. Вот и все.
При таком подходе, смогу ли я потом какие либо команды добавлять? Который не предусмотрел заранее. Просто изначально я так и хотел сделать, но потом подумал:
- а что я буду делать, если вдруг, что-то захочу изменить? (тот же набор команд).

Добавлено через 16 минут
Понятно, что я часто менять не буду прошивку, когда будет работать уже всё стабильно. Но может быть такая ситуация, что нужно будет исправлять баги. Изначально можно не заметить какие-то ошибки, будет всё поливать как надо. За месяц работы я собирал бы информацию, и вносил бы изменения. Вдруг на этом моменте (когда собрал информацию), понял бы, что например сеть отваливается, в какой-то редкий случай (например когда приходят две команды с малым промежутком) или команда не выполняется, когда arduino например выполняет delay. Вообще всё, что угодно может произойти, и такие мелочи не предусмотреть заранее, только при эксплуатации. Не зря же делают бета тесты и так далее. Хотелось бы своего рода бета тест устроить в начале, да и потом может через год вылезет проблема (например батарейки сядут или свет отключится и потом не запустится как надо, когда питания снова появится), следовательно нужна возможность разослать обновление, а не бегать вносить изменения, да и дачи у моих родственников и знакомых не в одном населённом пункте все.

Добавлено через 7 минут
Цитата Сообщение от Worldmaster Посмотреть сообщение
Принимать через интернет можно например вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <SoftwareSerial.h>
// Пины подключения модуля SIM800L к Arduino
#define SIM800_TX_PIN 10
#define SIM800_RX_PIN 11
// Создание экземпляра SoftwareSerial для связи с модулем SIM800L
SoftwareSerial sim800(SIM800_TX_PIN, SIM800_RX_PIN);
// APN (Access Point Name) для вашего оператора связи
const char apn[] = "your_APN";
// URL файла для скачивания
const char fileURL[] = "http://example.com/file.txt";
void setup() {
  // Инициализация последовательного порта с модулем SIM800L
  sim800.begin(9600);
// Подключение к сети оператора
  connectToNetwork();
// Получение файла с сервера
  downloadFile();
}
void loop() {
  // Оставьте пустой цикл или добавьте необходимую логику
}
void connectToNetwork() {
  // Проверка готовности модуля SIM800L
  sim800.println("AT");
  delay(1000);
while (!sim800.find("OK")) {
    // Если модуль не готов, ждем 1 секунду и повторяем попытку
    sim800.println("AT");
    delay(1000);
  }
// Установка режима текстового режима для ответов модуля
  sim800.println("AT+CMGF=1");
  delay(1000);
// Установка APN для подключения к сети оператора
  sim800.print("AT+CSTT=\"");
  sim800.print(apn);
  sim800.println("\"");
  delay(1000);
// Активация GPRS
  sim800.println("AT+CIICR");
  delay(3000);
// Ожидание установки связи с сетью
  while (!sim800.find("OK")) {
    // Если связь не установлена, повторяем попытку через 1 секунду
    sim800.println("AT+CIICR");
    delay(1000);
  }
// Получение IP-адреса
  sim800.println("AT+CIFSR");
  delay(2000);
}
void downloadFile() {
  // Установка режима прозрачной передачи данных
  sim800.println("AT+CIPMODE=0");
  delay(1000);
// Установка многопользовательского режима
  sim800.println("AT+CIPMUX=0");
  delay(1000);
// Установка URL для скачивания файла
  sim800.print("AT+HTTPPARA=\"URL\",\"");
  sim800.print(fileURL);
  sim800.println("\"");
  delay(1000);
// Начало загрузки файла
  sim800.println("AT+HTTPACTION=0");
  delay(2000);
// Чтение ответа от модуля SIM800L
  String response = sim800.readString();
// Поиск кода ответа HTTP
  int httpCodeIndex = response.indexOf("+HTTPACTION: 0,");
  if (httpCodeIndex != -1) {
    int httpCode = response.substring(httpCodeIndex + 16).toInt();
// Проверка кода ответа HTTP (200 - OK)
    if (httpCode == 200) {
      // Получение размера файла
      int contentLengthIndex = response.indexOf("CONTENT-LENGTH:");
      if (contentLengthIndex != -1) {
        int contentLength = response.substring(contentLengthIndex + 16, response.indexOf("\r\n", contentLengthIndex)).toInt();
// Чтение содержимого файла
        sim800.println("AT+HTTPREAD=0," + String(contentLength));
        delay(2000);
// Вывод содержимого файла в монитор порта
        while (sim800.available()) {
          Serial.write(sim800.read());
        }
      }
    }
  }
// Завершение HTTP-соединения
  sim800.println("AT+HTTPTERM");
  delay(1000);
}
Примерно такой код и будет, но я хочу иметь возможность в любой момент поменять этот код. Мне сейчас нужно именно эту задачку решить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Сегодня, 14:33
Помогаю со студенческими работами здесь

Управляем реле с SIM800L и Arduino
Привет форумчане! Собрал вот такую схему Управляем реле с помощью SIM800L и Arduino...

Arduino SoftwareSerial и GSM SIM800L
Здравствуйте. Возможно кто-то мне поможет. Делаю проект на Ардуино уно. использую VOICE...

Arduino UNO + HC-06. RX
Подключаю модуль HC-06, питание HC-06 от отдельного источника 4.8В. ножки RX и TX модуля, в TX и RX...

Arduino uno
Нужна схема структурная Arduino Uno,перелопатил кучу сайтов,только принципиальные,может кто находил?

Работа с Arduino Uno
Здравствуйте. Я не так давно начал учиться программированию плат от Arduino. По совету приобрел я...

LCD vs Arduino UNO
Целый день просидел перебирая разные библиотеки в поисках LiquidCrystal_I2C.h Нашел библиотеку на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru