原本設計沒有顯示器,直接接筆電,以excel 表示。
此進階板保留excel功能,加上 LCD. Nokia5110.,用起來更直觀,也比目前市售產品的畫面更好看。
附上照片及code
/*****************************************************************************
* Origin Code : http://www.instructables.com/id/Nokia-5110-Arduino-Oscilloscope/
* Skin GSR Theory: http://www.theanthillsocial.co.uk/sketch/163
http://www.coherence.com/gsr_html_production.htm
* Part: 300K ohm ,1UF Capacity(no 0.1UF,so use this)
* Also link " Microsot Excel "
* 171010 modify
* Conductance in water :4.76 ,no contace:0.76
****************************************************************************** */
#include <adafruit_gfx.h>
#include <adafruit_pcd8544.h>
#include <spi.h>
#define DISPLAY_WIDTH 84
#define DISPLAY_HEIGHT 48
#define ARDUINO_PRECISION 1023.0
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
int channelAI = A0; // probe
#define DELAY_POTENTIMETER //disabled it I don't have it connected
#ifdef DELAY_POTENTIMETER
int delayAI = A1; // delay potentiometer
#endif
float delayVariable = 0;
float scale = 0;
int xCounter = 0;
int yPosition = 0;
int readings[DISPLAY_WIDTH+1];
int counter = 0;
unsigned long drawtime = 0;
unsigned long lastdraw = 0;
int frames = 0;
int a = 0;
void setup(void)
{
display.begin();
display.setContrast(60);// you might have a slightly different display so it might not be the optimal value for you
display.clearDisplay();
Serial.begin(9600);
Serial.println("LABEL,Number,Conductance");
}
void loop()
{
#ifdef DELAY_POTENTIMETER
delayVariable = analogRead(delayAI);
delayVariable = (delayVariable/100);
#endif
scale = (float)(DISPLAY_HEIGHT-1)/ARDUINO_PRECISION;
//record readings
for(xCounter = 0; xCounter <= DISPLAY_WIDTH; xCounter++)
{
yPosition = analogRead(channelAI);
readings[xCounter] = (yPosition*scale);
#ifdef DELAY_POTENTIMETER
delay (delayVariable);
#endif
}
display.clearDisplay();
//Draw Voltage Ref Lines
display.drawLine( 10, 0, 10, DISPLAY_HEIGHT-1, BLACK);
display.drawLine( 5, (DISPLAY_HEIGHT-1)-(.2 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.2 *ARDUINO_PRECISION * scale), BLACK);
display.drawLine( 0, (DISPLAY_HEIGHT-1)-(.4 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.4 *ARDUINO_PRECISION * scale), BLACK);
display.drawLine( 5, (DISPLAY_HEIGHT-1)-(.6 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.6 *ARDUINO_PRECISION * scale), BLACK);
display.drawLine( 0, (DISPLAY_HEIGHT-1)-(.8 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.8 *ARDUINO_PRECISION * scale), BLACK);
//display.drawLine( 5, (DISPLAY_HEIGHT-1)-(.84 *ARDUINO_PRECISION * scale), 10, (DISPLAY_HEIGHT-1)-(.84 *ARDUINO_PRECISION * scale), BLACK);
//Draw Voltage Ref Numbers
display.setCursor(0,((DISPLAY_HEIGHT-1)-(.2 *ARDUINO_PRECISION * scale))-3);
display.print((int)(5.0*0.2));
display.setCursor(0,((DISPLAY_HEIGHT-1)-(.4 *ARDUINO_PRECISION * scale))-3);
display.print((int)(5.0*0.4));
display.setCursor(0,((DISPLAY_HEIGHT-1)-(.6 *ARDUINO_PRECISION * scale))-3);
display.print((int)(5.0*0.6));
display.setCursor(0,((DISPLAY_HEIGHT-1)-(.8 *ARDUINO_PRECISION * scale))-3);
display.print((int)(5.0*0.8));
for(xCounter = 0; xCounter <= DISPLAY_WIDTH; xCounter++)
{
display.drawPixel(xCounter, (DISPLAY_HEIGHT-1)-readings[xCounter], BLACK);
if(xCounter>1){
display.drawLine(xCounter-1, (DISPLAY_HEIGHT-1)-readings[xCounter-1], xCounter, (DISPLAY_HEIGHT-1)-readings[xCounter], BLACK);
}
}
//Draw FPS
display.setCursor((DISPLAY_WIDTH-1)-11,0);
display.print(frames);
//Draw Voltage
display.setCursor(((DISPLAY_WIDTH-1)/2),0);
display.print(analogRead(channelAI)/ARDUINO_PRECISION*5.0);
display.display();
//Calculate FPS
drawtime = micros();
frames=1000000/*a second*//(drawtime-lastdraw);
lastdraw = drawtime;
a = a + 1 ;
Serial.print("DATA");
Serial.print(",");
Serial.print("a");
Serial.print(",");
Serial.println(analogRead(channelAI)/204.6);//204.6 = ARDUINO_PRECISION*5.0
//delay(1000);// NO delay() is good,otherwise frmae no work
}

沒有留言:
張貼留言