Advertisement
Guest User

ShowAnalogOutput.cpp

a guest
Mar 16th, 2016
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.87 KB | None | 0 0
  1. #include <Arduino.h>
  2. //#include "Digit.h"
  3.  
  4. const unsigned short max_send_frequency = 20;
  5. #define BUFFER_SIZE 128
  6. #define TEST_DIODE 12
  7. void setup()
  8. {
  9.  Serial.begin(9600);     // opens serial port, sets data rate to 19200 bps
  10.  Serial.setTimeout(1000);  // sets the time to wait before stopping the receive functio
  11.  
  12.  pinMode(TEST_DIODE, OUTPUT);
  13.  digitalWrite(TEST_DIODE, LOW);
  14.  
  15. }
  16.  
  17.  
  18. inline void sendNumber(unsigned short x, byte* buffer, byte& buffer_pos) {
  19.   buffer[buffer_pos++] =  x & 0xff;
  20.   buffer[buffer_pos++] = (x >> 8) & 0xff;
  21. }
  22. void loop()
  23. {
  24.   // read the value from the sensor:
  25.   //Digit d = Digit();
  26.   //d.SetPin(10,8,7,6,4,3,9,5);
  27.   //d.Init();
  28.   short sensorValue = 0;  // variable to store the value coming from the sensor
  29.   int sensorPin = A0;
  30.   unsigned long last_time_sent = millis();
  31.   byte buffer[BUFFER_SIZE];
  32.   byte buffer_pos = 0;
  33.   boolean work = false;
  34.   unsigned long work_timer = 0;
  35.   // timeout to turn led off
  36.   unsigned long led_timeout = 0;
  37.   byte led_repeat = 0;
  38.   byte led_interval = 0;
  39.   //byte number = 0;
  40.   while(1) {
  41.     unsigned long now = millis();
  42.     if(Serial.available()>=2) {
  43.        byte data[2];
  44.        Serial.readBytes((char*)data, 2);
  45.        switch(data[0]) {
  46.           //Toggle data stream
  47.           case 0 : work = data[1];break;
  48.           //reset comunication (in case of error)
  49.           case 1 : buffer_pos=0;work=false;last_time_sent = now+10;work_timer=now+50;break;
  50.           case 2 : digitalWrite(TEST_DIODE, HIGH);led_timeout=now+100*data[1]; break;
  51.           case 3 : sendNumber(data[1]*4, buffer, buffer_pos);break;
  52.           //default:break;
  53.        }
  54.        //digitalWrite(TEST_DIODE, HIGH);
  55.        //led_timeout=now+100;
  56.        //led_repeat = 4;
  57.        //led_interval = 100;
  58.     }
  59.     if(led_timeout>0 && led_timeout<now) {
  60.         led_timeout = 0;
  61.         if(led_repeat==0) {
  62.             digitalWrite(TEST_DIODE, LOW);  
  63.         }
  64.         else {
  65.             digitalWrite(TEST_DIODE, led_repeat%2==0?LOW:HIGH);  
  66.             led_timeout = now+led_interval;
  67.             --led_repeat;
  68.         }
  69.     }
  70.     // if(work_timer!=0&&work_timer<millis()) {
  71.     //   work_timer = 0;
  72.     //   work = true;
  73.     // }
  74.     if(work) {
  75.         if(buffer_pos<BUFFER_SIZE-2) {
  76.             sensorValue = analogRead(sensorPin);
  77.             // d.DrawNumber((byte)((float)sensorValue/102.4));
  78.             if(sensorValue<0 || sensorValue>1023) {
  79.                 buffer[buffer_pos++] = 1;
  80.                 buffer[buffer_pos++] = 4;
  81.             }
  82.             else {
  83.                 buffer[buffer_pos++] = sensorValue & 0xff;
  84.                 buffer[buffer_pos++] = (sensorValue >> 8) & 0xff;
  85.             }
  86.         }
  87.     }
  88.     if(now-last_time_sent>max_send_frequency && buffer_pos>0) {
  89.       Serial.write(buffer, buffer_pos);
  90.       buffer_pos = 0;
  91.       last_time_sent = now;
  92.     }
  93.     else
  94.       delay(1);
  95.   }
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement