Damoc Alina (damoc.alina93@gmail.com) Timofte Maria (maria.a.timofte@gmail.com) 1. Rezumat: Implementarea unui dispozitiv ce permite verificarea temperaturii dintr-o camera. Resurse materiale: FRDM KL25Z,Raspberry Pi,senzor temperatura(termistor) Timp: 2h/sapt * 14 = 28h Atributii echipa: Damoc Alina - Preluarea temperaturii folosind senzorul de temperatura impreuna cu FRDM KL25Z si transmiterea prin seriala catre Raspberry Pi. Timofte Maria - Preluarea datelor rezultate de la FRDM KL25Z si transmiterea/afisarea lor in timp real pe un server web. Crearea unui modul py folosit pt a starta serverul. 2. Raport sintetic alternative solutie Solutii alternative pentru server web:rest API,Apache, insa noi am preferat Flask, pentru FRDM KL25Z - Arduino si pentru Raspberry PI - Bannana PI, Intel Galileo. 3. Ciorna solutie
4. Descriere activitati implementare, secventa test 5. Raport final/ prezentare Cod care este rulat pe placa FRDM KL25Z: #include "mbed.h" #define NSAMPLES 10 /*Proiectul citeste valoarea unui voltaj de la termistor si il transforma in temperatura,care va trimite pe seriala valoarea*/ Serial pc(usbtx, USBRX); AnalogIn ain(a4); DigitalOut led1(led1);//led_red-temperatura ridicata DigitalOut led2 (LED2);//LED_GREEN-temperatura normala DigitalOut led3 (LED3);//LED_BLUE-temperatura scazuta float gettemperature(float voltage); int main() {
float voltageaverage; led1=1; led2=1; led3=1; while (true) { int i=0; voltageaverage=0; for (i=0;i<10;i++) { voltageaverage+=ain.read(); wait(0.5/nsamples); voltageaverage/=nsamples; float temp=gettemperature(voltageaverage); pc.printf("t=%2.3f V=%2.3f\n", temp,voltageaverage); if(temp<23) { led3=0; led1=1; led2=1; else if((23<=temp)&&(temp<=27)) { led2=0; led1=1; led3=1; else { led1=0; led2=1; led3=1; return 0; // resistance at 25 degrees C #define THERMISTORNOMINAL 22000 // temp. for nominal resistance (almost always 25 C) #define TEMPERATURENOMINAL 25 // The beta coefficient of the thermistor (usually 3000-4000)
#define BCOEFFICIENT 4250 // the value of the 'other' resistor #define SERIESRESISTOR 4700 float gettemperature(float voltage) { // convert the value to resistance float rezthermistor=seriesresistor/voltage-seriesresistor; float steinhart; steinhart = rezthermistor / THERMISTORNOMINAL; // (R/Ro) steinhart = log(steinhart); // ln(r/ro) steinhart /= BCOEFFICIENT; // 1/B * ln(r/ro) steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To) steinhart = 1.0 / steinhart; // Invert steinhart -= 273.15; // convert to C return steinhart; Module Python: Crearea serverului web am realizat-o cu libraria Flask, prin module Python, iar html-ul rezultat din cadrul functiei index() returneaza un cod html. Acest html ii va aparea utilizatorului care se va conecta la adresa http://localhost/5001. Această adresă îi va apărea și în inboxul de pe contul de gmail sub forma: Adresa de conectare este 192.168.137.171:5001 Temperatura este: 26.375 celsius Din citirea datelor de pe seriala va rezulta informatia legata de temperatură, informație afișată în pagina web împreună cu data și ora curentă. Mai jos aveți modulul python: import socket from flask import Flask import serial, time from time import gmtime,strftime import os import sys import yagmail #import sqlmodule #writedata(str)
def splitvalues(values): str=((values.split(' ')[0]).split('='))[1] return str def readingserial(): try: ser=serial.serial('/dev/ttyacm0', 9600) serial_line = ser.readline() serial_line2 = ser.readline() ser.close() return serial_line2 except: print "<p> error" + sys.exc_info()[0] + "</p>" return "<p> error" + "error" + "</p>" def get_ip(): s = socket.socket(socket.af_inet, socket.sock_dgram) try: # doesn't even have to be reachable s.connect(('10.255.255.255', 0)) IP = s.getsockname()[0] except: IP = '127.0.0.1' finally: s.close() return IP app = Flask('_name_') @app.route("/test") def hello(): ser=readingserial() str=splitvalues(ser) return str+' celsius' @app.route("/") def index():
return ''' <html> <head> <title> Home </title> <meta http-equiv="refresh" content="3"> </head> <body> <h1> Temperature at: ''' + strftime("%y-%m-%d %H: %M: %S",gmtime()) + ''' </h1> <h1>''' +splitvalues(readingserial()) +''' celsius </h1> </body> </html> ''' if name == " main ": #app.debug=true port2=5001 try: time.sleep(10) yag=yagmail.smtp('damoc.alina93@gmail.com','xxxxx') //unde xxx modifici și pui parola de la contul de gmail în acest caz #f = os.popen('ifconfig eth0 grep "inet\ addr" cut -d: -f2 cut -d" " -f1') your_ip=get_ip() email_body='adresa de conectare este '+your_ip+':'+str(port2) email_body=email_body+'\ntemperatura este: '+hello() yag.send('damoc.alina93@gmail.com','serverul de pe Rasberry a fost pornit',email_body) app.run(host='0.0.0.0',port=port2) except: print "exception" time.sleep(5) Pentru a nu rula scriptul din linia de comanda manual, acesta este apelat automat intr-un script salvat in directorul /home/pi/launcher. Folosindu-ne de utilitatea din unix a comenzii crontab acest launcher este apelat automat in momentul in care SO unix al lui Raspberry PI este pornit. #!/bin/sh cd / cd /home/pi/launcher sudo python alina.py
cd / Pentru a verifica conectarea la serverul web, am directionat intr-un fisier log mesajele legate de starea serverului. / ***************************************************************************************************** /