Сегодня я покажу Вам как это сделал я. Для начала вам нужен скетч! Вот мой:
#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)
AlexBrown
25.06.2019 08:19Для начала: кто такой «вне»?
ОК, некий «Вна» внял и поправил текст.
Пойдём далее: «Для начала вам нужен скетч!».
Гениальное наблюдение. Кто бы мог подумать, что Ардуино ещё требуется и программировать?
Господа, вам не кажется, что Песочница давно треснула и выползла на первую страницу Хабра?Troia Автор
25.06.2019 08:27:D а вдруг кто то подумает, что скетч не нужен?)) есть же теория вероятность которая гласит «возможно всё». Смирись с этим)
AlexBrown
25.06.2019 08:42Ценю здоровый юмор.
Вообще, хорошим тоном в этой тусовке является не только форматировать программный код (что у Вас уже получилось — жаль, что не везде, хотя прямо в хаброредактор встроен инструмент оформления «Исходный код»), но и скрывать его в разворачивающемся «кате».
Что не отменяет главного вопроса: «Зачем первая страница ленты подменяет песочницу?»Troia Автор
25.06.2019 08:45та я ж втыкнул исходный код, но c# там нету(или я слепой)
бро, я не знаю. я по приколу написал_)))
Печально, что люди добавляют в закладки, этим пользуются, а плюсик не ставят(AlexBrown
25.06.2019 09:011. никто «этим» не пользуется (по вполне очевидным причинам);
2. в закладки добавляют чтобы следить за комментариями — пользуясь твоим лексиконом, «чобы паугарать».
P.S. Блин, машинально сам сбился на давно уже позабытый «языкъ падонкафф». Что называется, «пальцы помнят», мать его…Troia Автор
25.06.2019 09:13та и зачем так хейтить то вообще?)) я смотрю ты сам пишешь такие офигенные программы и статьи))) Боже… упёрся в хейт и всё. если судить объективно, то статья норм так как всё расписано и приложены готовые куски рабочего кода.
igormich88
25.06.2019 09:32А ардуино то нужно? И модуль температуры/влажности, про который ничего не сказано.
Troia Автор
25.06.2019 09:41ну конечно)) я использую DHT11(модуль температуры и влажности)
Arduino UNO на COM3 портеigormich88
25.06.2019 09:50+1А пин для DHT11 вероятно четвёртый?
Troia Автор
25.06.2019 10:06+
igormich88
25.06.2019 10:20Тогда вопрос для кого эта статья — для новичка она слишком не подробная (нет списка компонентов, схемы сборки, ПО). А для опытного она просто не нужна, так как по факту выглядит как объединение 3-4 примеров кода.
avs24rus
25.06.2019 11:44Блин, прошу прощения, тянулся плюс нажать, а ткнул в минус :( Уже второй раз подобное приключается.
Старый стал — глаза не видят, руки трясутся!
И переголосовать нельзя, надеюсь модераторы исправят/
maverickcy
25.06.2019 08:42Жестко! Всё и сразу) Не дешевле Siemens Logo поставить?
AlexBrown
25.06.2019 08:49Да нормально, на Atmel вполне делаются контроллеры (даже если начать с Arduino).
Проблема в другом (тот самый «порог вхождения», да):
заполучив «настоящий микроконтроллер», прыщавые подростки вместо того, чтобы готовиться к ЕГЭ, начинают управлять лифтами.Troia Автор
25.06.2019 08:52ну возможно, но типа можно и без образования работать как нибудь фрилансером. Так, что успокойся. Пусть лучше робототехникой занимаются, чем употребляют наркотики и бухают за гаражами
AlexBrown
25.06.2019 08:58Лишь бы не лезли в промавтоматику.
То есть, предположение меня не обмануло: это не твой код.
Тогда вдвойне непонятен смысл пренебрегать Песочницей. Рейтинг? Так ведь он после подобной выходки вылезет с жирным минусом.Troia Автор
25.06.2019 09:02это мой код
AlexBrown
25.06.2019 09:23Тогда — успехов.
(Если не ошибаюсь, в данном разделе не считается криминалом рекомендация другого полезного ресурса).
При случае загляните на Easyelectronics (создатель, владелец ресурса и автор замечательного курса «AVR для начинающих», кстати, на Хабре тоже присутствует).
maverickcy
25.06.2019 09:02Ну, программирование никак не мешает употреблять наркотики, а иногда они друг друга еще дополняют)
Ig_B
25.06.2019 08:47Как меня бесят отдельные функции измерения температуры и влажности для DHT11!
AlexBrown
25.06.2019 08:56Не обязательно пользоваться «стандартными» библиотеками.
Сделайте шаг вперёд (заметьте: это будет шаг из детского сада в школу): напишите свою процедуру опроса DHT11. В ответе он всегда передаёт полный комплект параметров.
Это будет лишь первый шажочек. Постепенно Вы заметите, что Вам становится проще писать в AVRStudio и шить через программатор.Troia Автор
25.06.2019 09:02зачем изобретать велосипед? не люблю такое, сейчас сделаю «велосипед» и начнут писать «зачем создавать своё, кгда етсь норм библиотеки», не сделал его и пишут «напиши своё»… Боже
AlexBrown
25.06.2019 09:191. Беда в том, что «стандартные библиотеки» среды Arduino по большей части состоят из монструозного, крайне неэффективного кода.
2. (следствие из п.1) Что именно происходит в аруинобиблиотеке предсказать (а порой даже понять) почти невозможно.
3. Непосредственное программирование (тем более, таких примитивных устройств и задач) не только доставляет удовольствие, но и позволяет ручаться за результат.Troia Автор
25.06.2019 09:23Боже, иди делай, что хочешь… Мне и стандарта хватает с головой.
AlexBrown
25.06.2019 09:27То есть, вежливое предложение помощи получает в ответ хамство и «пошёл ты на …»? Мило…
И это хамло представляет нам киевлян?
Вдвойне мило. Что называется, харихматичненько.Troia Автор
25.06.2019 09:32Просто ты без объективной причины прицепился к стандартной библиотеке в простейшем решении. С первого раза ты не понял, что и стандартная норм) Пришлось завуалировано нагрубить. если обидел, прошу прощения)
AlexBrown
25.06.2019 09:38Я прицепился?
То есть, не:
Ig_B сегодня в 08:47
Как меня бесят отдельные функции измерения температуры и влажности для DHT11!
а «я прицепился»?
Иди, «кодь» дальше, неблагодарный и безграмотный сопляк. Только к лифтам не лезь — искренне умоляю. Извинений даже не жду, ибо очевидно, что это бесполезно.
AntonSazonov
25.06.2019 13:46Смотрел я в эту библиотеку. Ничего монструозного и крайне неэффективного там не заметил.
"Зачем вам знать как устроены часы? Просто иногда поглядывайте на время."
AlexBrown
25.06.2019 14:441. Конкретно в этой — ничего. Многие другие просто неработоспособны (причём, новичок ошибку, скорее всего, никогда не найдёт). Изучать чужие библиотеки полезно, но зацикливаться на их использовании — большая ошибка.
2. Можно поглядывать и на стоящие часы, пару раз в сутки их показания окажутся даже верны.AntonSazonov
25.06.2019 15:08Достаточно один раз взглянуть в недры библиотеки для того чтобы понять, подходит она вам или нет. Не вижу тут проблемы.
(следствие из п.1) Понять что там происходит легко. После этого, если вы не увидели там конкретную дичь, пользуйтесь этой библиотекой и забудьте как она устроена.
AntonSazonov
25.06.2019 16:00"2. Можно поглядывать и на стоящие часы..."
Можно. Просто смысл того что я хотел вам донести был совсем в другом.
Ig_B
26.06.2019 11:40DHT-11 в ответ на запрос выдает сразу и температуру и влажность. Невозможно отдельно запросить или температуру или влажность.
GennPen
25.06.2019 08:54На сколько понял, то автор предлагает управлять ардуиной с помощью компьютера, который должен быть постоянно включен с HTTP(+PHP) сервером, смотреть открытым портом в интернет, да еще и дополнительная программа должна быть запущена.
Почему общение с портом не возложить на сервер?
Что если компьютер не имеет прямого подключения в интернет? (например через NAT)
Что если совсем компьютера нет?Troia Автор
25.06.2019 08:55а если ардуино не имеет подключение в инет? подумал об этом?)) это просто так накидан кусок кода. не обязательно кстати иметь сервак у себя на компе
GennPen
25.06.2019 09:02а если ардуино не имеет подключение в инет?
Цена вопроса 100-150р
Заголовок спойлераTroia Автор
25.06.2019 09:04и 1-2 месяца подождать пока с Китая пришлют
GennPen
25.06.2019 09:08Не знаю из какого Китая вы заказываете, но в середину России (Урал) обычно стабильно 3 недели идет. Да и вы когда ардуину заказывали — тоже ждали же.
Troia Автор
25.06.2019 09:11Как то 1 раз заказал подставку под ноутбук. Прождал больше 2 месяцев, уже хотел писать заявку на возврат денег))) дождался, забрал, земля ей пухом
FDA847
25.06.2019 09:16Удобнейшая штука! У ENC28J60 есть пара известных багов, но они обходятся в три строчки. У нас несколько сотен устройств на них постоянно в онлайне работают уже давно.
Troia Автор
25.06.2019 09:18та я себе вчера заказал WiFi модуль, а то по COM3 порту работать то такое. То что в статье, это временное решение. Всё же это лучше, чем ничего
Заказывал не из Китая, 1 раз заказал, хватило))
arduino.ua/prod1492-wi-fi-modyl-nodemcu-esp8266
вот этот взялFDA847
25.06.2019 09:21С WiFi на базе ESP8266 я лично мало работал. В основном все приборы на ENC'шках делаем. Для нас штука проверенная годами, работает отлично, поэтому мой комментарий относился просто к констатации данного факта :-)
Troia Автор
25.06.2019 10:49Я себе заказал уже, жду)
вот этот
https://arduino.ua/prod1492-wi-fi-modyl-nodemcu-esp8266
avs24rus
25.06.2019 12:02Ну не знаю, если это краткое руководство для начинающего, то что значит фраза
Теперь нужен сервер(это логично). Подключаем FTP, едем в корень и создаем файл dannie.php
О каком сервере идет речь? Apache? IIS? Или что то еще? Зачем сюда вообще приплетать компьютер, когда все на таком примитивном уровне? Arduino или ESP — сами могут выступать в роли веб сервера, с гораздо более продвинутым интерфейсом.
На мой взгляд, ценность данной статьи = 0
AntonSazonov
25.06.2019 13:05А как это вы так ловко читаете 10-й пин, когда он у вас в режиме OUTPUT?
simbiod
26.06.2019 15:41Наверное всё же следует сделать для себя какие-то выводы и скрыть эту статью в черновики…
Giperoglif
много опечаток, код то оформлен то нет. что-то как-то прям кровь из глаз.
Troia Автор
сорри(