📜 ⬆️ ⬇️

Arduino temperature and humidity sensor with sending and drawing graphics (Part 1)

The main objective of the project is to monitor the temperature in the greenhouse remote from the house at 11-15 meters. Without the possibility of organizing the laying of UTP and power to it.

Hothouse part:

  1. Remove temperature / humidity with a DHT-11 sensor using pro micro
  2. Send fs1000a with pro micro

Home part:

  1. Accept values ​​on mx-rm-5v with Uno
  2. Send to server using Ethernet shield (WIZNET W5100 HR911105A )
  3. Write to the mysql database
  4. Draw a graph (jpgraph)


')
Started a little out of order. For me, this sequence was more difficult, so I decided to implement it at the beginning.

The list of necessary packages is not huge and depends on the distribution kit, namely nginx, php-gd, php-mysql, mysql-server. For jpgraph you may need ttf fonts.

Prepare nginx
server { listen 80; listen [::]:80; root /var/www/html; location / { } location ~ \.php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # With php7.0-cgi alone: # fastcgi_pass 127.0.0.1:9000; # With php7.0-fpm: fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_buffer_size 128k; fastcgi_buffers 256 32k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_connect_timeout 1s; fastcgi_ignore_client_abort off; fastcgi_next_upstream timeout; fastcgi_read_timeout 5m; fastcgi_send_timeout 5m; } } 


For uno, we need the following libraries:
SPI.h
Ethernet.h
DHT.h

UNO code
 #include <SPI.h> #include <Ethernet.h> #include <DHT.h> // MAC address for controller byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //  byte ip[] = { 192, 168, 156, 192 }; // byte subnet[] = { 255, 255, 255, 0 }; // byte gateway[] = { 192, 168, 0, 1 }; //    char server[] = "192.168.156.186"; #define DHTPIN 2 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); //  EthernetClient client; void setup() { dht.begin(); Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect } { Ethernet.begin(mac,ip,gateway,subnet); } // give the Ethernet shield a second to initialize delay(1000); } void loop() { if (client.connect(server, 80)) { // give the Ethernet shield a second to initialize float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.println("connected"); //  GET    client.println(String("GET /index.php?temp=")+ t +"&hum="+h); client.println(); Serial.println("connection close"); } else Serial.println("connection failed"); delay(60000); } 


A sketch every minute sends a GET request to the script (index.php):

index.php
 <?php /** * @param string $message * @param PDOException|null $exception */ function writeMessage($message, $exception = null) { $logfile = '/var/www/html/data/arduino.log'; $datetime = date('dmY H:i:s', time()); if ($exception !== null) { $message .= ': ' . $exception->getFile() . ' (line: ' . $exception->getLine() . ') - ' . $exception->getMessage(); } file_put_contents($logfile, '[' . $datetime . '] ' . $message."\n", FILE_APPEND); } /*     MySQL     */ $dsn = 'mysql:dbname=greenhouse;host=localhost'; $user = 'arduino'; $password = ''; try { $dbh = new PDO($dsn, $user, $password, [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8', ]); } catch (PDOException $e) { writeMessage(' ', $e); } try { $sth = $dbh->prepare('INSERT INTO data (sensor, temperature, humidity, created_at) VALUES (?, ?, ?, NOW())'); $sth->execute(['grass', $_REQUEST['temp'], $_REQUEST['hum']]); } catch (PDOException $e) { writeMessage(' ', $e); } 


which in turn sends values ​​to the database:

Creating a table
 CREATE DATABASE `greenhouse` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 

 CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `sensor` varchar(255) DEFAULT NULL, `temperature` decimal(6,3) DEFAULT '0.00', `humidity` decimal(6,3) DEFAULT '0.00', `created_at` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 



We add the user and we issue the rights
 CREATE USER 'arduino'@''' IDENTIFIED BY ''; 

 GRANT ALL PRIVILEGES ON * . * TO 'arduino'@''; 

 FLUSH PRIVILEGES; 



Checking:

 select * from data; 

 +-----+--------+-------------+----------+---------------------+ | id | sensor | temperature | humidity | created_at | +-----+--------+-------------+----------+---------------------+ | 1 | grass | NULL | NULL | 2019-07-15 13:29:13 | | 2 | grass | 24.100 | 49.000 | 2019-07-15 13:44:44 | | 3 | grass | 24.100 | 49.000 | 2019-07-15 13:44:54 | | 4 | grass | 24.000 | 49.000 | 2019-07-15 13:45:04 | | 5 | grass | 24.000 | 49.000 | 2019-07-15 13:45:15 | | 6 | grass | 24.100 | 49.000 | 2019-07-15 13:45:25 | | 7 | grass | 24.100 | 49.000 | 2019-07-15 13:45:35 | | 8 | grass | 24.100 | 49.000 | 2019-07-15 13:45:45 | | 9 | grass | 24.100 | 49.000 | 2019-07-15 13:45:55 | | 10 | grass | 24.100 | 48.000 | 2019-07-15 13:46:47 | | 11 | grass | 24.100 | 48.000 | 2019-07-15 13:46:58 | | 12 | grass | 24.100 | 48.000 | 2019-07-15 13:47:08 | 

Data in the database!

Installing the JpGraph library

remove it in / var / www / src

Now draw a graph (day.php):

day.php
 <?php // content="text/plain; charset=utf-8" //define('__ROOT__', dirname(dirname())); require_once ('/var/www/src/jpgraph.php'); require_once ('/var/www/src/jpgraph_line.php'); require_once ('/var/www/src/jpgraph_error.php'); require_once ('/var/www/src/jpgraph_date.php'); $x_axis = array(); $y_axis = array(); $i = 0; $con=mysqli_connect('localhost','arduino','','greenhouse'); $result = mysqli_query($con,"SELECT * FROM data"); while($row = mysqli_fetch_array($result)) { $x_axis[$i] = strtotime($row["created_at"]); $y_axis[$i] = $row["temperature"]; $i++; } mysqli_close($con); $start = time(); $end = $start+NDATAPOINTS*SAMPLERATE; for( $i=0; $i < NDATAPOINTS; ++$i ) { $x_axis[$i] = rand(50,70); $xdata[$i] = $start + $i * SAMPLERATE; } $graph = new Graph(1000,400); $graph->img->SetMargin(50,30,30,80); $graph->img->SetAntiAliasing(); $graph->SetScale('datlin'); $graph->xaxis->scale->SetDateFormat('d:m H:i'); $graph->SetShadow(); $graph->title->Set("  "); $graph->xaxis->title->Set(''); $graph->xaxis->SetLabelAngle(45); $graph->yaxis->title->Set(''); $graph->xaxis->scale->SetTimeAlign(DAYADJ_1); $graph->title->SetFont(FF_TIMES,FS_BOLD); // Use 20% "grace" to get slightly larger scale then min/max of // data $graph->yscale->SetGrace(0); $p1 = new LinePlot($y_axis,$x_axis); $p1->mark->SetType(MARK_FILLEDCIRCLE); $p1->mark->SetFillColor("red"); $p1->mark->SetWidth(4); $p1->SetColor("blue"); $p1->SetCenter(); $graph->Add($p1); $graph->Stroke(); 


We get this beauty here:



That's all for now. Now I’m working on setting up a bunch of two boards over the radio about which I’m writing in the second part.

Source: https://habr.com/ru/post/460491/


All Articles