управление ардуиной из интернета-помогите

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Добрый день.

Пришло время изучить и это направление.

Очень хочется реализовать следующее(для примера).

Отображение температуры с датчика d18b20 (в com порт кидаем без проблем) на веб странице домашнего сервера.

Запись температуры и времени в базу SQL (на домашнем сервере)

Управлением одним реле через веб страницу.

У меня конкретные трудности с WEB страницами.Есть шильд Ethernet Шилд W5100 . В нем SD у меня не получается одновремменно с сетью работать и с SD картой (кинтье если есть готовый пример).Идея в следующем (если есть пример то же ссылку) на карте держать index.htm и его выкидывать.

Но что то не срастаеться :)

Так же не могу понять как температуру пихать в SQL базу.Сам принцип. Температуру в WEB я добился что бы показвало -дальше то что ?

СПАСИБО ЗА ПОМОЩЬ.

P.s. буду рад если кто подбросит исходники для андройда (отображение температуры и управлением реле)

 

valeraba
Offline
Зарегистрирован: 08.09.2014

Может вам сгодится?
Правда, базы SQL там нет.
http://samde.ru/ru/index.html

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Не совсем понятно, в каком режиме вы хотите запускать ардуино.

Если как сервер (с использованием флешки) - про БД точно можете забыть.

Если как клиент - вам нужен развернутый веб-сервер, с которым ардуино будет общаться посредством http-запросов.

Gagarin74
Offline
Зарегистрирован: 24.08.2013

а что мешает совместить ?

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Многое мешает. Но теоретически - можно. Наверное.

А зачем?

nevkon
Offline
Зарегистрирован: 20.01.2015

Совместить можно, но снаружи придется обращаться по разным портам - иначе на роутере/файерволле не пропишешь правила переадресации.

nevkon
Offline
Зарегистрирован: 20.01.2015

Совместить можно, но снаружи придется обращаться по разным портам - иначе на роутере/файерволле не пропишешь правила переадресации.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

nevkon пишет:

Совместить можно, но снаружи придется обращаться по разным портам - иначе на роутере/файерволле не пропишешь правила переадресации.

А вы осознаете, что речь идет об Ардуино?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

ага

nevkon
Offline
Зарегистрирован: 20.01.2015

И на Ардуино можно поднять TCP протокол. Ну если автору хочется поизвращаться. :)

Главное чтобы памяти и быстродействия хватило.

Но вообще никто не запрещает по UDP обращаться из Интернета.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

nevkon пишет:

И на Ардуино можно поднять TCP протокол. Ну если автору хочется поизвращаться. :)

Главное чтобы памяти и быстродействия хватило.

Но вообще никто не запрещает по UDP обращаться из Интернета.

Я не у ТС спросил, а у вас.

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Хорошо давайте упростим задачу.

вот код который выкидывает на веб темературу.

помогите написать "соеденение " с SQL . SQL установлен на серваке и имеет белый IP. Что бы эта температура записывалась в базенку.

#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <SPI.h>
#include <Ethernet.h>

 #define ONE_WIRE_BUS 8
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometere = { 
  0x28, 0xC3, 0xC7, 0x3B, 0x05, 0x00, 0x00, 0x42 };  

long Temperature = 0, Pressure = 0, Altitude = 0;

byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xF1 };
byte ip[] = { 172, 16, 2, 126 };    
EthernetServer server(80);

int Relay = 5;
int Relay1 = 7;
float tempC1;

  char incomingByte; 
int t=2; // скорость обмена
 int x=0; 
 int d=0; 
 

void setup()   {

  pinMode(Relay, OUTPUT); 
   pinMode(Relay1, OUTPUT); 
  sensors.begin();
  sensors.setResolution(Thermometere, 10);
Wire.begin();
Serial.println("start");
  Ethernet.begin(mac, ip);
  // запуск сервера
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  Serial.begin(9600);
}

void printTemperature(DeviceAddress deviceAddress) {
  float tempC = sensors.getTempC(deviceAddress);
 // Serial.println(tempC,1);
}

