1. Ένας μικροεπεξεργαστής Arduino MEGA
2. Ένα εξάρτημα (αισθητήρας) μετατροπής του φωτός σε συχνότητα TLS237S
3. Ένας εξάρτημα αισθητήρας θερμοκρασίας DS18S20
4. Μια αντίσταση 4,7Κ για τον αισθητήρα θερμοκρασίας.
5. Ένας πυκνωτής 0,1uF για τον αισθητήρα φωτός.
6. Ένα Display LCD + 10k trimmer
7. Δύο διακόπτες ON-OFF
8. πλακέτα για την κατασκευή + πλαστικό κουτί.
9. RF transmitter and receiver 433Mhz MX-05V & MX-FS-03V
10. Φακός fisheye lens
11. IR-Cut filter

 

 

 

#include <OneWire.h>
#include <VirtualWire.h>
#include <LiquidCrystal.h>

/*Ioannis A. Bouhras - ioannis_bouhras@zeuslinux.gr*/

// FREQ START
float Msqm;
const float A = 30.0;
int TSL237S_Pin = 7; //TSL237S output
int TSL237S_samples = 6; //higher = slower but more stable and accurate
// FREQ SEND


LiquidCrystal lcd (12, 11, 5, 4, 3, 2);

char charnum[10];

int DS18S20_Pin = 8; //DS18S20 Signal pin on digital 2

//Temperature chip i/o
OneWire ds(DS18S20_Pin); // on digital pin 2

void setup(void) {
 
 Serial.begin(9600);
 delay(1000);
 lcd.begin(16,2);
 lcd.print("Arduino SQM 1.0");
 delay(3000);
 lcd.clear();
 float lightLevel = readTSL237S(TSL237S_samples);
 lcd.print(lightLevel);
 lcd.print(" Mag/As2");

 /*SETUP TRANSMITER*/
 vw_set_ptt_inverted(true);  // Required  the RF module
 vw_setup(2000);            // bps connection speed
 vw_set_tx_pin(9);         // Arduino pin to connect the receiver data pin
}

void loop() {

 lcd.print("OK");
 
 float Celcius = getTemp();

 Serial.print(Celcius);
 
 float Fahrenheit = Celcius * 1.8 + 32;
 
 Serial.print(" ");
 
 Serial.print(Fahrenheit);
 
 Serial.print(" ");
 
 float lightLevel = readTSL237S(TSL237S_samples);
 Serial.print(lightLevel);
 
 Serial.print(" ");
 
 Serial.print(lightLevel - 19.00);
 
 Serial.println(" ");
 
 delay(300); //just here to slow down the output so it is easier to read
 
 char buff[30];
 
 /*Transmit our data*/
 
 int tempC1 = (int)Celcius;
 int tempC2 = (int)Fahrenheit;
 int tempC3 = (int)lightLevel;
 int magLim = (int)lightLevel - 19;
 
 char msg[24];
 
 sprintf(msg, "%i %i %i %i", tempC1,tempC2,tempC3,magLim);

 vw_send((uint8_t *)msg, strlen(msg));
 vw_wait_tx();        // We wait to finish sending the message
 delay(200);         // We wait to send the message again   
 

 
 
}

float readTSL237S(int samples){
//sample light, return reading in frequency
//higher number means brighter

  float start = micros(); 
  int readings = 0;

  while(readings < samples){
   pulseIn(TSL237S_Pin, HIGH);
   readings ++;
  }

  float length = micros() - start;
  float freq = (1000000 / (length / samples)) * 10;
 
  Msqm = A - 2.5*log10(freq);
 
 
  return Msqm;
}



float getTemp(){
 //returns the temperature from one DS18S20 in DEG Celsius

 te data[12];
 te addr[8];

 if ( !ds.search(addr)) {
   //no more sensors on chain, reset search
   ds.reset_search();
   return -1000;
 }

 if ( OneWire::crc8( addr, 7) != addr[7]) {
   Serial.println("CRC is not valid!");
   return -1000;
 }

 if ( addr[0] != 0x10 && addr[0] != 0x28) {
   Serial.print("Device is not recognized");
   return -1000;
 }

 ds.reset();
 ds.select(addr);
 ds.write(0x44,1); // start conversion, with parasite power on at the end

 te present = ds.reset();
 ds.select(addr); 
 ds.write(0xBE); // Read Scratchpad

 
 for (int i = 0; i < 9; i++) { // we need 9 tes
  data[i] = ds.read();
 }
 
 ds.reset_search();
 
 te MSB = data[1];
 te LSB = data[0];

 float tempRead = ((MSB << 8)  LSB); //using two's compliment
 float TemperatureSum = tempRead / 16;
 
 return TemperatureSum;
 
}

Sample output

26 80 19 3
26 79 19 4
26 79 19 4
26 79 19 4
26 79 19 4
26 79 19 4
26 79 19 4
26 79 19 4