14-07-2019, 23:14
Witam ponownie. Dzięki Twoim podpowiedziom i rewelacyjnemu kursowi arduino z forbota zatrybiłem w końcu i udało mi się zmodyfikować kod. Działa rewelacyjnie. Rozpoznaje adresy i wybiera odpowiednie wsady, jeśli nie znajdzie adresu to stoi i nie ładuje bezsensownie zawartości. Zatrzymanie ładowania przypadkowej zawartości zrealizowałem wpisując warunek:
Wyczytałem że nieskończona pętla while(1) służy do zatrzymania programu w przypadku awarii. Przykładowo jeśli korzystamy z jakiegoś czujnika. zauważyłem że podobnie działa jeśli wpiszę return. Czy ten sposób jest poprawny i czy ewentualnie jest jakaś inna metoda na zatrzymanie wykonywania programu w przypadku spełnienia warunku.
Dzięki i pozdrawiam.
Kod:
if (EEPROM_I2C_ADDRESS == 0)
while(1);
Kod:
int EEPROM_I2C_ADDRESS = 0;
#include <Wire.h>
// blank data for K, C, M & Y chip. 128 array of data.
byte KChipData[]={168,0,1,3,18,1,1,255,100,0,52,48,55,53,52,51,20,9,65,66,22,0,22,38,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte CChipData[]={168,0,1,3,14,2,1,255,100,0,49,49,49,53,52,54,20,2,65,66,23,0,7,1,255,255,255,255,255,255,255,255,88,48,56,54,80,52,48,49,50,48,56,0,68,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,1,85,0,18,0,40,0,5,184,230,50,0,128,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte MChipData[]={168,0,1,3,14,3,1,255,100,0,49,49,49,53,52,54,20,2,65,66,24,0,7,16,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
byte YChipData[]={168,0,1,3,14,4,1,255,100,0,49,49,49,53,52,55,20,2,65,66,25,0,3,7,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,100,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0};
void setup() {
// Start Wire and Serial bus
byte error, address;
int nDevices;
byte WriteData[128];
Wire.begin();
Serial.begin(9600);
delay(100);
Serial.println("Start");
Serial.println(" ");
//skaner
Serial.println("Skanuję...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C urządzenie znaleziono pod adresem ");
EEPROM_I2C_ADDRESS = address,DEC;
if (address<16)
Serial.print("0");
Serial.print(address,DEC);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Błąd odczytu adresu I2C ");
if (address<16)
// Serial.print("0");
Serial.println(address,DEC);
}
}
if (nDevices == 0)
Serial.println("I2C brak urządzenia\n");
else
Serial.println("gotowe\n");
delay(5000); // wait 5 seconds for next scan
// Select correct data for chip then copy to WriteData array
switch (EEPROM_I2C_ADDRESS){
case 83:
memcpy(WriteData,KChipData,128*sizeof(byte));
break;
case 82:
memcpy(WriteData,CChipData,128*sizeof(byte));
break;
case 81:
memcpy(WriteData,MChipData,128*sizeof(byte));
break;
case 80:
memcpy(WriteData,YChipData,128*sizeof(byte));
break;
default: //default K chip data, no reason.
// memcpy(WriteData,KChipData,128*sizeof(byte));
if (EEPROM_I2C_ADDRESS == 0)
while(1);
//return;
//break;
}
// Start Write Chip with blank data
Serial.println("Write 128 bytes:");
byte wordaddress;
for(byte i=0;i<128;i++){
wordaddress = i;
i2cwrite((byte)wordaddress,(byte)WriteData[i]);
//Serial.println(i);
Serial.print(wordaddress);
Serial.print(":");
Serial.print(WriteData[i]);
Serial.print(" ");
}
// Start Read chip
Serial.println(" ");
Serial.println("Read 128 bytes:");
for(byte i=0;i<128;i++){
byte readVale = i2cread(i);
Serial.print(i);
Serial.print(":");
Serial.print(readVale);
Serial.print(" ");
Serial.print(" - ");
if (readVale != WriteData[i]) {Serial.println("NOK"); while(1);}
else if (readVale == WriteData[i]) {Serial.println("OK");}
}
Serial.println(" ");
Serial.println("End");
}
void loop() {
}
void i2cwrite(byte address, byte data) {
Wire.beginTransmission(EEPROM_I2C_ADDRESS);
Wire.write((byte)address);
Wire.write((byte)data);
Wire.endTransmission();
delay(20);
}
byte i2cread(byte address) {
byte rData = 0;
Wire.beginTransmission(EEPROM_I2C_ADDRESS);
Wire.write((byte)address);
Wire.endTransmission();
Wire.requestFrom(EEPROM_I2C_ADDRESS,1);
while (Wire.available()){
rData = Wire.read();
return rData;
}
}
void WhatI2CAddress() {
for(int i=0;i<128;i++){
Wire.requestFrom(i,1); //request first data byte
Serial.print(i);
Serial.print(":");
while(Wire.available()){
byte c = Wire.read();
Serial.print(c); //if data exist, print it out. That way you can identify which address.
}
Serial.println(" ");
delay(5);
}
}
Dzięki i pozdrawiam.