DIY Vision Testing System: Snellen Chart with Arduino Uno
The Snellen Chart Vision Testing System using Arduino Uno is an innovative, automated self-test solution for eye vision assessment. Designed to accommodate large-scale testing, it enables individuals to evaluate their visual acuity efficiently within a short period. This system is particularly beneficial in rural or high-demand areas, eliminating the need for a professional to administer each test. Cost-effective and portable, it significantly reduces testing time while maintaining accuracy, making it an ideal solution for mass eye vision screening programs.
Components and supplies
1
16x2 LCD display with I²C interface
7
BC 548
1
Piezo buzzer
7
Resistor 470k Ohm
2
ARDUINO UNO R3
1
433mhz rf transmitter and receiver
1
4X4 MATRIX KEYPAD
Tools and machines
1
Digital Multimeter
1
Wire cutter
1
Soldering Station
1
Wires, etc.
Apps and platforms
1
Arduino IDE 2.0 (beta)
Project description
Code
Transmitter Section Code
This code installed on transmitter Section.
1#include <RH_ASK.h> 2#include <SPI.h> // Not actually used but needed to compile 3 4RH_ASK driver; 5#include <Keypad.h> 6 7const byte ROWS = 4; // Number of rows 8const byte COLS = 4; // Number of columns 9/*char keys[ROWS][COLS] = { 10 {'1','2','3','A'}, 11 {'4','5','6','B'}, 12 {'7','8','9','C'}, 13 {'*','0','#','D'} 14};*/ 15char keys[ROWS][COLS] = { 16 {'V','T','U','A'}, 17 {'M','I','Y','O'}, 18 {'Y','8','9','X'}, 19 {'*','0','#','H'} 20}; 21 22byte rowPins[ROWS] = {9, 8, 7, 6}; // Pins for rows 23byte colPins[COLS] = {5, 4, 3, 2}; // Pins for columns 24 25Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS); 26 27#include <Wire.h> 28#include <LiquidCrystal_I2C.h> 29LiquidCrystal_I2C lcd(0x27,20,4); // set the LCD address to 0x27 for a 16 chars and 2 line display 30const int buzzerPin = 11; // Pin connected to the buzzer 31void Line_Select1(char key) 32{ 33 if(key=='*') 34 { 35 const char *msg = "200"; 36 //int msg1=10; 37 driver.send((uint8_t *)msg, strlen(msg)); 38 // driver.send((int *)msg1, strlen(msg1)); 39 driver.waitPacketSent(); 40 delay(1000); 41 Serial.println("Packet Sent::"); 42 lcd.clear(); 43 lcd.setCursor(0,0); 44 lcd.print("Press*NextLine"); 45 lcd.setCursor(0,1); 46 lcd.print("& Record "); 47 delay(500); 48 49 lcd.clear(); 50 tone(buzzerPin, 1000); // Frequency of 1000 Hz 51 delay(500); 52 noTone(buzzerPin); 53 delay(500); 54 } 55} 56void setup() 57{ 58 Serial.begin(9600); // Debugging only 59 if (!driver.init()) 60 Serial.println("init failed"); 61 62 lcd.init(); 63 // Print a message to the LCD. 64 lcd.backlight(); 65 lcd.setCursor(0,0); 66 lcd.print("Balli Education"); 67 lcd.setCursor(2,1); 68 lcd.print("Eye Testing"); 69 delay(2000); 70 lcd.clear(); 71 lcd.setCursor(0,0); 72 lcd.print("Snellen chart"); 73 pinMode(buzzerPin, OUTPUT); 74} 75int result=0; 76int vision=0; 77const int Tchar=30; 78char Adata[]={'A','O','X','H','V','T','X','A','U','V','O','T','H','X','A','U','M','T','V','H','A','I','X','U','Y'}; 79int line=1; 80char data[Tchar]; 81int counter=0; 82void loop() 83{ 84 lcd.clear(); 85 char key = keypad.getKey(); 86 Line_Select1(key); 87 88 if (key != NO_KEY) { 89 Serial.print("Key pressed: "); 90 Serial.println(key); 91 if(key=='*') 92 { 93 94 } 95 else if(key=='0') 96 { 97 counter=0; 98 vision=0; 99 lcd.clear(); 100 lcd.setCursor(0,0); 101 lcd.print("Reset"); 102 } 103 else 104 { 105 data[counter]=key; 106 counter=counter+1; 107 lcd.setCursor(0,0); 108 lcd.print("Text::"); 109 lcd.setCursor(7,0); 110 lcd.print(key); 111 } 112 113 114 delay(1000);// 115 } 116 if(key=='#') 117 { 118 119 int CChar=0; 120 int MChar=0; 121 vision=0; 122 for(int i=0;i<counter;i++) 123 { 124 Serial.println(data[i]); 125 if(Adata[i]==data[i]) 126 { 127 Serial.println("Correct Data:="); 128 Serial.print(data[i]); 129 CChar=CChar+1; 130 } 131 } 132 133 if(CChar==1) 134 { 135 vision=60; 136 } 137 else if(CChar<=3) 138 { 139 vision=36; 140 } 141 else if(CChar<=6) 142 { 143 vision=24; 144 } 145 else if(CChar<=9) 146 { 147 vision=18; 148 } 149 else if(CChar<=13) 150 { 151 vision=12; 152 } 153 else if(CChar<=18) 154 { 155 vision=9; 156 } 157 else if(CChar<=25) 158 { 159 vision=6; 160 } 161 else 162 { 163 164 } 165 166 Serial.println("TChar Read::"); 167 Serial.println(CChar); 168 Serial.println("Vision ::"); 169 Serial.println(vision); 170 lcd.clear(); 171 lcd.setCursor(0,0); 172 lcd.print("Char::"); 173 lcd.setCursor(8,0); 174 lcd.print(CChar); 175 lcd.setCursor(0,1); 176 lcd.print("Vision::"); 177 lcd.setCursor(9,1); 178 lcd.print(vision); 179 delay(5000); 180 if(vision==6) 181 { 182 lcd.clear(); 183 lcd.setCursor(0,0); 184 lcd.print(vision); 185 lcd.setCursor(2,0); 186 lcd.print("is Good,Protect"); 187 lcd.setCursor(0,1); 188 lcd.print(" Your Eyes"); 189 } 190 else 191 { 192 lcd.clear(); 193 lcd.setCursor(0,0); 194 lcd.print(vision); 195 lcd.setCursor(2,0); 196 lcd.print("is LOW,Consult"); 197 lcd.setCursor(0,1); 198 lcd.print("Eye Specialist"); 199 } 200 counter=0; 201 vision=0; 202 delay(5000); 203 } 204 205}
Receiver Section Code
c
Installed on Snellen Chart MCU
1#include <RH_ASK.h> 2#include <SPI.h> // Not actualy used but needed to compile 3RH_ASK driver; 4const int Line1=2; 5const int Line2=3; 6const int Line3=4; 7const int Line4=5; 8const int Line5=6; 9const int Line6=7; 10const int Line7=8; 11 12void setup() 13{ 14 Serial.begin(9600); // Debugging only 15 if (!driver.init()) 16 { Serial.println("init failed"); } 17 18 pinMode(Line1, OUTPUT); 19 pinMode(Line2, OUTPUT); 20 pinMode(Line3, OUTPUT); 21 pinMode(Line4, OUTPUT); 22 pinMode(Line5, OUTPUT); 23 pinMode(Line6, OUTPUT); 24 pinMode(Line7, OUTPUT); 25 26 digitalWrite(Line1, HIGH); 27 delay(5000); // Wait for 1000 millisecond(s) 28 digitalWrite(Line2, HIGH); 29 delay(5000); // Wait for 1000 millisecond(s) 30 digitalWrite(Line3, HIGH); 31 delay(5000); // Wait for 1000 millisecond(s) 32 digitalWrite(Line4, HIGH); 33 delay(5000); // Wait for 1000 millisecond(s) 34 digitalWrite(Line6, HIGH); 35 delay(5000); // Wait for 1000 millisecond(s) 36 digitalWrite(Line7, HIGH); 37 delay(5000); // Wait for 1000 millisecond(s) 38 delay(5000); 39 digitalWrite(Line5, HIGH); 40 delay(5000); // Wait for 1000 millisecond(s) 41 digitalWrite(Line1, LOW); 42 digitalWrite(Line2, LOW); 43 digitalWrite(Line3, LOW); 44 digitalWrite(Line4, LOW); 45 digitalWrite(Line5, LOW); 46 digitalWrite(Line6, LOW); 47 digitalWrite(Line7, LOW); 48 delay(1000); // Wait for 1000 millisecond(s) 49 50 51 52} 53String str_out; 54int counter=0; 55void loop() 56{ 57 str_out=""; 58 uint8_t buf[12]; 59 char* GLine; 60 uint8_t buflen = sizeof(buf); 61 62 63 64 if (driver.recv(buf, &buflen)) // Non-blocking 65 { 66 int i; 67 str_out = String((char*)buf); 68 str_out = str_out.substring(0, 3); 69 Serial.println((char*)buf); 70 GLine=(char*)buf; 71 72 73 Serial.println(GLine); 74 //if(str_out="000000000001") 75 Serial.println(str_out); 76 if(counter>7) 77 { 78 counter=0; 79 } 80 if(str_out=="200") 81 { 82 counter=counter+1; 83 Serial.println(counter); 84 } 85 86 if(counter==1) 87 { 88 // Serial.println("line1"); 89 digitalWrite(Line1, HIGH); 90 digitalWrite(Line2, LOW); 91 digitalWrite(Line3, LOW); 92 digitalWrite(Line4, LOW); 93 digitalWrite(Line5, LOW); 94 digitalWrite(Line6, LOW); 95 digitalWrite(Line7, LOW); 96 97 } 98 else if(counter==2) 99 { 100 // Serial.println("line1"); 101 digitalWrite(Line1, LOW); 102 digitalWrite(Line2, HIGH); 103 digitalWrite(Line3, LOW); 104 digitalWrite(Line4, LOW); 105 digitalWrite(Line5, LOW); 106 digitalWrite(Line6, LOW); 107 digitalWrite(Line7, LOW); 108 //delay(5000); 109 } 110 else if(counter==3) 111 { 112 // Serial.println("line1"); 113 digitalWrite(Line1, LOW); 114 digitalWrite(Line2, LOW); 115 digitalWrite(Line3, HIGH); 116 digitalWrite(Line4, LOW); 117 digitalWrite(Line5, LOW); 118 digitalWrite(Line6, LOW); 119 digitalWrite(Line7, LOW); 120 //delay(5000); 121 } 122 else if(counter==4) 123 { 124 // Serial.println("line1"); 125 digitalWrite(Line1, LOW); 126 digitalWrite(Line2, LOW); 127 digitalWrite(Line3, LOW); 128 digitalWrite(Line4, HIGH); 129 digitalWrite(Line5, LOW); 130 digitalWrite(Line6, LOW); 131 digitalWrite(Line7, LOW); 132 //delay(5000); 133 } 134 else if(counter==5) 135 { 136 // Serial.println("line1"); 137 digitalWrite(Line1, LOW); 138 digitalWrite(Line2, LOW); 139 digitalWrite(Line3, LOW); 140 digitalWrite(Line4, LOW); 141 digitalWrite(Line6, HIGH); 142 digitalWrite(Line7, LOW); 143 digitalWrite(Line5, LOW); 144 //delay(5000); 145 } 146 147else if(counter==6) 148 { 149 // Serial.println("line1"); 150 digitalWrite(Line1, LOW); 151 digitalWrite(Line2, LOW); 152 digitalWrite(Line3, LOW); 153 digitalWrite(Line4, LOW); 154 digitalWrite(Line6, LOW); 155 digitalWrite(Line7, HIGH); 156 digitalWrite(Line5, LOW); 157 //delay(5000); 158 } 159else if(counter==7) 160 { 161 // Serial.println("line1"); 162 digitalWrite(Line1, LOW); 163 digitalWrite(Line2, LOW); 164 digitalWrite(Line3, LOW); 165 digitalWrite(Line4, LOW); 166 digitalWrite(Line6, LOW); 167 digitalWrite(Line7, LOW); 168 digitalWrite(Line5, HIGH); 169 //delay(5000); 170 } 171 else 172 { 173 digitalWrite(Line1, HIGH); 174 digitalWrite(Line2, LOW); 175 digitalWrite(Line3, LOW); 176 digitalWrite(Line4, LOW); 177 digitalWrite(Line5, LOW); 178 digitalWrite(Line6, LOW); 179 digitalWrite(Line7, LOW); 180 } 181 } 182 183delay(2000); 184}
Comments
Only logged in users can leave comments