Наверное многие новички в arduino задавались вопросом «а как сделать управление через интернет».

Сегодня я покажу Вам как это сделал я. Для начала вам нужен скетч! Вот мой:

#include <stDHT.h>
DHT sens (DHT11);


void setup() {
  // put your setup code here, to run once:
  Serial.begin(57600);
  pinMode(10, OUTPUT); //Светодиод
}

void loop() {
  // put your main code here, to run repeatedly:
  int t = sens.readTemperature(4); //Считываем температуру с датчика
  int h = sens.readHumidity(4);//Считываем влажность с датчика
  int dig = digitalRead(10); // Включен или выключен светодиод(0 выкл, 1 вкл)
  if(Serial.available()){ // Делаем проверку на написание команды

    int val = Serial.parseInt(); //что написали
    if(val == 8){ //если на COM3 порт написали 8 то врубаем или вырубаем светодиод
      int dig = digitalRead(10);
      if(dig == 0){
        digitalWrite(10, HIGH);
      } else {
        digitalWrite(10, LOW);
      }
    }
    if(val == 9){ // включен или выключен светодиод
      Serial.println(dig);
    }
    if(val == 2){//выводим температуру
      Serial.println(t);
    }
    if(val == 3){//выводим влажность
      Serial.println(h);
    }
  }
}

Теперь нужен сервер(это логично). Подключаем FTP, едем в корень и создаем файл dannie.php

Мы делаем простенькую систему управления домом! Делаем для себя, без дизайна и т.д.
Сейчас мы пропишем серверную часть, наш сервер будет ловить GET запросы(температура, влажность и состояние светодиода) и запихивать в файл в виде «t:h:s»(это синхронизация)

$t = $_GET['t']; 
$h = $_GET['h'];
$s = $_GET['s'];

file_put_contents("dannie.hs", $t . ":" . $h . ":" . "$s");

Теперь нужна страница где будет информация и отправка команд. Делаем файл index.php. Вот код который у меня:

$file = file_get_contents("dannie.hs"); //Читаем данные
$dannie = explode(":", $file); // Разбиваем на массив

