test

Dependencies:   DS3231 RHT03 TextLCD mbed

Fork of HomeStatus by Jennares Yutthaseree

Committer:
poomyuttt
Date:
Tue May 26 15:46:01 2015 +0000
Revision:
2:dad081eaee81
Parent:
1:ae97d85a47dd
Child:
3:19accdf325fe
kj

Who changed what in which revision?

UserRevisionLine numberNew contents of line
poomyuttt 0:894306d5cad7 1 #include "mbed.h"
poomyuttt 0:894306d5cad7 2 #include "TextLCD.h"
poomyuttt 0:894306d5cad7 3 #include "DS3231.h"
poomyuttt 0:894306d5cad7 4 #include "RHT03.h"
poomyuttt 0:894306d5cad7 5 I2C i2c(D14,D15);
poomyuttt 0:894306d5cad7 6 TextLCD_I2C lcd(&i2c,0x4E,TextLCD::LCD16x2);
poomyuttt 0:894306d5cad7 7 DS3231 rtc(D14,D15);
poomyuttt 0:894306d5cad7 8 RHT03 rht(D13);
fookies 1:ae97d85a47dd 9 DigitalOut p1(D3),p2(D4),p3(D5),p4(D6),p5(D7),p6(D9),p7(D10),p8(D11);
poomyuttt 2:dad081eaee81 10 Serial esp(D8, D2); // tx, rx
poomyuttt 2:dad081eaee81 11 Serial pc(USBTX, USBRX); // tx, rx
poomyuttt 2:dad081eaee81 12
poomyuttt 2:dad081eaee81 13
poomyuttt 2:dad081eaee81 14 int bufflen, DataRX, count, getcount, replycount, servreq, timeout;
poomyuttt 2:dad081eaee81 15 int bufl, ipdLen, linkID, weberror, webcounter;
poomyuttt 2:dad081eaee81 16 float Temp,Hum;
poomyuttt 2:dad081eaee81 17 int dw,d,M,y,h,m,s;
poomyuttt 2:dad081eaee81 18 char webcount[8];
poomyuttt 2:dad081eaee81 19 char lasthit[30];
poomyuttt 2:dad081eaee81 20 char timebuf[30];
poomyuttt 2:dad081eaee81 21 char type[16];
poomyuttt 2:dad081eaee81 22 char type1[16];
poomyuttt 2:dad081eaee81 23 char channel[2];
poomyuttt 2:dad081eaee81 24 char cmdbuff[32];
poomyuttt 2:dad081eaee81 25 char replybuff[512];
poomyuttt 2:dad081eaee81 26 char webdata[1024]; // This may need to be bigger depending on WEB browser used
poomyuttt 2:dad081eaee81 27 char webbuff[4096]; // Currently using 1986 characters, Increase this if more web page data added
poomyuttt 2:dad081eaee81 28 Timer t1;
poomyuttt 2:dad081eaee81 29 Timer t2;
poomyuttt 2:dad081eaee81 30
poomyuttt 2:dad081eaee81 31 void sendpage();
poomyuttt 2:dad081eaee81 32 void ReadWebData();
poomyuttt 2:dad081eaee81 33 void SendCMD(),getreply(),ReadWebData(),startserver(),sendpage(),SendWEB(),sendcheck();
poomyuttt 2:dad081eaee81 34
poomyuttt 2:dad081eaee81 35 // Serial Interrupt read ESP data
poomyuttt 2:dad081eaee81 36 void callback() {
poomyuttt 2:dad081eaee81 37 while (esp.readable()) {webbuff[count] = esp.getc();count++;}
poomyuttt 2:dad081eaee81 38 if(strlen(webbuff)>bufflen){DataRX=1;}
poomyuttt 2:dad081eaee81 39 }
poomyuttt 2:dad081eaee81 40
poomyuttt 2:dad081eaee81 41
poomyuttt 2:dad081eaee81 42
poomyuttt 2:dad081eaee81 43
poomyuttt 0:894306d5cad7 44
poomyuttt 0:894306d5cad7 45 int main()
poomyuttt 0:894306d5cad7 46 {
poomyuttt 0:894306d5cad7 47 lcd.setMode(TextLCD::DispOn);
poomyuttt 0:894306d5cad7 48 lcd.setBacklight(TextLCD::LightOff);
poomyuttt 0:894306d5cad7 49 lcd.setCursor(TextLCD::CurOff_BlkOff);
poomyuttt 0:894306d5cad7 50 //rtc.setTime(20,58,00);
poomyuttt 0:894306d5cad7 51 //rtc.setDate(5,22,5,2015);
poomyuttt 0:894306d5cad7 52 while(1)
poomyuttt 0:894306d5cad7 53 {
poomyuttt 0:894306d5cad7 54 rtc.readDateTime(&dw,&d,&M,&y,&h,&m,&s);
poomyuttt 0:894306d5cad7 55 rht.readData();
poomyuttt 0:894306d5cad7 56 Temp=rht.getTemperatureC();
poomyuttt 0:894306d5cad7 57 Hum=rht.getHumidity();
poomyuttt 0:894306d5cad7 58 lcd.cls();
poomyuttt 0:894306d5cad7 59 lcd.setAddress(0,0);
poomyuttt 0:894306d5cad7 60 lcd.printf("%02d/%02d/%4d",d,M,y);
poomyuttt 0:894306d5cad7 61 lcd.setAddress(0,1);
poomyuttt 0:894306d5cad7 62 lcd.printf("%02d:%02d:%02d",h,m,s);
poomyuttt 0:894306d5cad7 63
poomyuttt 0:894306d5cad7 64 wait(3);
poomyuttt 0:894306d5cad7 65 lcd.cls();
poomyuttt 0:894306d5cad7 66 lcd.setAddress(0,0);
poomyuttt 0:894306d5cad7 67 lcd.printf("Temp:%.1f",Temp);
poomyuttt 0:894306d5cad7 68 lcd.setAddress(0,1);
poomyuttt 0:894306d5cad7 69 lcd.printf("Hum:%.1f",Hum);
poomyuttt 0:894306d5cad7 70 wait(3);
poomyuttt 0:894306d5cad7 71
fookies 1:ae97d85a47dd 72 lcd.cls();
fookies 1:ae97d85a47dd 73 lcd.setAddress(0,0);
fookies 1:ae97d85a47dd 74 lcd.printf("Port1:%3s Port2:%3s",(p1==1)?"On":"Off",(p2==1)?"On":"Off");
fookies 1:ae97d85a47dd 75 lcd.setAddress(0,1);
fookies 1:ae97d85a47dd 76 lcd.printf("Port3:%3s Port4:%3s",(p3==1)?"On":"Off",(p4==1)?"On":"Off");
fookies 1:ae97d85a47dd 77 wait(3);
fookies 1:ae97d85a47dd 78
fookies 1:ae97d85a47dd 79 lcd.cls();
fookies 1:ae97d85a47dd 80 lcd.setAddress(0,0);
fookies 1:ae97d85a47dd 81 lcd.printf("Port5:%3s Port6:%3s",(p5==1)?"On":"Off",(p6==1)?"On":"Off");
fookies 1:ae97d85a47dd 82 lcd.setAddress(0,1);
fookies 1:ae97d85a47dd 83 lcd.printf("Port7:%3s Port8:%3s",(p7==1)?"On":"Off",(p8==1)?"On":"Off");
fookies 1:ae97d85a47dd 84 wait(3);
poomyuttt 2:dad081eaee81 85
poomyuttt 2:dad081eaee81 86 if(DataRX==1){
poomyuttt 2:dad081eaee81 87 ReadWebData();
poomyuttt 2:dad081eaee81 88 if (servreq == 1 && weberror == 0){sendpage();}
poomyuttt 2:dad081eaee81 89 esp.attach(&callback);
poomyuttt 2:dad081eaee81 90 pc.printf(" IPD Data:\r\n\n Link ID = %d,\r\n IPD Header Length = %d \r\n IPD Type = %s\r\n", linkID, ipdLen, type);
poomyuttt 2:dad081eaee81 91 pc.printf("\n\n HTTP Packet: \n\n%s\n", webdata);
poomyuttt 2:dad081eaee81 92 pc.printf(" Web Characters sent : %d\n\n", bufl);
poomyuttt 2:dad081eaee81 93 pc.printf(" -------------------------------------\n\n");
poomyuttt 2:dad081eaee81 94 strcpy(lasthit, timebuf);
poomyuttt 2:dad081eaee81 95 servreq=0;
poomyuttt 2:dad081eaee81 96 }
poomyuttt 0:894306d5cad7 97 }
poomyuttt 0:894306d5cad7 98
poomyuttt 0:894306d5cad7 99
poomyuttt 0:894306d5cad7 100 return 0;
poomyuttt 0:894306d5cad7 101
poomyuttt 0:894306d5cad7 102 }
poomyuttt 2:dad081eaee81 103
poomyuttt 2:dad081eaee81 104 void sendpage()
poomyuttt 2:dad081eaee81 105 {
poomyuttt 2:dad081eaee81 106 char t1[1000];
poomyuttt 2:dad081eaee81 107
poomyuttt 2:dad081eaee81 108 // WEB page data
poomyuttt 2:dad081eaee81 109 strcpy(webbuff, "<!DOCTYPE html>");
poomyuttt 2:dad081eaee81 110 strcat(webbuff, "<html><head><title>Home Status</title></head>");
poomyuttt 2:dad081eaee81 111 strcat(webbuff, "<body>");
poomyuttt 2:dad081eaee81 112 strcat(webbuff, "<p>");
poomyuttt 2:dad081eaee81 113 sprintf(t1,"%02d/%02d/%4d %02d:%02d:%02d",d,M,y,h,m,s);
poomyuttt 2:dad081eaee81 114 strcat(webbuff,t1);
poomyuttt 2:dad081eaee81 115 strcat(webbuff, "<p>");
poomyuttt 2:dad081eaee81 116 strcat(webbuff,"<p>Temperature : ");
poomyuttt 2:dad081eaee81 117 sprintf(t1,"%.1f",Temp);
poomyuttt 2:dad081eaee81 118 strcat(webbuff,t1);
poomyuttt 2:dad081eaee81 119 strcat(webbuff, " C<p>");
poomyuttt 2:dad081eaee81 120 strcat(webbuff,"<p>Humidity : ");
poomyuttt 2:dad081eaee81 121 sprintf(t1,"%.1f",Hum);
poomyuttt 2:dad081eaee81 122 strcat(webbuff,t1);
poomyuttt 2:dad081eaee81 123 strcat(webbuff, " %<p>");
poomyuttt 2:dad081eaee81 124 strcat(webbuff, "<table>");
poomyuttt 2:dad081eaee81 125 strcat(webbuff, "<tr>");
poomyuttt 2:dad081eaee81 126 strcat(webbuff, "<td>Light 1 :</td><td>");
poomyuttt 2:dad081eaee81 127 if(p1==1)
poomyuttt 2:dad081eaee81 128 {
poomyuttt 2:dad081eaee81 129 strcat(webbuff, "<form action=\"Light1:OFF\"><input type=\"submit\" value=\"ON\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 130 }else{
poomyuttt 2:dad081eaee81 131 strcat(webbuff, "<form action=\"Light1:ON\"><input type=\"submit\" value=\"OFF\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 132 }
poomyuttt 2:dad081eaee81 133 strcat(webbuff, "<tr>");
poomyuttt 2:dad081eaee81 134 strcat(webbuff, "<td>Light 2 :</td><td>");
poomyuttt 2:dad081eaee81 135 if(p2==1)
poomyuttt 2:dad081eaee81 136 {
poomyuttt 2:dad081eaee81 137 strcat(webbuff, "<form action=\"Light2:OFF\"><input type=\"submit\" value=\"ON\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 138 }else{
poomyuttt 2:dad081eaee81 139 strcat(webbuff, "<form action=\"Light2:ON\"><input type=\"submit\" value=\"OFF\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 140 }
poomyuttt 2:dad081eaee81 141 strcat(webbuff, "<tr>");
poomyuttt 2:dad081eaee81 142 strcat(webbuff, "<td>Light 2 :</td><td>");
poomyuttt 2:dad081eaee81 143 if(p3==1)
poomyuttt 2:dad081eaee81 144 {
poomyuttt 2:dad081eaee81 145 strcat(webbuff, "<form action=\"Light3:OFF\"><input type=\"submit\" value=\"ON\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 146 }else{
poomyuttt 2:dad081eaee81 147 strcat(webbuff, "<form action=\"Light3:ON\"><input type=\"submit\" value=\"OFF\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 148 }strcat(webbuff, "<tr>");
poomyuttt 2:dad081eaee81 149 strcat(webbuff, "<td>Light 2 :</td><td>");
poomyuttt 2:dad081eaee81 150 if(p4==1)
poomyuttt 2:dad081eaee81 151 {
poomyuttt 2:dad081eaee81 152 strcat(webbuff, "<form action=\"Light4:OFF\"><input type=\"submit\" value=\"ON\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 153 }else{
poomyuttt 2:dad081eaee81 154 strcat(webbuff, "<form action=\"Light4:ON\"><input type=\"submit\" value=\"OFF\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 155 }strcat(webbuff, "<tr>");
poomyuttt 2:dad081eaee81 156 strcat(webbuff, "<td>Light 2 :</td><td>");
poomyuttt 2:dad081eaee81 157 if(p5==1)
poomyuttt 2:dad081eaee81 158 {
poomyuttt 2:dad081eaee81 159 strcat(webbuff, "<form action=\"Light5:OFF\"><input type=\"submit\" value=\"ON\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 160 }else{
poomyuttt 2:dad081eaee81 161 strcat(webbuff, "<form action=\"Light5:ON\"><input type=\"submit\" value=\"OFF\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 162 }strcat(webbuff, "<tr>");
poomyuttt 2:dad081eaee81 163 strcat(webbuff, "<td>Light 2 :</td><td>");
poomyuttt 2:dad081eaee81 164 if(p6==1)
poomyuttt 2:dad081eaee81 165 {
poomyuttt 2:dad081eaee81 166 strcat(webbuff, "<form action=\"Light6:OFF\"><input type=\"submit\" value=\"ON\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 167 }else{
poomyuttt 2:dad081eaee81 168 strcat(webbuff, "<form action=\"Light6:ON\"><input type=\"submit\" value=\"OFF\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 169 }strcat(webbuff, "<tr>");
poomyuttt 2:dad081eaee81 170 strcat(webbuff, "<td>Light 2 :</td><td>");
poomyuttt 2:dad081eaee81 171 if(p7==1)
poomyuttt 2:dad081eaee81 172 {
poomyuttt 2:dad081eaee81 173 strcat(webbuff, "<form action=\"Light7:OFF\"><input type=\"submit\" value=\"ON\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 174 }else{
poomyuttt 2:dad081eaee81 175 strcat(webbuff, "<form action=\"Light7:ON\"><input type=\"submit\" value=\"OFF\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 176 }strcat(webbuff, "<tr>");
poomyuttt 2:dad081eaee81 177 strcat(webbuff, "<td>Light 2 :</td><td>");
poomyuttt 2:dad081eaee81 178 if(p8==1)
poomyuttt 2:dad081eaee81 179 {
poomyuttt 2:dad081eaee81 180 strcat(webbuff, "<form action=\"Light8:OFF\"><input type=\"submit\" value=\"ON\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 181 }else{
poomyuttt 2:dad081eaee81 182 strcat(webbuff, "<form action=\"Light8:ON\"><input type=\"submit\" value=\"OFF\" /></form></td></tr>");
poomyuttt 2:dad081eaee81 183 }
poomyuttt 2:dad081eaee81 184
poomyuttt 2:dad081eaee81 185
poomyuttt 2:dad081eaee81 186
poomyuttt 2:dad081eaee81 187
poomyuttt 2:dad081eaee81 188 strcat(webbuff, "</table></p></body></html>");
poomyuttt 2:dad081eaee81 189 // end of WEB page data
poomyuttt 2:dad081eaee81 190 bufl = strlen(webbuff); // get total page buffer length
poomyuttt 2:dad081eaee81 191 sprintf(cmdbuff,"AT+CIPSEND=%d,%d\r\n", linkID, bufl); // send IPD link channel and buffer character length.
poomyuttt 2:dad081eaee81 192 timeout=200;getcount=7;
poomyuttt 2:dad081eaee81 193 SendCMD();
poomyuttt 2:dad081eaee81 194 getreply();
poomyuttt 2:dad081eaee81 195 SendWEB(); // send web page
poomyuttt 2:dad081eaee81 196 memset(webbuff, '\0', sizeof(webbuff));
poomyuttt 2:dad081eaee81 197 sendcheck();
poomyuttt 2:dad081eaee81 198 }
poomyuttt 2:dad081eaee81 199 void ReadWebData()
poomyuttt 2:dad081eaee81 200 {
poomyuttt 2:dad081eaee81 201 wait_ms(200);
poomyuttt 2:dad081eaee81 202 esp.attach(NULL);
poomyuttt 2:dad081eaee81 203 count=0;DataRX=0;weberror=0;
poomyuttt 2:dad081eaee81 204 memset(webdata, '\0', sizeof(webdata));
poomyuttt 2:dad081eaee81 205 int x = strcspn (webbuff,"+");
poomyuttt 2:dad081eaee81 206 if(x){
poomyuttt 2:dad081eaee81 207 strcpy(webdata, webbuff + x);weberror=0;
poomyuttt 2:dad081eaee81 208 int numMatched = sscanf(webdata,"+IPD,%d,%d:%s", &linkID, &ipdLen, type);
poomyuttt 2:dad081eaee81 209
poomyuttt 2:dad081eaee81 210 if( strstr(webdata, "Light1:OFF") != NULL ) {p1=0;}
poomyuttt 2:dad081eaee81 211 if( strstr(webdata, "Light1:ON") != NULL ) {p1=1;}
poomyuttt 2:dad081eaee81 212 if( strstr(webdata, "Light2:OFF") != NULL ) {p2=0;}
poomyuttt 2:dad081eaee81 213 if( strstr(webdata, "Light2:ON") != NULL ) {p2=1;}
poomyuttt 2:dad081eaee81 214 if( strstr(webdata, "Light3:OFF") != NULL ) {p3=0;}
poomyuttt 2:dad081eaee81 215 if( strstr(webdata, "Light3:ON") != NULL ) {p3=1;}
poomyuttt 2:dad081eaee81 216 if( strstr(webdata, "Light4:OFF") != NULL ) {p4=0;}
poomyuttt 2:dad081eaee81 217 if( strstr(webdata, "Light4:ON") != NULL ) {p4=1;}
poomyuttt 2:dad081eaee81 218 if( strstr(webdata, "Light5:OFF") != NULL ) {p5=0;}
poomyuttt 2:dad081eaee81 219 if( strstr(webdata, "Light5:ON") != NULL ) {p5=1;}
poomyuttt 2:dad081eaee81 220 if( strstr(webdata, "Light6:OFF") != NULL ) {p6=0;}
poomyuttt 2:dad081eaee81 221 if( strstr(webdata, "Light6:ON") != NULL ) {p6=1;}
poomyuttt 2:dad081eaee81 222 if( strstr(webdata, "Light7:OFF") != NULL ) {p7=0;}
poomyuttt 2:dad081eaee81 223 if( strstr(webdata, "Light7:ON") != NULL ) {p7=1;}
poomyuttt 2:dad081eaee81 224 if( strstr(webdata, "Light8:OFF") != NULL ) {p8=0;}
poomyuttt 2:dad081eaee81 225 if( strstr(webdata, "Light8:ON") != NULL ) {p8=1;}
poomyuttt 2:dad081eaee81 226
poomyuttt 2:dad081eaee81 227 sprintf(channel, "%d",linkID);
poomyuttt 2:dad081eaee81 228 if (strstr(webdata, "GET") != NULL) {servreq=1;}
poomyuttt 2:dad081eaee81 229 if (strstr(webdata, "POST") != NULL) {servreq=1;}
poomyuttt 2:dad081eaee81 230 webcounter++;
poomyuttt 2:dad081eaee81 231 sprintf(webcount, "%d",webcounter);
poomyuttt 2:dad081eaee81 232 }
poomyuttt 2:dad081eaee81 233 else {
poomyuttt 2:dad081eaee81 234 memset(webbuff, '\0', sizeof(webbuff));
poomyuttt 2:dad081eaee81 235 esp.attach(&callback);weberror=1;
poomyuttt 2:dad081eaee81 236 }
poomyuttt 2:dad081eaee81 237 }
poomyuttt 2:dad081eaee81 238 // ESP Command data send
poomyuttt 2:dad081eaee81 239 void SendCMD()
poomyuttt 2:dad081eaee81 240 {
poomyuttt 2:dad081eaee81 241 esp.printf("%s", cmdbuff);
poomyuttt 2:dad081eaee81 242 }
poomyuttt 2:dad081eaee81 243 // Get Cammand and ESP status replies
poomyuttt 2:dad081eaee81 244 void getreply()
poomyuttt 2:dad081eaee81 245 {
poomyuttt 2:dad081eaee81 246 memset(replybuff, '\0', sizeof(replybuff));
poomyuttt 2:dad081eaee81 247 t1.reset(); t1.start();replycount=0;
poomyuttt 2:dad081eaee81 248 while(t1.read_ms()< timeout && replycount < getcount) {
poomyuttt 2:dad081eaee81 249 if(esp.readable()) {
poomyuttt 2:dad081eaee81 250 replybuff[replycount] = esp.getc();replycount++;
poomyuttt 2:dad081eaee81 251 }
poomyuttt 2:dad081eaee81 252 }
poomyuttt 2:dad081eaee81 253 t1.stop();
poomyuttt 2:dad081eaee81 254 }
poomyuttt 2:dad081eaee81 255 // Large WEB buffer data send
poomyuttt 2:dad081eaee81 256 void SendWEB()
poomyuttt 2:dad081eaee81 257 {
poomyuttt 2:dad081eaee81 258 int i=0;
poomyuttt 2:dad081eaee81 259 if(esp.writeable()) {
poomyuttt 2:dad081eaee81 260 while(webbuff[i]!='\0') {esp.putc(webbuff[i]);i++;}
poomyuttt 2:dad081eaee81 261 }
poomyuttt 2:dad081eaee81 262 }
poomyuttt 2:dad081eaee81 263 // wait for ESP "SEND OK" reply, then close IP to load web page
poomyuttt 2:dad081eaee81 264 void sendcheck()
poomyuttt 2:dad081eaee81 265 {
poomyuttt 2:dad081eaee81 266 weberror=1;timeout=500;getcount=24;
poomyuttt 2:dad081eaee81 267 t2.reset();t2.start();
poomyuttt 2:dad081eaee81 268 while(weberror==1 && t2.read() <5){
poomyuttt 2:dad081eaee81 269 getreply();
poomyuttt 2:dad081eaee81 270 if (strstr(replybuff, "SEND OK") != NULL) {weberror=0;} // wait for valid SEND OK
poomyuttt 2:dad081eaee81 271 }
poomyuttt 2:dad081eaee81 272 if(weberror==1){ // restart connection
poomyuttt 2:dad081eaee81 273 strcpy(cmdbuff, "AT+CIPMUX=1\r\n");
poomyuttt 2:dad081eaee81 274 timeout=500;getcount=10;
poomyuttt 2:dad081eaee81 275 SendCMD();getreply();
poomyuttt 2:dad081eaee81 276 sprintf(cmdbuff,"AT+CIPSERVER=1,%d\r\n", 80);
poomyuttt 2:dad081eaee81 277 timeout=500;getcount=10;
poomyuttt 2:dad081eaee81 278 SendCMD();getreply();
poomyuttt 2:dad081eaee81 279 }
poomyuttt 2:dad081eaee81 280 else{
poomyuttt 2:dad081eaee81 281 sprintf(cmdbuff, "AT+CIPCLOSE=%s\r\n",channel); // close current connection
poomyuttt 2:dad081eaee81 282 SendCMD();}
poomyuttt 2:dad081eaee81 283 t2.reset();
poomyuttt 2:dad081eaee81 284 }