void loop(){
sensors.requestTemperatures();
float tempC1=sensors.getTempC(Thermometere);
char bytes;
Serial.print("TEMPERATURE  ");
Serial.println(tempC1); 

delay(60);
 if (tempC1 >30) {
             
           digitalWrite(Relay, LOW);
           digitalWrite(Relay1, LOW);
          }
           if (tempC1 <30) {
             
           digitalWrite(Relay, HIGH);
           digitalWrite(Relay1, HIGH);
          
           }
           
EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
         
          client.println("Connection: close");  // the connection will be closed after completion of the response
	  client.print("Refresh: ");  // refresh the page automatically every 5 sec
          client.println(t);
          
          //client.println("Refresh: 10");
          client.println();
          client.println("<!DOCTYPE HTML>");
           client.println("<meta http-equiv=content-type content=text/html; charset=utf-8 />");
          client.println("<html>");
           client.println("<meta http-equiv=content-type content=text/html; charset=utf-8 />");
          // output the value of each analog input pin
         // for (int analogChannel = 7; analogChannel < 8; analogChannel++) {
         //   int sensorReading = analogRead(analogChannel);
           
           
           
           if (tempC1 >30) {
             
           digitalWrite(Relay, LOW);
         
           client.print("Rele OFF  ");
              }
           if (tempC1 <30) {
             
           digitalWrite(Relay, HIGH);
           client.print("Rele ON  ");
           }
           
           
            client.print("Temperature  ");
            client.print(tempC1);
            client.print(" C");
            client.println(t);
            client.print(" speed");
            
            client.print("<img src= http://www.nearbus.net/images/graphical_dashboard/graphic_dash_0a.png>");
            
     client.print  (" <div id=marquee1 style=position:absolute; overflow:hidden; left:1px; top:4px; width:150px; height:43px; z-index:0>");
client.print("<marquee width=150 height=43>");
client.print("<div class=wpmd>");
client.print("<div>сегодня</div>");
client.print("</div></marquee>");
client.print("</div>");
            
           // client.print(sensorReading);
            client.println("<br />");       
          //}
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
  }

 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Gagarin74, на сервере должен работать скрипт, который умеет принимать параметры и умеет эти параметры писать в базу данных.

Ардуино, в режиме клиента должен обратиться к этому скрипту и передать ему данные, для записи в БД, в http-запросе.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Исследовал вопрос работы sd совместно с эзпрнетом на этом шилде. Все работает влет. НО ПЕРЕД ИНИЦИАЛИЗАЦИЕЙ ЭЗЕРНЕТА НЕОБХОДИМО 4 НОГУ ПОДНЯТЬ В HIGH,  видимо проблема в том, что по умолчанию на этой ножке ноль, который активирует sd карту, поскольку это ножка чипселекта sd. Далее авсе работает без проблем :-)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Я бы сказал , что на бунту-сервере с LAMP по крону запускается скрипт на пхп, который обращается к ардуине, работающей в режиме сервера. Скрипт получает пакет , парсит его и складывает в мискл. На бунту-сервере работает апач, который выдает страницы , слепленыеиз дизайна и мискла. Управляющие воздействия складываются в отдельную таблицу мискла. Их подбирает скрипт , формируя запрос следующего пакета от арду-серва.

Gagarin74
Offline
Зарегистрирован: 24.08.2013

за теорию спасибо. теперь по существу

1 из выше так и не понятно ардуино работать должна как сервер или клиент?

2 меня как раз и интересует PHP скрипт

3 можно код для ардуинки где работает и карта и сеть.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Пожалуйста

сервер

стоит времени

стоит времени

время- деньги

 

Gagarin74
Offline
Зарегистрирован: 24.08.2013

inspiritus,странно вообще то, ну да ладно пусть Вам тоже все помогают за деньги.

P.s. и зря Вы за всех отвечаете :(

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Gagarin74 пишет:

за теорию спасибо. теперь по существу

1 из выше так и не понятно ардуино работать должна как сервер или клиент?

2 меня как раз и интересует PHP скрипт

3 можно код для ардуинки где работает и карта и сеть.

Из того, что написано выше мне тоже ничего не понятно, но если у вас уже есть сервер, зачем вам еще сервер на ардуино? Да и сама технология "сервер-сервер" мне не известна.

Скрипты, сохраняющие в файл на сервере, я выкладывал, но с БД я еще не работал - ничем не помогу. Хотя подозреваю, что и эти скрипты тоже будут простыми.

Gagarin74
Offline
Зарегистрирован: 24.08.2013

в том то всё и дело -что по отдельности в теориии найти куски можно. Хотел собрать для себя в единый кусок и разобраться что к чему, и за что кто отвечает. Уровень подготовки у всех разный.Я вот, туплю полностью по нектрым темам.

В конечном итоге хотелось что бы температура с ардуины попадала в базу SQL. Как это будет называться мне по барабану ,хоть сервер-сервер,хоть клиент клиент.Сейчас вообще ни чего нет :)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Назначение базы данных?

Просто запись в текстовый файл с меткой времени - никак?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

ни как. через SQL проще будет сортировать(удалять итд итп)

valeraba
Offline
Зарегистрирован: 08.09.2014

Gagarin74 пишет:

за теорию спасибо. теперь по существу