if($_GET['comand'] != ""){ //записываем команду в файл
	file_put_contents("comands.hs", "8");

сразу под ник строчим ?> и вот такой html-код:

<html>
<body>
<form action="" method="GET">
<p>Температура - <?php echo $dannie[0] ?></p>
<p>Влажность - <?php echo $dannie[1] ?></p>
<p>Светодио - <?php echo $dannie[2] ?></p>
<input type="hidden" name="comand" value="8">
<button>Светодио</button>
</form>
</body>
</html>

Так, у нас есть главная страница, теперь нужен файл который будет выдавать нашей программе информацию по командам. Делаем файл comands.php и впихиваем туда такой код:

$comands = file_get_contents("comands.hs");
if($comands != ""){
	echo $comands;
	file_put_contents("comands.hs", "");
}
?>

Наша программа будет подключаться к файлу каждую секунду и вычитывать информацию. Что бы не отправлять лишние запросы на ардуино, мы будем очищать сразу же файл. Всё элементарно и легко!

Теперь переходим к нашей программу. Создаем Windows Forms проект на c#, делаем форму из 3 label(температура, влажность и светодиод) и 1 кнопки(включить или выключить светодиод)

Переходим в код и сразу же добавляем 3 библиотеки:

using System.IO.Ports;
using System.Threading;
using System.Net;

Далее под:

public partial class Form1 : Form

Указываем объект SerialPort:

public partial class Form1 : Form
    {
        SerialPort myport;

Теперь нужно создать функцию init и вызвать её при включении программы:

public Form1()
        {
            InitializeComponent();
            init(); // вызываем наш метод
        }

        void init()
        {
            myport = new SerialPort(); //Указываем SerialPort
            myport.BaudRate = 57600; //Указываем наш БОД прописанный в скетче(в нашем случае //57600)
            myport.PortName = "COM3"; //порт который вы используете(у нас COM3)
            myport.Open(); //открываем порт
        }

Теперь создаем событие клик для кнопки:

private void Button1_Click(object sender, EventArgs e)
        {
            myport.WriteLine("8"); //посылаем на наш порт цифру 8(в скетче на эту цифру 
//включение светодиода
        }

Создаем 2 таймера, интервал 1000. Сразу ставим enabled = true

Первый таймер будет синхронизировать данные из нашим сервером, а второй принимать команды. Создаём 3 переменные(не внутри какого то объекта, снаружи) и создаём функцию server:

string t, h, s;

        private void server()
        {
            WebClient wc = new WebClient();
            wc.DownloadString("ссылка на файл dannie.php?t=" + t + "&h=" + h + "&s=" + s);
        }

В первый таймер пишем такой код:

private void Timer1_Tick(object sender, EventArgs e)
        {
            try
            {
                myport.WriteLine("2");
                t = myport.ReadLine();
                myport.WriteLine("3");
                h = myport.ReadLine();
                myport.WriteLine("9");
                s = myport.ReadLine();
                label1.Text = "Температура: " + t.Trim();
                label2.Text = "Влажность: " + h.Trim();
                label3.Text = "Светодиод: " + s.Trim();
                Thread th = new Thread(server);
                th.Start();
            }
            catch(Exception ee)
            {
                timer1.Enabled = false;
                timer2.Enabled = false;
            }
        }

Переходим к второму таймеру. Как упоминалось выше, второй таймер будет принимать команды! Сначала нужно создать функцию comand.

Код будет таким:

private void comand()
        {
            WebClient wc = new WebClient();
            string com = wc.DownloadString("ссылка на comands.php");
            if (com.Trim() != "")
            {
                myport.WriteLine(com.Trim());
            }
        }

Теперь прописываем в таймере:

private void Timer2_Tick(object sender, EventArgs e)
        {
            WebClient wc = new WebClient();
            string com = wc.DownloadString("ссылка на comands.php");
            if(com.Trim() != "")
            {
                myport.WriteLine(com.Trim());
            }
        }

Всё! Наша система управления готова, теперь вы можете удалённо включать и выключать светодиод и узнать температуру, и влажность в вашей комнате или доме. Данная версия только для новичков, что бы ознакомиться с работой. Сюда можно придумать много чего, для начала переписать код и сделать защиту!

Всем спасибо за уделенное время.

Кому, что не понятно обращайтесь в телеграмм — @Cp_Troia

Комментарии (60)


  1. Giperoglif
    25.06.2019 05:50

    много опечаток, код то оформлен то нет. что-то как-то прям кровь из глаз.


    1. Troia Автор
      25.06.2019 08:56

      сорри(


  1. AlexBrown
    25.06.2019 08:19

    Для начала: кто такой «вне»?

    ОК, некий «Вна» внял и поправил текст.
    Пойдём далее: «Для начала вам нужен скетч!».

    Гениальное наблюдение. Кто бы мог подумать, что Ардуино ещё требуется и программировать?

    Господа, вам не кажется, что Песочница давно треснула и выползла на первую страницу Хабра?


    1. Troia Автор
      25.06.2019 08:27

      :D а вдруг кто то подумает, что скетч не нужен?)) есть же теория вероятность которая гласит «возможно всё». Смирись с этим)


      1. AlexBrown
        25.06.2019 08:42

        Ценю здоровый юмор.

        Вообще, хорошим тоном в этой тусовке является не только форматировать программный код (что у Вас уже получилось — жаль, что не везде, хотя прямо в хаброредактор встроен инструмент оформления «Исходный код»), но и скрывать его в разворачивающемся «кате».

        Что не отменяет главного вопроса: «Зачем первая страница ленты подменяет песочницу?»


        1. Troia Автор
          25.06.2019 08:45

          та я ж втыкнул исходный код, но c# там нету(или я слепой)

          бро, я не знаю. я по приколу написал_)))

          Печально, что люди добавляют в закладки, этим пользуются, а плюсик не ставят(


          1. AlexBrown
            25.06.2019 08:46

            Пример:

            using System.IO.Ports;
            using System.Threading;
            using System.Net;


            Конец примера.


            1. Troia Автор
              25.06.2019 08:50

              оо и вправду)) спс


          1. AlexBrown
            25.06.2019 09:01

            1. никто «этим» не пользуется (по вполне очевидным причинам);

            2. в закладки добавляют чтобы следить за комментариями — пользуясь твоим лексиконом, «чобы паугарать».

            P.S. Блин, машинально сам сбился на давно уже позабытый «языкъ падонкафф». Что называется, «пальцы помнят», мать его…


            1. Troia Автор
              25.06.2019 09:05

              :D
              та успокойся ты, когда нужно я пишу нормально)))


            1. Troia Автор
              25.06.2019 09:13

              та и зачем так хейтить то вообще?)) я смотрю ты сам пишешь такие офигенные программы и статьи))) Боже… упёрся в хейт и всё. если судить объективно, то статья норм так как всё расписано и приложены готовые куски рабочего кода.


      1. igormich88
        25.06.2019 09:32

        А ардуино то нужно? И модуль температуры/влажности, про который ничего не сказано.


        1. Troia Автор
          25.06.2019 09:41

          ну конечно)) я использую DHT11(модуль температуры и влажности)
          Arduino UNO на COM3 порте


          1. igormich88
            25.06.2019 09:50
            +1

            А пин для DHT11 вероятно четвёртый?


            1. Troia Автор
              25.06.2019 10:06

              +


              1. igormich88
                25.06.2019 10:20

                Тогда вопрос для кого эта статья — для новичка она слишком не подробная (нет списка компонентов, схемы сборки, ПО). А для опытного она просто не нужна, так как по факту выглядит как объединение 3-4 примеров кода.


                1. avs24rus
                  25.06.2019 11:44

                  Блин, прошу прощения, тянулся плюс нажать, а ткнул в минус :( Уже второй раз подобное приключается.
                  Старый стал — глаза не видят, руки трясутся!
                  И переголосовать нельзя, надеюсь модераторы исправят/


          1. avs24rus
            25.06.2019 11:18

            Да лучше пальцем влажность измерять, чем DHT11, точнее будет.


            1. Troia Автор
              25.06.2019 11:53

              Возможно)) но вроде бы говорят у него погрешность +-2


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


  1. maverickcy
    25.06.2019 08:42

    Жестко! Всё и сразу) Не дешевле Siemens Logo поставить?


    1. Troia Автор
      25.06.2019 08:45

      не знаю. я занимаюсь для себя


    1. AlexBrown
      25.06.2019 08:49

      Да нормально, на Atmel вполне делаются контроллеры (даже если начать с Arduino).

      Проблема в другом (тот самый «порог вхождения», да):
      заполучив «настоящий микроконтроллер», прыщавые подростки вместо того, чтобы готовиться к ЕГЭ, начинают управлять лифтами.


      1. Troia Автор
        25.06.2019 08:52

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


        1. AlexBrown
          25.06.2019 08:58

          Лишь бы не лезли в промавтоматику.

          То есть, предположение меня не обмануло: это не твой код.

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


          1. Troia Автор
            25.06.2019 09:02

            это мой код


            1. AlexBrown
              25.06.2019 09:23

              Тогда — успехов.

              (Если не ошибаюсь, в данном разделе не считается криминалом рекомендация другого полезного ресурса).

              При случае загляните на Easyelectronics (создатель, владелец ресурса и автор замечательного курса «AVR для начинающих», кстати, на Хабре тоже присутствует).


        1. maverickcy
          25.06.2019 09:02

          Ну, программирование никак не мешает употреблять наркотики, а иногда они друг друга еще дополняют)


          1. Troia Автор
            25.06.2019 09:10

            :D


  1. Ig_B
    25.06.2019 08:47

    Как меня бесят отдельные функции измерения температуры и влажности для DHT11!


    1. Troia Автор
      25.06.2019 08:51

      :D
      так удобнее же))) моё мнение, сорри если обидел своим кодом


    1. AlexBrown
      25.06.2019 08:56

      Не обязательно пользоваться «стандартными» библиотеками.

      Сделайте шаг вперёд (заметьте: это будет шаг из детского сада в школу): напишите свою процедуру опроса DHT11. В ответе он всегда передаёт полный комплект параметров.

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


      1. Troia Автор
        25.06.2019 09:02

        зачем изобретать велосипед? не люблю такое, сейчас сделаю «велосипед» и начнут писать «зачем создавать своё, кгда етсь норм библиотеки», не сделал его и пишут «напиши своё»… Боже


        1. AlexBrown
          25.06.2019 09:19

          1. Беда в том, что «стандартные библиотеки» среды Arduino по большей части состоят из монструозного, крайне неэффективного кода.

          2. (следствие из п.1) Что именно происходит в аруинобиблиотеке предсказать (а порой даже понять) почти невозможно.

          3. Непосредственное программирование (тем более, таких примитивных устройств и задач) не только доставляет удовольствие, но и позволяет ручаться за результат.


          1. Troia Автор
            25.06.2019 09:23

            Боже, иди делай, что хочешь… Мне и стандарта хватает с головой.


            1. AlexBrown
              25.06.2019 09:27

              То есть, вежливое предложение помощи получает в ответ хамство и «пошёл ты на …»? Мило…

              И это хамло представляет нам киевлян?
              Вдвойне мило. Что называется, харихматичненько.


              1. Troia Автор
                25.06.2019 09:32

                Просто ты без объективной причины прицепился к стандартной библиотеке в простейшем решении. С первого раза ты не понял, что и стандартная норм) Пришлось завуалировано нагрубить. если обидел, прошу прощения)


                1. AlexBrown
                  25.06.2019 09:38

                  Я прицепился?
                  То есть, не:

                  Ig_B сегодня в 08:47
                  Как меня бесят отдельные функции измерения температуры и влажности для DHT11!

                  а «я прицепился»?

                  Иди, «кодь» дальше, неблагодарный и безграмотный сопляк. Только к лифтам не лезь — искренне умоляю. Извинений даже не жду, ибо очевидно, что это бесполезно.


                  1. Troia Автор
                    25.06.2019 09:42

                    Что? ой всё, я сдаюсь


          1. AntonSazonov
            25.06.2019 13:46

            1. Смотрел я в эту библиотеку. Ничего монструозного и крайне неэффективного там не заметил.


            2. "Зачем вам знать как устроены часы? Просто иногда поглядывайте на время."



            1. AlexBrown
              25.06.2019 14:44

              1. Конкретно в этой — ничего. Многие другие просто неработоспособны (причём, новичок ошибку, скорее всего, никогда не найдёт). Изучать чужие библиотеки полезно, но зацикливаться на их использовании — большая ошибка.

              2. Можно поглядывать и на стоящие часы, пару раз в сутки их показания окажутся даже верны.


              1. AntonSazonov
                25.06.2019 15:08

                1. Достаточно один раз взглянуть в недры библиотеки для того чтобы понять, подходит она вам или нет. Не вижу тут проблемы.


                2. (следствие из п.1) Понять что там происходит легко. После этого, если вы не увидели там конкретную дичь, пользуйтесь этой библиотекой и забудьте как она устроена.



              1. AntonSazonov
                25.06.2019 16:00

                "2. Можно поглядывать и на стоящие часы..."
                Можно. Просто смысл того что я хотел вам донести был совсем в другом.


            1. Ig_B
              26.06.2019 11:40

              DHT-11 в ответ на запрос выдает сразу и температуру и влажность. Невозможно отдельно запросить или температуру или влажность.


  1. GennPen
    25.06.2019 08:54

    На сколько понял, то автор предлагает управлять ардуиной с помощью компьютера, который должен быть постоянно включен с HTTP(+PHP) сервером, смотреть открытым портом в интернет, да еще и дополнительная программа должна быть запущена.
    Почему общение с портом не возложить на сервер?
    Что если компьютер не имеет прямого подключения в интернет? (например через NAT)
    Что если совсем компьютера нет?


    1. Troia Автор
      25.06.2019 08:55

      а если ардуино не имеет подключение в инет? подумал об этом?)) это просто так накидан кусок кода. не обязательно кстати иметь сервак у себя на компе


      1. GennPen
        25.06.2019 09:02

        а если ардуино не имеет подключение в инет?

        Цена вопроса 100-150р
        Заголовок спойлера
        image


        1. Troia Автор
          25.06.2019 09:04

          и 1-2 месяца подождать пока с Китая пришлют


          1. GennPen
            25.06.2019 09:08

            Не знаю из какого Китая вы заказываете, но в середину России (Урал) обычно стабильно 3 недели идет. Да и вы когда ардуину заказывали — тоже ждали же.


            1. Troia Автор
              25.06.2019 09:10

              я из Украины. Заказывал с Киева))) можно на ты


              1. GennPen
                25.06.2019 09:23

                Ну, извини, не знаю как в Украину ходят посылки из Китая.
                Познакомься с модулем ESP, например так называемый NodeMCU. Цена 100-150р., а возможностей поболее, самое главное — поддержка WiFi.


                1. AlexBrown
                  25.06.2019 09:29

                  Не сыпьте бисер, оно как раз из басни Крылова.


            1. Troia Автор
              25.06.2019 09:11

              Как то 1 раз заказал подставку под ноутбук. Прождал больше 2 месяцев, уже хотел писать заявку на возврат денег))) дождался, забрал, земля ей пухом


        1. FDA847
          25.06.2019 09:16

          Удобнейшая штука! У ENC28J60 есть пара известных багов, но они обходятся в три строчки. У нас несколько сотен устройств на них постоянно в онлайне работают уже давно.


          1. Troia Автор
            25.06.2019 09:18

            та я себе вчера заказал WiFi модуль, а то по COM3 порту работать то такое. То что в статье, это временное решение. Всё же это лучше, чем ничего
            Заказывал не из Китая, 1 раз заказал, хватило))
            arduino.ua/prod1492-wi-fi-modyl-nodemcu-esp8266
            вот этот взял


            1. FDA847
              25.06.2019 09:21

              С WiFi на базе ESP8266 я лично мало работал. В основном все приборы на ENC'шках делаем. Для нас штука проверенная годами, работает отлично, поэтому мой комментарий относился просто к констатации данного факта :-)


              1. Troia Автор
                25.06.2019 09:23

                понял, принял. ну я потестю Wi-Fi отпишу)


  1. Troia Автор
    25.06.2019 10:49

    Я себе заказал уже, жду)
    вот этот
    https://arduino.ua/prod1492-wi-fi-modyl-nodemcu-esp8266


  1. avs24rus
    25.06.2019 12:02

    Ну не знаю, если это краткое руководство для начинающего, то что значит фраза

    Теперь нужен сервер(это логично). Подключаем FTP, едем в корень и создаем файл dannie.php
    О каком сервере идет речь? Apache? IIS? Или что то еще? Зачем сюда вообще приплетать компьютер, когда все на таком примитивном уровне? Arduino или ESP — сами могут выступать в роли веб сервера, с гораздо более продвинутым интерфейсом.
    На мой взгляд, ценность данной статьи = 0


  1. AntonSazonov
    25.06.2019 13:05

    А как это вы так ловко читаете 10-й пин, когда он у вас в режиме OUTPUT?


  1. simbiod
    26.06.2019 15:41

    Наверное всё же следует сделать для себя какие-то выводы и скрыть эту статью в черновики…