#!/usr/bin/python3.4
# coding=utf-8
import RPi.GPIO as GPIO
import Adafruit_DHT as DHT
import Adafruit_BMP.BMP085 as BMP
import time
import pymysql
import smbus
import threading
import os
import signal
import smtplib
from email.mime.text import MIMEText
import getopt
import sys
from oled import oledDisplay as OLED
from mylogger import mylogger, getCFG
from power_controller import PowerControl
class ems:
# logger
logger = mylogger('ems', 'log_ems')
# 各线程检测频率
_saveFreq = _warnFreq = 10
_acqFreq = 1 / 6
# 采集到的数据
_humi22 = _temp22 = _illuminance = _pressure = _temperature = _altitude = _sealevel_pressure = -1
_haveco = 'E'
# 各线程是否存在
_thrAcqAlive = _thrSaveAlive = _thrSendAlive = _isFirstStarted = False
# 是否键盘中断 & 是否关闭OLED
_isINT = _oledOFF = False
# 采集线程是否运行
_isAcqRun = False
# OLED显示状态
_oledStatus = 0
# OLED总状态数
_allStatus = 2
# 电源控制实例,在OLED初始化前上电
PC = PowerControl(logger)
# OLED实例
_oled = OLED()
# oled显示状态切换 线程锁
_oledLock = threading.Lock()
_acqLock = threading.Lock()
_config = getCFG('../config.json')
def getLocalTime(self):
localtime = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
return localtime
def getLocalTimeHuman(self):
localtime = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
return localtime
def getConnection(self, host, user, password, db, port=int(_config['database']['port']), charset='utf8'):
connection = pymysql.connect(host=host, user=user, password=password, db=db, port=port, charset=charset)
return connection
# except Exception as exc:
# print(getLocalTime(),exc)
def insertDataDHT22(self, connection, table, temp, humi):
# try:
with connection.cursor() as cursor:
sql = 'insert into ' + table + '(date,temp,humi) values (' + self.getLocalTime() + ',' + str(
temp) + ',' + str(
humi) + ');'
cout = cursor.execute(sql)
if cout >= 1:
self.logger.info('Insert ' + str(cout) + ' row(s) in sensors_data.' + table)
connection.commit()
# except AttributeError as exc:
# print(getLocalTimeHuman(),'Connection hasnt opened!',exc)
# except Exception as exc:
# print(getLocalTimeHuman(),'Database insert error!',exc)
# connection.rollback()
def insertDataGY30(self, connection, table, illuminance):
# try:
with connection.cursor() as cursor:
sql = 'insert into ' + table + '(date,illuminance) values (' + self.getLocalTime() + ',' + str(
illuminance) + ');'
cout = cursor.execute(sql)
if cout >= 1:
self.logger.info('Insert ' + str(cout) + ' row(s) in sensors_data.' + table)
connection.commit()
# except AttributeError as exc:
# print(getLocalTimeHuman(),'Connection hasnt opened!',exc)
# except Exception as exc:
# print(getLocalTimeHuman(),'Database insert error!',exc)
# connection.rollback()
def insertDataMQ7(self, connection, table, haveco):
# try:
with connection.cursor() as cursor:
sql = 'insert into ' + table + '(date,haveco) values (' + self.getLocalTime() + ',"' + haveco + '");'
cout = cursor.execute(sql)
if cout >= 1:
self.logger.info('Insert ' + str(cout) + ' row(s) in sensors_data.' + table)
connection.commit()
# except AttributeError as exc:
# print(getLocalTimeHuman(),'Connection hasnt opened!',exc)
# except Exception as exc:
# print(getLocalTimeHuman(),'Database insert error!',exc)
# connection.rollback()
def insertDataGY68(self, connection, table, pressure, temperature, altitude, sealevel_pressure):
# try:
with connection.cursor() as cursor:
sql = 'insert into ' + table + '(date,pressure,temperature,altitude,sealevel_pressure) values (' + self.getLocalTime() + ',' + str(
pressure) + ',' + str(temperature) + ',' + str(altitude) + ',' + str(sealevel_pressure) + ');'
cout = cursor.execute(sql)
if cout >= 1:
self.logger.info('Insert ' + str(cout) + ' row(s) in sensors_data.' + table)
connection.commit()
# except AttributeError as exc:
# print(getLocalTimeHuman(),'Connection hasnt opened!',exc)
# except Exception as exc:
# print(getLocalTimeHuman(),'Database insert error!',exc)
# connection.rollback()
def insertDataALL(self, connection, table, temp, humi, illuminance, pressure):
# try:
with connection.cursor() as cursor:
sql = 'insert into ' + table + '(date,temp,humi,light,press) values (' + self.getLocalTime() + ',' + str(
temp) + ',' + str(humi) + ',' + str(illuminance) + ',' + str(pressure) + ');'
# sql = 'insert into ' + table + '(date,temp,humi,illuminance,pressure,haveco) values (' + self.getLocalTime() + ',' + str(
# temp) + ',' + str(humi) + ',' + str(illuminance) + ',' + str(pressure) + ',"' + haveco + '");'
cout = cursor.execute(sql)
if cout >= 1:
self.logger.info('Insert ' + str(cout) + ' row(s) in capteur.' + table)
connection.commit()
# except AttributeError as exc:
# print(getLocalTimeHuman(),'Connection hasnt opened!',exc)
# except Exception as exc:
# print(getLocalTimeHuman(),'Database insert error!',exc)
# connection.rollback()
def insert(self):
try:
connCloud = self.getConnection(self._config['database']['host'], self._config['database']['user'],
self._config['database']['password'], 'capteur')
while (True):
connCloud.commit()
date = self.travValue(connCloud, 'sensor_data', 'date', 'order by date desc limit 1')
distance = (time.mktime(time.localtime(time.time())) - time.mktime(
time.strptime(str(date[0][0]), "%Y-%m-%d %H:%M:%S")))
if self._isAcqRun:
if distance >= self._saveFreq * 60 or date == None:
# if self._temp22 is not None and 0 <= self._humi22 <= 100.0 and self._illuminance >= 0 and self._haveco is not None:
self._acqLock.acquire()
self.logger.info('Cloud Server:')
# self.insertDataDHT22(connCloud, 'dht22', ('%.2f' % self._temp22), ('%.2f' % self._humi22))
# self.insertDataGY30(connCloud, 'gy30', ('%.1f' % self._illuminance))
# self.insertDataMQ7(connCloud, 'mq7', self._haveco)
# self.insertDataGY68(connCloud, 'gy68', self._pressure, self._temperature, self._altitude,
# self._sealevel_pressure)
self.insertDataALL(connCloud, 'sensor_data', ('%.2f' % self._temp22),
('%.2f' % self._humi22), ('%.1f' % self._illuminance),
('%.2f' % self._pressure))
# date[0][0] = getLocalTime()
self._acqLock.release()
# else: # 错误输出错误信息,和校验数据
# self.logger.error("Insert Data Wrong! Waiting For ReAcquire")
# time.sleep(10)
elif self._saveFreq * 60 - distance > 600:
time.sleep(540)
elif self._saveFreq * 60 - distance > 300:
time.sleep(240)
elif self._saveFreq * 6
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
一个记录室内环境参数的系统,部署于树莓派,通过web页面来操作系统及查看数据.zip嵌入式优质项目,资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目。 本人单片机开发经验充足,深耕嵌入式领域,有任何使用问题欢迎随时与我联系,我会及时为你解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明,项目具体内容可查看下方的资源详情。 【附带帮助】: 若还需要嵌入式物联网单片机相关领域开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步。 【本人专注嵌入式领域】: 有任何使用问题欢迎随时与我联系,我会及时解答,第一时间为你提供帮助,CSDN博客端可私信,为你解惑,欢迎交流。 【建议小白】: 在所有嵌入式开发中硬件部分若不会画PCB/电路,可选择根据引脚定义将其代替为面包板+杜邦线+外设模块的方式,只需轻松简单连线,下载源码烧录进去便可轻松复刻出一样的项目 【适合场景】: 相关项目设计中,皆可应用在项目开发、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面中 可借鉴此优质项目实现复刻,也可以基于此项目进行扩展来开发出更多功能
资源推荐
资源详情
资源评论
收起资源包目录
基于树莓派+web设计的室内环境监控系统(毕设/课设/竞赛/实训/项目开发) (2000个子文件)
adminlte.css 770KB
adminlte.min.css 671KB
adminlte.core.css 385KB
adminlte.core.min.css 327KB
adminlte.plugins.css 195KB
adminlte.plugins.min.css 176KB
adminlte.components.css 140KB
adminlte.components.min.css 126KB
all.css 71KB
fontawesome.css 69KB
all.min.css 57KB
fontawesome.min.css 56KB
bootstrap-4.css 43KB
_all-skins.min.css 41KB
v4-shims.css 40KB
flag-icon.css 37KB
jquery-ui.css 36KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
pace-theme-material.css 34KB
bootstrap-4.min.css 34KB
jsgrid-theme.css 34KB
flag-icon.min.css 33KB
jsgrid-theme.min.css 33KB
jquery-ui.min.css 31KB
sweetalert2.css 30KB
summernote-lite.css 29KB
summernote-lite.min.css 28KB
main.css 27KB
v4-shims.min.css 26KB
sweetalert2.min.css 24KB
bootstrap-switch.css 23KB
OverlayScrollbars.css 23KB
adminlte.extra-components.css 21KB
summernote-bs4.css 20KB
summernote.css 19KB
bootstrap-switch.min.css 19KB
OverlayScrollbars.min.css 19KB
summernote-bs4.min.css 19KB
summernote.min.css 19KB
google.css 18KB
jquery-ui.structure.css 18KB
jquery-ui.theme.css 18KB
adminlte.extra-components.min.css 18KB
select2.css 17KB
jquery-ui.structure.min.css 15KB
icheck-bootstrap.css 15KB
select2.min.css 15KB
main.min.css 14KB
jquery-ui.theme.min.css 14KB
ion.rangeSlider.css 13KB
icheck-bootstrap.min.css 12KB
bootstrap-colorpicker.css 11KB
ion.rangeSlider.min.css 11KB
bootstrap-slider.css 10KB
bootstrap-colorpicker.min.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
pace-theme-loading-bar.css 9KB
bootstrap-slider.min.css 9KB
tempusdominus-bootstrap-4.css 9KB
tempusdominus-bootstrap-4.min.css 9KB
svg-with-js.css 8KB
daterangepicker.css 8KB
adminlte.pages.css 7KB
toastr.css 7KB
main.css 7KB
ekko-lightbox.css 7KB
toastr.min.css 6KB
svg-with-js.min.css 6KB
bootstrap-switch.css 6KB
adminlte.pages.min.css 6KB
select2-bootstrap4.css 6KB
dataTables.bootstrap4.css 6KB
bootstrap-switch.min.css 5KB
dataTables.bootstrap4.min.css 5KB
select2-bootstrap4.min.css 5KB
pace-theme-bounce.css 5KB
pace-theme-bounce.css 5KB
pace-theme-bounce.css 5KB
pace-theme-bounce.css 5KB
pace-theme-bounce.css 5KB
pace-theme-bounce.css 5KB
pace-theme-bounce.css 5KB
pace-theme-bounce.css 5KB
pace-theme-bounce.css 5KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
阿齐Archie
- 粉丝: 1w+
- 资源: 2303
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功