1 из выше так и не понятно ардуино работать должна как сервер или клиент?

2 меня как раз и интересует PHP скрипт

3 можно код для ардуинки где работает и карта и сеть.

Ардуинка как клиент.
Сервер с БД на большой машине.

Ардуино каждый раз по определённому URL будет отправлять на сервер свои данные, а в ответ будет получать различные команды для реле и т.д.  Если данные в бинарном ввиде то используйте POST запрос.
 

Gagarin74
Offline
Зарегистрирован: 24.08.2013

вот теперь если бы теорию реализовать в коде,то будет очень продуктивно.

Gagarin74
Offline
Зарегистрирован: 24.08.2013

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

inspiritus
Offline
Зарегистрирован: 17.12.2012

Я же написал арда-сервер, комп является по отношению к ней клиентом, сервер- тот, кто слушает. По оотношению к скрипту - серверы и арда и мискл. Слушают оба, а клиент-скрипт зпускается по крону и шлет запросы- пересылает ответы. По отношению к апачу слушает мискл. По отношению к инету слушает апач.

сервер это не ящик это функционал

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Gagarin74 пишет:

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

Я же описал вам алгоритм еще в самом начале.

Загвоздка в самом скрипте (поддержка SQL - это ваше требование - вам и решать задачу).

Когда у вас будет сервер с нужным скриптом (ссылку на примеры скриптов я вам тоже дал) - просто обращайтесь к этому скрипту с необходимым параметром в GET-запросе. Достаточно стандартного примера из стандартной библиотеки Ethernet.

Gagarin74
Offline
Зарегистрирован: 24.08.2013
Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

разобрался...

А где mySQL?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

буду делать. я главное принцип понял (что от меня хочет php сервер). да и примеров много .

А по поводу самого Sql . а чего тут этот код выкладывать? он стандартный для всех лет 15. Мне главное надо было переменную из ардуинки вытащить.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Gagarin74 пишет:

буду делать. я главное принцип понял (что от меня хочет php сервер). да и примеров много .

А по поводу самого Sql . а чего тут этот код выкладывать? он стандартный для всех лет 15. Мне главное надо было переменную из ардуинки вытащить.

Короче, повторяю последний раз - вся сложность вашего проекта в стыковке с БД.

На стороне ардуино вам хватит стандартного примера из стандартной библиотеки.

File-Examples-Ethernet-Web client

И не нужны вам никакие примеры с Народным монитором.

Gagarin74 пишет:

Мне главное надо было переменную из ардуинки вытащить.

А вот этим вы меня убили...

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Сколько людей,столько и проблем и хотелок.Можно быть хорошим программером и плохим электриком.Можно офигенно разбираться в SQL и понятие не иметь о языке программирования в 1с. итд итп.

com
Offline
Зарегистрирован: 06.09.2013

inspiritus пишет:

Я же написал арда-сервер, комп является по отношению к ней клиентом...

зачем два-то сервера, и на ардуине, и на компьютере? ардуина замечательно передает данные, будучи клиентом

inspiritus
Offline
Зарегистрирован: 17.12.2012

Комп, на котором мискл, пхп интерпретатор и апач - есть сервер.

мискл Вы на арде чтоли собираетесь поднимать?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

а можно код в студию.

передача переменной $A с ардуинки на удаленный комп методом POST .

com
Offline
Зарегистрирован: 06.09.2013

inspiritus пишет:

Комп, на котором мискл, пхп интерпретатор и апач - есть сервер.

мискл Вы на арде чтоли собираетесь поднимать?

либо вы не понимаете, о чем я говорю, либо я не понимаю вас. либо и то, и друго.

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

Gagarin74 пишет:

а можно код в студию.

передача переменной $A с ардуинки на удаленный комп методом POST .

эм... а чем вам GET не угодил? проще, нагляднее, трафик меньше. или у вас секретная температура?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

блин!!!! да поднят у меня клиент на ардуине.

я с формированием посылки от неё не могу разобраться.

ещё раз повторюсь -по барабану каким методом POST GET

как передать переменную $A на IP 192.168.88.1 (это как пример большой машины)

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014
IPAddress server(192, 186, 88, 1);

...

String filename = "/script.php";

String A = "10";

String requestString="GET "+filename+"?q="+A+" HTTP/1.0";

...

client.println(requestString);

...

 

Получите запрос "GET 192.186.88.1/script.php?10 HTTP/1.0"

com
Offline
Зарегистрирован: 06.09.2013

Gagarin74 пишет:

я с формированием посылки от неё не могу разобраться.

а без ардуины-то работает? напрямую, из браузера?

valeraba
Offline
Зарегистрирован: 08.09.2014

