具有发送和绘图功能的Arduino温度和湿度传感器(第1部分)

该项目的主要目的是监视距离房屋11-15米的温室中的温度。 没有组织UTP铺设和电源的可能性。

温室部分:

  1. 使用pro micro通过DHT-11传感器获取温度/湿度
  2. 使用Pro Micro发送FS1000A

首页部分:

  1. 使用Uno接受mx-rm-5v上的值
  2. 使用以太网屏蔽发送到服务器(WIZNET W5100 HR911105A
  3. 写入mysql数据库
  4. 画图(jpgraph)



他开始有点混乱。 对我来说,这个序列更加复杂,因此我决定首先实现它。

所需软件包的列表不是很大,并且取决于发行版,即nginx,php-gd,php-mysql,mysql-server。 对于jpgraph,您可能需要ttf字体。

准备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; } } 


对于Uno,我们需要以下库:
SPI.h
以太网
DHT.h

UNO代码
 #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); } 


草图每分钟将GET请求发送到脚本(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); } 


依次将值发送到数据库:

表格创建
 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; 



添加用户和授予权限
 CREATE USER 'arduino'@''' IDENTIFIED BY ''; 

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

 FLUSH PRIVILEGES; 



我们检查:

 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 | 

数据库中的数据!

安装JpGraph

在/ var / www / src中删除它

现在绘制图形(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(); 


我们得到这样的美丽:



现在就这些了。 现在,我正在努力在无线电频道上设置两块板的捆绑,这将在第二部分中介绍。

Source: https://habr.com/ru/post/zh-CN460491/


All Articles