/* * Authors: * Erwin Ried (http://erwin.ried.cl) * * Felipe Astroza (http://astroza.cl) * */ #define LED_PIN 13 #define SENSOR_PIN 0 #define BUTTON_PIN 12 #define THRESHOLD 100 #define LATENCY 10 #define SEND_INTERVAL 1000 #define FIRST 0x1 #define SECOND 0x2 int state = FIRST; unsigned long last_sent; int present_laser; int cajas = 0; boolean cajas_dirty = 1; boolean first_time = true; void calibrate() { digitalWrite(LED_PIN, HIGH); while(digitalRead(BUTTON_PIN) != LOW); present_laser = analogRead(SENSOR_PIN); digitalWrite(LED_PIN, LOW); } void blink(int ms) { digitalWrite(LED_PIN, HIGH); delay(ms); digitalWrite(LED_PIN, LOW); } void blink(int ms, int repeats) { for(int i=0;i> 'CC' STO CC"); // RUTINAS HP // CC: Limpia // CT: Cajas // ST: Calibrar // REA: Ready // SC: Main screen //Serial.print(0x00,BYTE); //Serial.print("\\<< PICT { #2 #2 } \"CALIBRATION ROUTINE\" 2 \\->GROB REPL 1000 0.2 BEEP 2000 0.1 BEEP "); //Serial.print(0x00,BYTE); //Serial.print("PICT { #2 #20 } \"Set the laser and press the\" 1 \\->GROB REPL "); //Serial.print("PICT { #2 #29 } \"calibration button to begin.\" 1 \\->GROB REPL \\>> 'ST' STO"); //Serial.print(0x00,BYTE); //Serial.print("\\<< PICT { #2 #48 } \"...READY\" 2 \\->GROB REPL 1000 0.2 BEEP 2000 0.1 BEEP \\>> 'RE' STO"); //Serial.print(0x00,BYTE); //Serial.print("\\<< CC PICT { #2 #2 } \"Laser counting test\" 2 \\->GROB REPL PICT { #2 #13 } \"The objects are being counted.\" 1 \\->GROB REPL 1000 0.2 BEEP 2000 0.1 BEEP \\>> 'SC' STO"); //delay(16000); //Serial.print(0x00,BYTE); //Serial.print("\\<< \"OBJECTS: \" SWAP + 2 \\->GROB PICT SWAP { #10 #40 } SWAP REPL 2000 0.1 BEEP \\>> 'CT' STO 0 CT"); // */ Serial.begin(9600); pinMode(BUTTON_PIN,INPUT); pinMode(LED_PIN,OUTPUT); Serial.print(0x00,BYTE); Serial.print("ST"); calibrate(); Serial.print(0x00,BYTE); Serial.print("REA"); delay(1000); Serial.print(0x00,BYTE); Serial.print("SC"); blink(100,5); last_sent = millis(); } inline int is_present() { delay(LATENCY); int val = analogRead(SENSOR_PIN); return val >= (present_laser - THRESHOLD) && val <= (present_laser + THRESHOLD) ? true : false; } inline void inc_count() { blink(100); cajas++; cajas_dirty = true; } void notify() { Serial.print(0x00,BYTE); Serial.print(cajas,DEC); Serial.print(" CT"); } void loop() { if(first_time || ((millis() - last_sent) >= SEND_INTERVAL && cajas_dirty)) { first_time = false; cajas_dirty = false; notify(); last_sent = millis(); } switch(state) { case FIRST: if(is_present() == false) state = SECOND; break; case SECOND: if(is_present() == true) { state = FIRST; inc_count(); } } }