Arduino dans un lave-auto Partie 2.5 (code source, sans images)

Sur demande, je poste l'intégralité du code source du lave-auto sur arduino.

Pour une description, voir Arduino dans un lave-auto et Arduino dans un lave-auto, partie 2 .

UPD:
Sous kat uniquement le code source. Il est destiné uniquement à ceux qui sont intéressés à communiquer avec Arduino et un accepteur de factures comme CashCode via le protocole CCNet. Au fait, ne perdez pas votre temps en vain.

#include <SPI.h> #include <Ethernet.h> #include <SoftwareSerial.h> //#include <MFRC522.h> #include <EEPROM.h> #include <string.h> //#include <avr/wdt.h> //#include "ICMPPing.h" #define POLYNOMIAL 0x08408 uint8_t reset[] = {0x02, 0x03, 0x06, 0x30, 0x41, 0xB3}; uint8_t ack[] = {0x02, 0x03, 0x06, 0x00, 0x0C2, 0x82}; uint8_t poll[] = {0x02, 0x03, 0x06, 0x33, 0xDA, 0x81}; uint8_t enable[]={0x02, 0x03, 0x0C, 0x34, 0, 0, 0x7C, 0, 0, 0, 0x66, 0xC1}; /* uint8_t stack[] = {0x02, 0x03, 0x06, 0x35, 0xEC, 0xE4}; uint8_t sec[] = {0x02, 0x03, 0x09, 0x32, 0x00, 0x00, 0x00, 0x26, 0x1F}; uint8_t GetSt[]={0x02, 0x03, 0x06, 0x31, 0xC8, 0xA2}; uint8_t Ident[]={0x02, 0x03, 0x06, 0x37, 0xFE, 0xC7}; uint8_t GetBT[]={0x02, 0x03, 0x06, 0x41, 0x4F, 0xD1}; uint8_t Return[]={0x02, 0x03, 0x06, 0x36, 0x77, 0xD6}; uint8_t Hold[]={0x02, 0x03, 0x06, 0x38, 0x09, 0x3F}; uint8_t ExtBD[]={0x02, 0x03, 0x06, 0x3A, 0x1B, 0x1C}; uint8_t ReqSt[]={0x02, 0x03, 0x06, 0x60, 0xC4, 0xE1}; uint8_t DiBT[]={0x02, 0x03, 0x0C, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x0C};*/ #define max7219_reg_decodeMode 0x09 #define max7219_reg_intensity 0x0a #define max7219_reg_scanLimit 0x0b #define max7219_reg_shutdown 0x0c #define max7219_reg_displayTest 0x0f const unsigned char alf[] = {0, 28, 34, 34, 34, 34, 34, 34, 28, // 0 8, 24, 8, 8, 8, 8, 8, 28,// 1 28, 34, 2, 4, 8, 16, 32, 62, // 2 28, 34, 2, 4, 2, 2, 34, 28, //3 34, 34, 34, 34, 62, 2, 2, 2, 62, 32, 32, 60, 2, 2, 2, 60, 28, 32, 32, 60, 34, 34, 34, 28, 62, 2, 2, 4, 8, 16, 32, 32, 28, 34, 34, 28, 34, 34, 34, 28, 28, 34, 34, 30, 2, 2, 2, 28 }; #define DIN 16 #define CS 17 #define CLK 18 //#define RST_PIN 8 //#define SS_PIN 9 //MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522 instance MISO 12, MOSI 11, SCK 13 //byte admin_key[][4] = { { 0x99, 0x3C, 0x16, 0xDB }, { 0x16, 0x95, 0x59, 0x7B }, { 0x46, 0x93, 0xF1, 0x74 }, { 0x03, 0x1F, 0x17, 0xDB }}; void(* resetFunc) (void) = 0; SoftwareSerial mySerial(14, 15); // RX, TX byte system100[]={92, 53, 96, 34}; //IPAddress pingAddr(192,168,1,1); //  DNS //SOCKET pingSocket = 0; //int timePing = 0; //int pingFAIL = 0; //   //ICMPPing ping(pingSocket, (uint16_t)random(0, 255)); //EthernetClient client; EthernetServer server(80); char SAM; //  unsigned long timeCount=0; bool waitACK=0; char count=0; char LNG=6; uint8_t c; uint8_t z1=0; uint8_t z2=0; uint8_t old=1; char rele=0; char rOld=0; bool keydown=0; unsigned long timeAllRele=1000; unsigned long timeRele=0; unsigned long lightOff=0; unsigned long sendPoll=0; char posPay; //  char posErr; //  char clientline[100]; unsigned long resetTime; void setup() { //wdt_enable(WDTO_8S); //delay(2000); //if(EEPROM.read(30)==1) { EEPROM.write(30, 0); resetFunc(); } //EEPROM.write(30, 1); pinMode(DIN,OUTPUT); pinMode(CS,OUTPUT); pinMode(CLK,OUTPUT); digitalWrite(CS, HIGH); initLed(); pinMode(2, OUTPUT); pinMode(3, OUTPUT); pinMode(4, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); digitalWrite(7, HIGH); // pinMode (A5, INPUT); // if(EEPROM.read(10)==255 && EEPROM.read(11)==255) { EEPROM.write(10, 0); EEPROM.write(11, 0); } //      posPay=EEPROM.read(99); if(posPay<0 || posPay>99) { EEPROM.write(99, 0); posPay=0; } posErr=EEPROM.read(199); if(posErr<0 || posErr>99) { EEPROM.write(199, 0); posErr=0; } SAM=EEPROM.read(0); Serial.begin(9600); Serial.print(SAM, DEC); Serial.print(" "); Serial.print(posPay, DEC); Serial.print(" "); Serial.print(posErr, DEC);Serial.println(" begin"); byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED-SAM }; //byte gate[]={192, 168, 1, 1}; //byte mask[]={255,255,255,0}; IPAddress ip(192, 168, 1, 100+SAM); Ethernet.begin(mac, ip);//, gate, gate, mask server.begin(); delay(200); Serial.print("server is at "); Serial.println(Ethernet.localIP()); mySerial.begin(9600); delay(200); rOld=EEPROM.read(9); if(rOld<0 || rOld>8) EEPROM.write(9, 0); //  else setRele(rOld); resetTime=millis(); // mfrc522.PCD_Init();// Init MFRC522 } void loop() { //if(millis()-resetTime>600000) resetFunc(); //  10  if(millis()-sendPoll>200) { sendCCNET(poll);} //   //wdt_reset();   /*if (Serial.available()) { char s=Serial.read(); //int pay=Serial.parseInt(); if(s=='0') { Serial.print("RESET"); sendCCNET(reset); waitACK=1; count=0; } if(s=='1') { printNumber(100); EEPROM.write(100+posPay, 4); posPay++; EEPROM.write(99, posPay); } if(s=='3') { sendInfo(); } } if(millis()-timePing>10000) { timePing=millis(); ICMPEchoReply echoReply = ping(pingAddr, 2); if (echoReply.status == SUCCESS) pingFAIL=0; else { Serial.println("pingFAIL"); if(++pingFAIL>3) resetFunc(); } //initLed(); }*/ int key = analogRead (5); //Serial.println(key); if(keydown && key<20) keydown=0; if(key>300 && key<315 && !keydown) setRele(6); // if(key>330 && key<400 && !keydown) setRele(0);// if(!keydown && rele==0 && (EEPROM.read(10)>0 || EEPROM.read(11)>0)) { if(key>920 && key<980) setRele(1); if(key>810 && key<870) setRele(2); if(key>720 && key<780) setRele(3); if(key>600 && key<640) setRele(4); if(key>420 && key<480) setRele(5); } if(rele>0 && rele<=5 && (millis()-timeRele)>timeAllRele) { if(printNumber(-1)==0) setRele(0); timeRele+=timeAllRele; } if(lightOff>0 && (millis()-lightOff)>10000) { digitalWrite(7, HIGH); lightOff=0; } // for (int sock = 0; sock < MAX_SOCK_NUM; sock++) { EthernetClient sclient = server.available_(sock); if (sclient) myserver(sclient); //serverWorks2(sclient); } delay(30); // Look for new cards // if ( mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); } void sendCCNET(uint8_t *com) { for(char i=0; i<com[2]; i++) mySerial.write(com[i]); if(com[3]!=0) { waitACK=1; count=0; sendPoll=millis(); } while(waitACK) { if(millis()-sendPoll>300) waitACK=0; // .    if(mySerial.available()) { c=mySerial.read(); if(count==2) LNG=c; if(count==3) z1=c; if(count==4) z2=c; count++; } if(count<LNG) continue; waitACK=0; if(z1>0 && z1<255) sendCCNET(ack); if(z1==0x10 || z1==0x11 || z1==0x12) { sendCCNET(reset); } //Serial.print("POWER UP RESET "); if(z1==0x19) { sendCCNET(enable); } //Serial.print("DISABLED ENABLE "); if(z1==70) { sendCCNET(reset); } //Serial.print("PAUSE RESET "); if(old!=z1) { /*Serial.print(z1, HEX); Serial.print(" "); Serial.println(z2, HEX); if(z1==0x14) Serial.println("IDLING"); if(z1==0x00) Serial.println("ACK"); if(z1==0xFF) Serial.println("NAK"); if(z1==0x13) Serial.println("INIT"); if(z1==0x15) Serial.println("ACCEPTING"); if(z1==0x17) Serial.println("STACKING"); if(z1==0x30) Serial.println("INVALID COMMAND"); if(z1==0x41) Serial.println("DROP CASSETTE FULL"); if(z1==0x44) Serial.println("JAM IN STACKER"); if(z1==0x42) Serial.println("DROP CASSETTE REMOVED"); if(z1==0x47) { Serial.print("Generic Failure codes "); Serial.println(z2, HEX); sendInfo("err", String(z2)); } if(z1==0x1C) { Serial.print("Generic rejecting code "); Serial.println(z2, HEX); sendInfo("err", String(z2)); } */ if(z1>0x20 && z1<0x81 && posErr<100) { EEPROM.write(200+posErr, z1==0x47 || z1==0x1C ? z2 : z1); posErr++; EEPROM.write(199, posErr); } // sendInfo("err", String(z1)); } old=z1; if(z1==0x81) { Serial.print("PACKED, STACKED."); Serial.println(z2); int pay=0; if(z2==2) pay=10; if(z2==3) pay=50; if(z2==4) pay=100; if(z2==5) pay=500; if(z2==6) pay=1000; if(z2==7) pay=5000; if(pay>0) { printNumber(pay); if(posPay<100) { EEPROM.write(100+posPay, z2); posPay++; EEPROM.write(99, posPay);} z2=0; } } } } void setRele(char r) { if(r && r!=rOld) { rOld=r; delay(30); return; } // rele=r; keydown=1; for(char i=1;i<6;i++) digitalWrite(i+1, HIGH); if(r==6) r=1; // if(r) { digitalWrite(r+1, LOW); timeRele=millis(); timeAllRele=60000/EEPROM.read(r); } EEPROM.write(9, r); delay(20); initLed(); if(r==0 && (posPay>5 || posErr>5)) sendInfo(); } void setCommand(byte command, byte value) { digitalWrite(CS, LOW); for (int i=0; i<4; i++) { shiftOut(DIN,CLK, MSBFIRST, command); shiftOut(DIN,CLK, MSBFIRST, value); } digitalWrite(CS, HIGH); } void initLed() { setCommand(max7219_reg_scanLimit, 0x07); setCommand(max7219_reg_decodeMode, 0x00); // using an led matrix (not digits) setCommand(max7219_reg_shutdown, 0x01); // not in shutdown mode setCommand(max7219_reg_displayTest, 0x00); // no display test setCommand(max7219_reg_intensity, 1); int n=printNumber(0); } int printNumber(int add) { int n=EEPROM.read(10)+EEPROM.read(11)*256; if(add!=0) { n+=add; EEPROM.write(10, n%256); EEPROM.write(11, n>>8); } int k; for (char i=1; i<=8; i++) { digitalWrite(CS, LOW); for (char j=3; j>=0; j--) { k=n/pow(10,j); shiftOut(DIN,CLK, MSBFIRST,i); shiftOut(DIN,CLK, MSBFIRST,alf[i+(k%10)*8]); } digitalWrite(CS, HIGH); } if(n>0) { digitalWrite(7, LOW); lightOff=0; } else lightOff=millis(); // return n; } void myserver(EthernetClient client) { //EthernetClient client = server.available(); int index = 0; Serial.println("new client"); while (client.available()) { char c = client.read(); if(index<99) clientline[index] = c; index++; //Serial.print(c); } //Serial.println(clientline); char *t; t=strstr(clientline, "timer"); if (t!=NULL) { t+=5; char timer=*t; t+=2; int value=(*t-48)*10; t++; value+=*t-48; EEPROM.write(timer-48, value); Serial.print("timer "); Serial.print(timer); Serial.print(" value "); Serial.println(value, DEC); } t=strstr(clientline, "pay"); if (t!=NULL) { t+=4; int value=(*t-48)*100; t++; value+=(*t-48)*10; t++; value+=*t-48; printNumber(value); Serial.print("pay is "); Serial.println(value, DEC); } if(strstr(clientline, "reset")!=NULL) resetFunc(); // setup(); // if(strstr(clientline, "water")!=NULL) digitalWrite(2, LOW); // if(strstr(clientline, "pena")!=NULL) digitalWrite(3, LOW); // if(strstr(clientline, "vosk")!=NULL) digitalWrite(4, LOW); // t=strstr(clientline, "box"); if(t!=NULL) { t+=4; EEPROM.write(0, *t-48); } // setup(); resetFunc(); } //   client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.print("box is "); client.print(EEPROM.read(0)); client.println("<br />"); client.print("cashcode is "); client.print(z1, HEX); client.println("<br />"); for (int j = 1; j < 6; j++) { client.print("timer "); client.print(j); client.print(" is "); client.print(EEPROM.read(j)); client.println("<br />"); } client.println("</html>"); delay(100); // close the connection: client.stop(); } char sendInfo() { //if(!posErr && !posPay) return 0; EthernetClient client; char j; String out="sam="+String(EEPROM.read(0))+"&pka="+String(EEPROM.read(13)); //pka if(posPay) { out+="&pays="; for(j=0; j<posPay; j++) { out+=String(EEPROM.read(100+j))+"-"; } } if(posErr) { out+="&errs="; for(j=0; j<posErr; j++) { out+=String(EEPROM.read(200+j))+"-"; } } if (client.connect(system100, 80) || client.connect(system100, 80) || client.connect("www.host.ru", 80)) { Serial.println("GET /control/sinh/get_money.php?"+out+" HTTP/1.1"); client.println("GET /control/sinh/get_money.php?"+out+" HTTP/1.1"); client.println("Host: www.host.ru"); client.println("Connection: keep-alive"); client.println(); } else { Serial.println("connection failed"); return 0; } delay(100); char chr13=0; bool ok=0; char c; while (client.available()) { c=client.read(); Serial.print(c); if(chr13==2 && c=='o') ok=1; else if(c==13) chr13++; else if(c!=10) chr13=0; } client.stop(); //if(!ok) return (0); posPay=0; EEPROM.write(99, posPay); posErr=0; EEPROM.write(199, posErr); return (1); } 

Source: https://habr.com/ru/post/fr483410/


All Articles