Gippopotam пишет:

String requestString="GET "+filename+"?q="+A+" HTTP/1.0";

Получите запрос "GET 192.186.88.1/script.php?10 HTTP/1.0"

"GET 192.186.88.1/script.php?q=10 HTTP/1.0"
 

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

valeraba пишет:

Gippopotam пишет:

String requestString="GET "+filename+"?q="+A+" HTTP/1.0";

Получите запрос "GET 192.186.88.1/script.php?10 HTTP/1.0"

"GET 192.186.88.1/script.php?q=10 HTTP/1.0"
 

Две минуты вникал, пытаясь понять, что вы хотели сказать...

com
Offline
Зарегистрирован: 06.09.2013
valeraba
Offline
Зарегистрирован: 08.09.2014

com пишет:

лучше вот так

http://192.186.88.1/script.php?temp=25&sensorid=1

:)

Так выглядит запрос из браузера, а мы содержимое  HTTP запроса разбираем   :)

Gagarin74
Offline
Зарегистрирован: 24.08.2013

Ребят ,большое спасибо.Вроде с пересылкой разобрался. В приведенном коде отсылается переманная A.

Я не очень дружу с ардуинкой. Не подскажите как все это запихнуть в цикл. Что бы она посылала переменную раз в минуту на большого брата. А то сейчас код отрабатывает и все.

/*
  Web client
 
 This sketch connects to a website (http://www.google.com)
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe, based on work by Adrian McEwen
 
 */

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
//char server[] = "www.google.com";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(172,16,2,126);
IPAddress server(82,252,153,121);
// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

void setup() {
  String filename = "/pr/pr.php";
  String A ="10";
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  }
  // give the Ethernet shield a second to initialize:
  delay(1000);
  Serial.println("connecting...");

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    
    String requestString="GET "+filename+"?q="+A+" HTTP/1.0";
    
    	client.println(requestString);
   // client.println("GET /search?q=arduino HTTP/1.1");
    //client.println("Host: www.google.com");
   //p://81.252.153.121/pr/pr.php
    client.println("Connection: close");
    client.println();
  } 
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop()

{
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while(true);
  }
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Надо кусок кода с 59 по 68 строку перенести в loop и выполнять его раз в минуту, в соседних темах есть как организовать задержку без delay. Этот кусок можно вставить между 94 и 95 строкой, чтобы отправлять температуру только если действительно подключены к серверу

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Penni пишет:

Надо кусок кода с 59 по 68 строку перенести в loop и выполнять его раз в минуту, в соседних темах есть как организовать задержку без delay. Этот кусок можно вставить между 94 и 95 строкой, чтобы отправлять температуру только если действительно подключены к серверу

А еще лучше - выделить этот код в отдельную функуию, и вызывать эту функцию из loop() по расписанию.

valeraba
Offline
Зарегистрирован: 08.09.2014

c 54 по 73

:)

com
Offline
Зарегистрирован: 06.09.2013

valeraba пишет:

com пишет:

лучше вот так

http://192.186.88.1/script.php?temp=25&sensorid=1

:)

Так выглядит запрос из браузера, а мы содержимое  HTTP запроса разбираем   :)

некоторые библиотеки позволяют сразу отправлять строку запроса. экономия в коде 3-4 строки, и проще отлаживать

можно так

  if (client.connect(server, 80)) {
    Serial.println("connected");
    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  }  

а можно сразу

inet.httpGET("www.google.com", 80, url, resultmsg, len);

внутри все одинаково, но работать приятнее во втором случае

Gagarin74
Offline
Зарегистрирован: 24.08.2013

valeraba пишет:

c 54 по 73

:)

Так какой конкретно кусок кода вставить ? К сожалению сейчас проверить не могу.

valeraba
Offline
Зарегистрирован: 08.09.2014

Каждый раз перед тем как сделать запрос, нужно сперва соединиться, потом отправить данные, потом закрыть соединение.
Поэтому c 54 по 73 крутите в цикле.
Если раз в минуту, то очень долго будете ждать возможность отправки команды для реле.
Кстати, хотел спросить, чего не хватает в моём сервисе лично для вас, базы данных, нормального описания?

Gagarin74
Offline
Зарегистрирован: 24.08.2013

valeraba пишет:

Каждый раз перед тем как сделать запрос, нужно сперва соединиться, потом отправить данные, потом закрыть соединение.
Поэтому c 54 по 73 крутите в цикле.
Если раз в минуту, то очень долго будете ждать возможность отправки команды для реле.
Кстати, хотел спросить, чего не хватает в моём сервисе лично для вас, базы данных, нормального описания?

 

О каком сервисе идет речь ?