Помогите разобраться
- Войдите на сайт для отправки комментариев
Чт, 27/10/2016 - 23:15
Привет, помогите разобраться с проектом, собственно код ПДА Сталкера. Не могу понять с зонами покрытия wifi, ssid влияет на функционал зоны или что-то еще. И прием сообщений тоже не очень понятен.
Функционал:
⦁ Отображение здоровья игрока (слева в углу). Здоровье могу восстанавливать специальные зоны (покрытые WiFi), артефакты (описание ниже). При потере здоровья до 0, на дисплее высвечивается соответствующее сообщение и продолжительный писк, которые обозначают, что игрок «мертв» и должен двигаться на «мертвяк», где здоровье за определенное время восстановится.
⦁ Правее расположена иконка звука, чтобы игрок видел, включен или отключен звук.
⦁ Правее иконка сообщений и рядом количество непрочитанных сообщений. По ходу игры, игроки могут получать СМС сообщения посредством WiFi.
⦁ Правее иконка заряда батареи.
⦁ Фон – это значение условного радиационного фона. Фон формируется при помощи суммирования WiFi зон, раздающих «радиацию». В зависимости от уровня фона, ПДА издает щелчки (как счетчик «Гейгера»). Чем сильнее «радиация», тем чаще щелчки.
⦁ Яд – по ходу игры, попав в WiFi зону раздачи «болезней» (с определенной вероятностью) игрок может заразиться болезнью. У игрока на дисплее высветится определенное сообщение, подкрепленное сигналом.
⦁ Благо – это уровень «Лечилки» игрока.
⦁ Защ. Рад. и Иммунитет – это уровень защиты игрока от «Яда» и «Радиации». Эти бонусы, можно получить подключив «Артефакты».
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <EEPROM.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);
Adafruit_PCD8544 display = Adafruit_PCD8544(5, 6, 7, 8, 9);
//Id
byte Device_id=1, Group_id=1; //ID устройства, ID группировки
//Мертв/жив
bool Death=false, DeathSignal=false; //Мертв ли сталкер, Повторение сигнала смерти пока не подтвердишь
byte DeathCause=0; //Причина смерти
long Health=100000;
long MaxHealth=100000,PrHealth=101000, PrHealthWrite=100000;; //Максимальное значение жизни
long TreatKoef=100; //Коэффициент лечения в процентах
//Батарея
bool LowVolt=false; //низкий заряд батареи
byte Volt, BatICO=123; //Заряд батареи в процентах и адрес иконки батареи в зависимости от заряда
//Радиация и лечение
byte RadiationKoef=100, MinRadiationKoef=100; //Коэффициент воздействия радиации на игрока
long RadiationLevel=0, TreatLevel=0; //общий уровень радиации и лечилки
long BonusTreat=0; //Для реализации бонуса "Зализывая раны"
long TreatArtefact=0;
bool TreatBar=false; // бонус "Завсегдатай"
bool TreatBaza=false; //бонус "Член банды"
//Устройства, кнопки, пины
int OutDevice[13] = {70, 120, 198, 276, 361, 454, 532, 605, 676, 756, 859, 943, 953}; //АЦП артефактов и админ устройств
int KeysACP[5] = {890, 697, 512, 341, 776}; // АЦП кнопок
byte DeviceID=0, ArtefaktID[2]={0,0}; //Номер подключенного устройства
bool Device[2]={false,false}, Artefakt[2]={false, false}, Key=false; //Логика устройств внешних и нажатия кнопок меню
byte VbatPin=0, AdminDevPin[2]={6,3},ArtefaktPin[2]={7,2}, KeysPin=1, SpeakerPin=10, LedPin=9; //Пины контроллера
//Дисплей
byte KoefPois[3]={0,0,0};
byte KoefRad[3]={0,0,0};
byte PoisonLev[3]={0,0,0};
byte Fon[4]={0,0,0,0};
byte TreatLev[4]={0,0,0,0};
int DisplayLedTime=30000; // Время подсветки дисплея
byte DisplayBright=200, DisplayPage=31; // Якрость подсветки дисплея и номер отображаемой страницы дисплея
bool DisplayChange=false; // Переключение дисплея при воздействии заразы
bool LCD_Sleep=false; //Спит ли дисплей
bool ArtInfo=false; //Показать инфо об артефакте
byte ArtPgNum=0; //Номер Артефакта, который отображает на дисплее
int ArtInfoTime=5000;
//СМС
byte Messages=0; //Кол-во непрочитанных сообщений
char M[70]={0}; //Для вывода сообщений на экран
//Болезнь
bool Zaraza=false;//Гадость
int Poison=0, PoisonAffect=0; // Уровень яда
byte PoisonKoef=100, MinPoisonKoef=100; //Коэффициент воздействия яда на игрока
//Динамик
int SpeakerTime=0,SpeakerWaitTime=0,SpeakerRepeat=0; //Время сигнала, между сигнлами, повторение сигналов
bool SpeakerWait=false, SpeakerReady=true, Mute=false; //запрет одновременного использования пищалки и время между сигналами, глушилка звука
//Отслеживать быстродействие
//bool Pin13=false;
//Статистика
unsigned int DeathCount=0;
//WiFI
unsigned int NewTreat=0, NewRadiation=0;
bool WiFiRefresh=false;
byte SignalLevel=0;
char buf[14];
//Счетчики
unsigned long PrMillisRad=0, PrMillisBat=0, PrMillisTreat=0, MillisSpeaker=0, PrDisplayLedTime=0, PrMillisChangeDisplayPg=0,PrMillisPoison=0,
PrMillisDisplayRefresh=0, PrArtInfoTime=0,PrMillisAdminDevice[2]={0,0},PrMillisArtefaktDevice[2]={0,0}, PrMillisPushKey=0, PrMillisWifiRefresh=0; //Для отсчета времени
void setup() {
if (EEPROM.read(82)!=23) {EEPROM_CLEAR();Signal(5);EEPROM.write(82,23);}
EEPROM_READ();
NoReadMessages();
// pinMode(LedPin, OUTPUT);
// analogWrite(LedPin, DisplayBright);
pinMode(SpeakerPin, OUTPUT);
pinMode(13, OUTPUT);
display.begin();
display.setContrast(60);
delay(2000);
PrintUserInfo();
delay(5000);
LCD(1);
// Serial.begin(9600); // Debugging only
// Serial.println("setup");
mySerial.begin(9600);
Volt=GetVoltage(VbatPin, 6.5, 8.0, 2.0);
digitalWrite(SpeakerPin, LOW);
randomSeed(analogRead(4));
TreatLevel=BonusTreat;
mySerial.println("AT+CWMODE=1");
delay(250);
}
void EEPROMWriteInt(int p_address, int p_value)
{
byte lowByte = ((p_value >> 0) & 0xFF);
byte highByte = ((p_value >> 8) & 0xFF);
EEPROM.write(p_address, lowByte);
EEPROM.write(p_address + 1, highByte);
}
unsigned int EEPROMReadInt(int p_address)
{
byte lowByte = EEPROM.read(p_address);
byte highByte = EEPROM.read(p_address + 1);
return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}
void EEPROMWritelong(int address,unsigned long value) {
byte four = (value & 0xFF);
byte three = ((value >> 8) & 0xFF);
byte two = ((value >> 16) & 0xFF);
byte one = ((value >> 24) & 0xFF);
EEPROM.write(address, four);
EEPROM.write(address + 1, three);
EEPROM.write(address + 2, two);
EEPROM.write(address + 3, one);
}
long EEPROMReadlong(unsigned long address) {
unsigned long four = EEPROM.read(address);
unsigned long three = EEPROM.read(address + 1);
unsigned long two = EEPROM.read(address + 2);
unsigned long one = EEPROM.read(address + 3);
return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}
void PrintUserInfo() {
display.clearDisplay();
display.setCursor(0, 0);
M[0]='(';M[1]='с';M[2]=')';M[3]='x';M[4]='u';M[5]='p';M[6]='y';M[7]='p';M[8]='r';M[9]=' ';M[10]='2';M[11]='0';M[12]='1';M[13]='6';M[14]='v';M[15]='e';M[16]='r';M[17]='.';M[18]=' ';M[19]='1';M[20]='.';M[21]='0';M[22]=' ';M[23]=' ';M[24]=' ';M[25]=' ';M[26]=' ';M[27]=' ';M[28]='В';M[29]='л';M[30]='а';M[31]='д';M[32]='е';M[33]='л';M[34]='е';M[35]='ц';M[36]=' ';M[37]='П';M[38]='Д';M[39]='А';M[40]=':';M[41]=' ';
M[42]='С';M[43]='т';M[44]='а';M[45]='л';M[46]='к';M[47]='е';M[48]='р';M[49]=':';M[50]=' ';M[51]=' ';M[52]=' ';M[53]=' ';M[54]=' ';M[55]=' ';
M[56]='П';M[57]='р';M[58]='и';M[59]='з';M[60]='p';M[61]='а';M[62]='к';M[63]=' ';M[64]=' ';M[65]=' ';M[66]=' ';M[67]=' ';M[68]=' ';M[69]=' ';M[70]=0;
for (byte i=0;M[i]!=0;i++) display.write(M[i]);
display.display();
}
void EEPROM_CLEAR() {
for (byte i=0;i<80;i++) EEPROM.write(i,0);
for (byte i=83;i<101;i++) EEPROM.write(i,0);
EEPROMWritelong(101,MaxHealth);
EEPROM.write(81,0);
}
void EEPROM_READ() {
DeathCount=EEPROMReadInt(84);
DeathCause=EEPROM.read(83);
Health=EEPROMReadlong(101);
Death=EEPROM.read(81);
PrHealthWrite=Health;
for (byte i=0;i<10;i++) if (EEPROM.read(i+30)==1) {Zaraza=true;Affect(i);break;};
}
void GetWifi() {
if (!WiFiRefresh) {mySerial.println("AT+CWLAP");PrMillisWifiRefresh=millis();WiFiRefresh=true;}
if (millis()-PrMillisWifiRefresh>5000 && WiFiRefresh) {
NewRadiation=0;
NewTreat=0;
while (mySerial.available()) {
for (int i=0;i<13;i++) {buf[i]=buf[i+1];}
buf[13]=mySerial.read();
//Serial.write(buf[13]);
if (buf[0]=='T' && buf[1]=='r' && buf[2]=='e' && buf[3]=='A') {
NewTreat+=(buf[5]-48)*1000+(buf[6]-48)*100+(buf[7]-48)*10+buf[8]-48;
}
if (!Death) {
if (buf[0]=='D' && buf[1]=='e' && buf[2]=='a' && buf[3]=='t' && buf[4]=='H') {DeathCause=3;Death_Stalker();} //Бомба
if (buf[0]=='M' && buf[1]=='e' && buf[2]=='s' && buf[3]=='s' && buf[4]=='A') { //Сообщение
NewSMS(buf[5], buf[6], buf[7], buf[8], buf[9], buf[10]);
}
if (buf[0]=='R' && buf[1]=='a' && buf[2]=='d' && buf[3]=='i' && buf[4]=='A') { //Радиация
SignalLevel=100-((buf[12]-48)*10+buf[13]-48);
SignalLevel/=10;SignalLevel++;
if (SignalLevel>5) SignalLevel=5;
NewRadiation+=((buf[5]-48)*1000+(buf[6]-48)*100+(buf[7]-48)*10+buf[8]-48)* SignalLevel / 5;
}
}
}
RadiationLevel=NewRadiation;
TreatLevel=NewTreat+BonusTreat+TreatArtefact;
WiFiRefresh=false;
}
}
void ReadNewSMS(byte MesNum) {
/*
if (MesNum<5) {
if (EEPROM.read(MesNum+65)==0) {
for (int i=0;i<5;i++) {if (i!=MesNum) {if (EEPROM.read(i+25)==1) EEPROM.write(i+25,0);if (EEPROM.read(i+65)==1) EEPROM.write(i+65,0);}
else {EEPROM.write(i+25,1);EEPROM.write(i+65,1);}}
byte cnt=0;
for (byte i=11;buf[i]!=0;i++) {MA[cnt]=buf[i];cnt++;}
MA[cnt]=0;
Signal(6);
NoReadMessages();
}}
*/
if (MesNum>4 && MesNum<30) {
if (EEPROM.read(MesNum+35)==0) {
EEPROM.write(MesNum-5,1);
EEPROM.write(MesNum+35,1);
Signal(6);
NoReadMessages();
}
}
if (MesNum>29 && MesNum<40) {
if (EEPROM.read(MesNum+40)==0 && !Zaraza) {
Zaraza=true;
EEPROM.write(MesNum,1);
EEPROM.write(MesNum+40,1);
Affect(MesNum-30);
Signal(9);
}
}
}
void NewSMS(byte MesNum, byte Rate, byte Id_group, byte Id_dev, byte Id_groupExclude, byte ID_deviceExclude) {
if (Device_id!=ID_deviceExclude || ID_deviceExclude==0)
if (Group_id!=Id_groupExclude || Id_groupExclude==0)
if (Id_dev==Device_id || Id_dev==0)
if (Id_group==Group_id || Id_group==0){
byte rnd_rate=random(100);
rnd_rate++;
if (rnd_rate<=Rate) ReadNewSMS(MesNum);
}
}
void Radiation_zone () { //Радиация
if (!Death)
if ((millis()-PrMillisRad)>=100) {
PrMillisRad=millis();
Health-=RadiationLevel*RadiationKoef/1000;
DeathCause=0;
}
}
void Treat_zone () { //Лечилка
if ((millis()-PrMillisTreat)>=100) {
PrMillisTreat=millis();
Health+=TreatLevel*TreatKoef/1000;
}
if (DeathSignal && TreatLevel>0) {DeathSignal=false;LCD(1);}
}
void Life() { // Проверка жизни сталкера
if (Health>MaxHealth) Health=MaxHealth;
if (Health<=0 && !Death) Death_Stalker();
if (Health>=MaxHealth && Death) Restore_Stalker();
if (abs(Health-PrHealthWrite)>=20000) {EEPROMWritelong(101, Health);PrHealthWrite=Health;}
}
void Death_Stalker() { // Сталкер умер
DeathCount++;
TreatArtefact=0;
Artefakt[0]=false;Artefakt[1]=false;
ArtefaktID[0]=0;ArtefaktID[1]=0;
RadiationKoef=MinRadiationKoef;
PoisonKoef=MinPoisonKoef;
Poison=0;
Death=true;
DeathSignal=true;
Messages=0;
Zaraza=false;
for (byte k=0;k<10;k++) if (EEPROM.read(k+30)==1) EEPROM.write(k+30,0);
Health=0;
EEPROMWritelong(101, 0);
EEPROM.write(81,1);
EEPROMWriteInt(84, DeathCount);
EEPROM.write(83, DeathCause);
PrHealthWrite=0;
LCD(1);
Signal(1);
}
void Restore_Stalker() { //Сталкер ожил
Death=false;
DeathSignal=false;
LCD(1);
Signal(2);
EEPROMWritelong(101, MaxHealth);
PrHealthWrite=MaxHealth;
EEPROM.write(81,0);
NoReadMessages();
}
void SignalRadiation() { //Подача сигнала радиации (счетчик гейгера)
if (SpeakerReady && !Mute) {
int SignMn=0;
if (RadiationLevel<1000) SignMn=RadiationLevel*2 + random(250);
if (RadiationLevel>=1000 && RadiationLevel<=3000) SignMn=2000 + RadiationLevel*65/1000 + random(100);
if (RadiationLevel>3000) SignMn=2200+random(100);
if (millis()-MillisSpeaker > (2300 - SignMn)) {
MillisSpeaker=millis();
digitalWrite(SpeakerPin, HIGH);
delay(3);
digitalWrite(SpeakerPin, LOW);
}
}
}
void Signal(byte Val) { //Подача сигналов пищалкой
switch (Val) {
case 0:
if ((millis()-MillisSpeaker>=SpeakerTime) && !SpeakerReady && !SpeakerWait) {
if (SpeakerRepeat>=1) SpeakerRepeat--;
if (SpeakerRepeat==0) {SpeakerReady=true;SpeakerWait=false;} else SpeakerWait=true;
MillisSpeaker=millis();
digitalWrite(SpeakerPin, LOW);
}
if ((millis()-MillisSpeaker>=SpeakerWaitTime) && !SpeakerReady && SpeakerWait) {
SpeakerWait=false;
MillisSpeaker=millis();
digitalWrite(SpeakerPin, HIGH);
}
break;
case 1:
//умер
digitalWrite(SpeakerPin, HIGH);
SpeakerTime=10000;
SpeakerRepeat=1;
SpeakerReady=false;MillisSpeaker=millis();
break;
case 2:
//восстановился
digitalWrite(SpeakerPin, HIGH);
SpeakerTime=5000;
SpeakerRepeat=1;
SpeakerReady=false;MillisSpeaker=millis();
break;
case 5:
//Села батарея
digitalWrite(SpeakerPin, HIGH);
SpeakerRepeat=5;
SpeakerWaitTime=30;
SpeakerTime=30;
SpeakerReady=false;MillisSpeaker=millis();
break;
case 8:
//Писк кнопки
digitalWrite(SpeakerPin, HIGH);
SpeakerTime=50;
SpeakerRepeat=1;
SpeakerReady=false;MillisSpeaker=millis();
break;
case 9:
//Подцепил заразу
digitalWrite(SpeakerPin, HIGH);
SpeakerRepeat=8;
SpeakerTime=100;
SpeakerWaitTime=50;
SpeakerReady=false;MillisSpeaker=millis();
break;
}
if (!Mute) switch (Val) {
case 3:
//админ устройство Артефакт подключены
digitalWrite(SpeakerPin, HIGH);
SpeakerRepeat=2;
SpeakerWaitTime=50;
SpeakerTime=100;
SpeakerReady=false;MillisSpeaker=millis();
break;
case 4:
//админ устройство Артефакт отключены
digitalWrite(SpeakerPin, HIGH);
SpeakerRepeat=2;
SpeakerWaitTime=50;
SpeakerTime=50;
SpeakerReady=false;MillisSpeaker=millis();
break;
case 6:
//SMS
digitalWrite(SpeakerPin, HIGH);
SpeakerRepeat=3;
SpeakerWaitTime=50;
SpeakerTime=150;
SpeakerReady=false;MillisSpeaker=millis();
break;
case 7:
//Дурной эффект
digitalWrite(SpeakerPin, HIGH);
SpeakerRepeat=1;
SpeakerTime=300;
SpeakerReady=false;MillisSpeaker=millis();
break;
}
}
void LCD_Refresh(){
if (!LCD_Sleep) LCD(2);
}
int GetVoltage(int PinBat, float MinVolt, float MaxVolt, float KF) { //Проверка заряда батареи
float Min=(MinVolt*204.8)/KF;
float Max=(MaxVolt*204.8)/KF;
int Volt1 = analogRead(PinBat);
int VoltPerc=0;
float Ind1 = (Max-Min) / 100;
if (Volt1 < Min) {VoltPerc=0;}
else {
VoltPerc = (Volt1 - Min) / Ind1;
if (VoltPerc>100) VoltPerc=100;}
if ((VoltPerc<10) && !LowVolt) {LowVolt=true; DisplayLedTime=5000; DisplayBright=50;}
if ((VoltPerc>10) && LowVolt) {LowVolt=false; DisplayLedTime=30000; DisplayBright=200;}
if (VoltPerc/20 >= 5) BatICO=127;
else BatICO=123+VoltPerc/20;
if (LowVolt) Signal(5);
return VoltPerc;
}
void PrintSMS() {
display.setCursor(0,8);
switch(DisplayPage) {
case 0:
M[0]='Д';M[1]='о';M[2]='б';M[3]='р';M[4]='о';M[5]=' ';M[6]='п';M[7]='о';M[8]='ж';M[9]='а';M[10]='л';M[11]='о';M[12]='в';M[13]='а';M[14]='т';M[15]='ь';M[16]=' ';M[17]='в';M[18]=' ';M[19]='З';M[20]='о';M[21]='н';M[22]='у';M[23]='!';M[24]='!';M[25]='!';M[26]=0;
break;
case 1:
M[0]='К';M[1]='у';M[2]='п';M[3]='л';M[4]='ю';M[5]=' ';M[6]='х';M[7]='о';M[8]='б';M[9]='о';M[10]='т';M[11]='ы';M[12]=' ';M[13]='к';M[14]='р';M[15]='о';M[16]='в';M[17]='о';M[18]='с';M[19]='о';M[20]='с';M[21]='о';M[22]='в';M[23]='!';M[24]=' ';M[25]='Д';M[26]='о';
M[27]='р';M[28]='о';M[29]='г';M[30]='о';M[31]='!';M[32]=' ';M[33]='6';M[34]='8';M[35]='-';M[36]='7';M[37]='7';M[38]='-';M[39]='8';M[40]='9';M[41]=0;
break;
case 2:
M[0]='В';M[1]='с';M[2]='т';M[3]='у';M[4]='п';M[5]='а';M[6]='й';M[7]=' ';M[8]='в';M[9]=' ';M[10]='р';M[11]='я';M[12]='д';M[13]='ы';M[14]=' ';M[15]='с';M[16]='в';M[17]='о';M[18]='б';M[19]='о';M[20]='д';M[21]='ы';M[22]=' ';M[23]='с';M[24]='ы';M[25]='н';M[26]='о';
M[27]='к';M[28]='!';M[29]='!';M[30]='!';M[31]=0;
break;
case 3:
M[0]='П';M[1]='о';M[2]='г';M[3]='о';M[4]='в';M[5]='а';M[6]='р';M[7]='и';M[8]='в';M[9]='а';M[10]='ю';M[11]='т';M[12]=' ';M[13]='х';M[14]='о';M[15]='д';M[16]='о';M[17]='к';M[18]='и';M[19]=' ';M[20]='т';M[21]='а';M[22]='щ';M[23]='а';M[24]='т';M[25]=' ';M[26]='б';
M[27]='о';M[28]='м';M[29]='б';M[30]='у';M[31]=' ';M[32]='в';M[33]=' ';M[34]='з';M[35]='о';M[36]='н';M[37]='у';M[38]='!';M[39]=' ';M[40]='К';M[41]='а';M[42]='к';M[43]=' ';M[44]='б';M[45]='ы';M[46]=' ';M[47]='д';M[48]='е';M[49]='л';M[50]='о';M[51]='в';M[52]=' ';
M[53]='н';M[54]='е';M[55]=' ';M[56]='н';M[57]='а';M[58]='в';M[59]='о';M[60]='р';M[61]='о';M[62]='т';M[63]='и';M[64]='л';M[65]='и';M[66]='!';M[67]=0;
break;
case 4:
M[0]='П';M[1]='р';M[2]='и';M[3]='р';M[4]='у';M[5]='ч';M[6]='у';M[7]=' ';M[8]='к';M[9]='р';M[10]='о';M[11]='в';M[12]='о';M[13]='с';M[14]='о';M[15]='с';M[16]='а';M[17]='!';M[18]=' ';M[19]='Н';M[20]='е';M[21]=' ';M[22]='д';M[23]='о';M[24]='р';M[25]='о';M[26]='г';
M[27]='о';M[28]='!';M[29]=' ';M[30]='т';M[31]='е';M[32]='л';M[33]='.';M[34]=' ';M[35]='7';M[36]='7';M[37]='-';M[38]='6';M[39]='7';M[40]='-';M[41]='7';M[42]='7';M[43]=0;
break;
case 5:
M[0]='У';M[1]='д';M[2]='а';M[3]='ч';M[4]='н';M[5]='о';M[6]='й';M[7]=' ';M[8]='д';M[9]='о';M[10]='р';M[11]='о';M[12]='г';M[13]='и';M[14]=' ';M[15]='т';M[16]='е';M[17]='б';M[18]='е';M[19]=' ';M[20]='с';M[21]='т';M[22]='а';M[23]='л';M[24]='к';M[25]='е';M[26]='р';
M[27]=' ';M[28]='м';M[29]='и';M[30]='м';M[31]='о';M[32]=' ';M[33]='а';M[34]='н';M[35]='о';M[36]='м';M[37]='а';M[38]='л';M[39]='и';M[40]='й';M[41]=' ';M[42]='ч';M[43]='е';M[44]='р';M[45]='е';M[46]='з';M[47]=' ';M[48]='а';M[49]='р';M[50]='т';M[51]='е';M[52]='ф';
M[53]='а';M[54]='к';M[55]='т';M[56]='ы';M[57]='!';M[58]=0;
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
case 12:
break;
case 13:
break;
case 14:
break;
case 15:
break;
case 16:
break;
case 17:
break;
case 18:
break;
case 19:
break;
case 20:
break;
case 21:
break;
case 22:
break;
case 23:
break;
case 24:
break;
}
if (DisplayPage<25) for (int i=0;M[i]!=0;i++) display.write(M[i]);
//else for (int i=0;MA[i]!=0;i++) display.write(MA[i]);
}
void PrintArtefaktInfo(byte Num) {
M[0]='А';M[1]='р';M[2]='т';M[3]='е';M[4]='ф';M[5]='а';M[6]='к';M[7]='т';M[8]=' ';M[10]=':';M[11]=0;
if (Num==0) M[9]='1'; else M[9]='2';
display.setCursor(0,8);
for (int i=0;M[i]!=0;i++) display.write(M[i]);
display.setCursor(0,16);
if (Artefakt[Num]) {
ArtInfoTime=5000;
switch (ArtefaktID[Num]) {
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
M[0]='К';M[1]='о';M[2]='л';M[3]='ю';M[4]='ч';M[5]='к';M[6]='а';M[7]=':';M[8]=' ';M[9]=' ';M[10]=' ';M[11]=' ';M[12]=' ';M[13]=' ';M[14]='+';M[15]='1';M[16]=' ';M[17]='з';M[18]='д';M[19]='/';M[20]='м';M[21]='и';M[22]='н';M[23]=' ';M[24]=' ';M[25]=' ';
M[26]=' ';M[27]=' ';M[28]='-';M[29]='1';M[30]='5';M[31]='%';M[32]=' ';M[33]=' ';M[34]='р';M[35]='а';M[36]='д';M[37]='и';M[38]='а';M[39]='ц';M[40]='и';M[41]='и';M[42]='+';M[43]='2';M[44]='0';M[45]='%';M[46]=' ';M[47]='и';M[48]='м';M[49]='м';M[50]='у';
M[51]='н';M[52]='и';M[53]='т';M[54]='е';M[55]='т';M[56]=0;
break;
case 7:
break;
case 8:
break;
case 9:
break;
case 10:
break;
case 11:
break;
}
} else {
ArtInfoTime=1500;
M[0]='Н';M[1]='е';M[2]='т';M[3]=' ';M[4]='а';M[5]='р';M[6]='т';M[7]='е';M[8]='ф';M[9]='а';M[10]='к';M[11]='т';M[12]='а';M[13]='!';M[14]=0;
}
for (int i=0;M[i]!=0;i++) display.write(M[i]);
}
void PrintZarazaMessage() {
byte Zar=0;
display.setCursor(0,8);
for (int i=0;i<10;i++) if (EEPROM.read(i+30)==1) Zar=i;
switch (Zar) {
case 0:
M[0]='П';M[1]='о';M[2]='я';M[3]='в';M[4]='и';M[5]='л';M[6]='а';M[7]='с';M[8]='ь';M[9]=' ';M[10]='с';M[11]='т';M[12]='р';M[13]='а';M[14]='н';M[15]='н';M[16]='а';M[17]='я';M[18]=' ';M[19]='с';M[20]='ы';M[21]='п';M[22]='ь';M[23]='!';M[24]=' ';M[25]='Н';
M[26]='а';M[27]='д';M[28]='о';M[29]=' ';M[30]='б';M[31]='ы';M[32]=' ';M[33]='о';M[34]='б';M[35]='р';M[36]='а';M[37]='т';M[38]='и';M[39]='т';M[40]='ь';M[41]='с';M[42]='я';M[43]=' ';M[44]='к';M[45]=' ';M[46]='у';M[47]='ч';M[48]='е';M[49]='н';M[50]='ы';
M[51]='м';M[52]=',';M[53]=' ';M[54]='п';M[55]='о';M[56]='к';M[57]='а';M[58]=' ';M[59]='н';M[60]='е';M[61]=' ';M[62]='п';M[63]='о';M[64]='м';M[65]='е';M[66]='р';M[67]='!';M[68]=0;
break;
case 1:
M[0]='Х';M[1]='е';M[2]='р';M[3]='о';M[4]='в';M[5]='о';M[6]=' ';M[7]='с';M[8]='е';M[9]='б';M[10]='я';M[11]=' ';M[12]='ч';M[13]='у';M[14]='с';M[15]='т';M[16]='в';M[17]='у';M[18]='ю';M[19]='!';M[20]=' ';M[21]='П';M[22]='о';M[23]='х';M[24]='о';M[25]='ж';
M[26]='е';M[27]=' ';M[28]='н';M[29]='а';M[30]=' ';M[31]='в';M[32]='и';M[33]='р';M[34]='у';M[35]='с';M[36]=' ';M[37]='к';M[38]='р';M[39]='о';M[40]='в';M[41]='о';M[42]='с';M[43]='в';M[44]='и';M[45]='н';M[46]='к';M[47]='и';M[48]='!';M[49]=' ';M[50]='а';
M[51]='н';M[52]='т';M[53]='и';M[54]='д';M[55]='о';M[56]='т';M[57]=' ';M[58]='у';M[59]=' ';M[60]='б';M[61]='а';M[62]='р';M[63]='м';M[64]='е';M[65]='н';M[66]='а';M[67]='!';M[68]=0;
break;
case 2:
M[0]='К';M[1]='а';M[2]='к';M[3]='а';M[4]='я';M[5]='-';M[6]='т';M[7]='о';M[8]=' ';M[9]='х';M[10]='е';M[11]='р';M[12]='ь';M[13]=' ';M[14]='у';M[15]='к';M[16]='у';M[17]='с';M[18]='и';M[19]='л';M[20]='а';M[21]=' ';M[22]='в';M[23]=' ';M[24]='п';M[25]='р';
M[26]='а';M[27]='в';M[28]='у';M[29]='ю';M[30]=' ';M[31]='р';M[32]='у';M[33]='к';M[34]='у';M[35]='!';M[36]=' ';M[37]='Р';M[38]='у';M[39]='к';M[40]='а';M[41]=' ';M[42]='п';M[43]='а';M[44]='р';M[45]='а';M[46]='л';M[47]='и';M[48]='з';M[49]='о';M[50]='в';
M[51]='а';M[52]='н';M[53]='а';M[54]=' ';M[55]='д';M[56]='о';M[57]=' ';M[58]='п';M[59]='л';M[60]='е';M[61]='ч';M[62]='а';M[63]='!';M[64]=0;
break;
case 3:
M[0]='Я';M[1]=' ';M[2]='п';M[3]='о';M[4]='т';M[5]='е';M[6]='р';M[7]='я';M[8]='л';M[9]=' ';M[10]='з';M[11]='р';M[12]='е';M[13]='н';M[14]='и';M[15]='е';M[16]='!';M[17]=' ';M[18]='Н';M[19]='и';M[20]='ч';M[21]='е';M[22]='г';M[23]='о';M[24]=' ';M[25]='в';
M[26]='о';M[27]='о';M[28]='б';M[29]='щ';M[30]='е';M[31]=' ';M[32]='н';M[33]='е';M[34]=' ';M[35]='в';M[36]='и';M[37]='ж';M[38]='у';M[39]='!';M[40]=' ';M[41]='Г';M[42]='о';M[43]='в';M[44]='о';M[45]='р';M[46]='и';M[47]='л';M[48]='и';M[49]=' ';M[50]='ж';
M[51]='е';M[52]=' ';M[53]='З';M[54]='о';M[55]='н';M[56]='а';M[57]=' ';M[58]='т';M[59]='е';M[60]='б';M[61]='я';M[62]=' ';M[63]='п';M[64]='о';M[65]='г';M[66]='у';M[67]='б';M[68]='и';M[69]='т';M[70]=0;
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:
break;
}
for (int i=0;M[i]!=0;i++) display.write(M[i]);
}
void PrintMessage() {
int k=0;
KoefPois[0]=(100-PoisonKoef)/100+48;KoefPois[1]=((100-PoisonKoef)%100)/10+48;KoefPois[2]=(100-PoisonKoef)%10+48;
KoefRad[0]=(100-RadiationKoef)/100+48;KoefRad[1]=((100-RadiationKoef)%100)/10+48;KoefRad[2]=(100-RadiationKoef)%10+48;
PoisonLev[0]=Poison/100+48;PoisonLev[1]=(Poison%100)/10+48;PoisonLev[2]=Poison%10+48;
Fon[0]=RadiationLevel/1000+48;Fon[1]=(RadiationLevel%1000)/100+48;Fon[2]=(RadiationLevel%100)/10+48;Fon[3]=RadiationLevel%10+48;
TreatLev[0]=TreatLevel/1000+48;TreatLev[1]=(TreatLevel%1000)/100+48;TreatLev[2]=(TreatLevel%100)/10+48;TreatLev[3]=TreatLevel%10+48;
if (!Death)
if (DisplayPage==31) {
if (!ArtInfo) {
if (Zaraza && DisplayChange) {
PrintZarazaMessage();
} else {
display.setCursor(0, 8);
display.write('Ф');display.write('о');display.write('н');display.write(':');display.write(Fon[0]);display.write(',');display.write(Fon[1]);display.write(Fon[2]);display.write(Fon[3]);
display.write('м');display.write('к');display.write('З');display.write(47);display.write('ч');
display.setCursor(0, 16);
display.write('Я');display.write('д');display.write(':');display.write('-');display.write(PoisonLev[0]);display.write(PoisonLev[1]);display.write(PoisonLev[2]);display.write('ж');display.write('/');display.write('м');
display.setCursor(0, 24);
display.write('Б');display.write('л');display.write('а');display.write('г');display.write('о');display.write(':');display.write(TreatLev[0]);display.write(',');
display.write(TreatLev[1]);display.write(TreatLev[2]);display.write(TreatLev[3]);display.write('ж');display.write('/');display.write('с');
display.setCursor(0, 32);
display.write('З');display.write('а');display.write('щ');display.write('.');display.write(' ');display.write('Р');display.write('а');display.write('д');display.write('.');display.write(':');
display.write(KoefRad[0]);display.write(KoefRad[1]);display.write(KoefRad[2]);display.write('%');
display.setCursor(0, 40);
display.write('И');display.write('м');display.write('м');display.write('у');display.write('н');display.write('и');display.write('т');display.write('е');display.write('т');display.write(':');
display.write(KoefPois[0]);display.write(KoefPois[1]);display.write(KoefPois[2]);display.write('%');
}
} else PrintArtefaktInfo(ArtPgNum);
} else {
PrintSMS();
}
if (Death) {
if (TreatLevel>0) {
display.setCursor(22,20);
M[0]='Л';M[1]='е';M[2]='ч';M[3]='е';M[4]='н';M[5]='и';M[6]='е';M[7]=0;
}
else{
display.setCursor(0,16);
switch (DeathCause) {
case 0:
M[0]='Т';M[1]='ы';M[2]=' ';M[3]='у';M[4]='м';M[5]='е';M[6]='р';M[7]=' ';M[8]='о';M[9]='т';M[10]=' ';M[11]='р';M[12]='а';M[13]='д';M[14]='и';M[15]='а';M[16]='ц';M[17]='и';M[18]='и';M[19]='!';M[20]=' ';M[21]='И';M[22]='д';M[23]='и';M[24]=' ';
M[25]='н';M[26]='а';M[27]=' ';M[28]='м';M[29]='е';M[30]='р';M[31]='т';M[32]='в';M[33]='я';M[34]='к';M[35]='!';M[36]=0;
break;
case 1:
M[0]='Т';M[1]='ы';M[2]=' ';M[3]='у';M[4]='м';M[5]='е';M[6]='р';M[7]=' ';M[8]='о';M[9]='т';M[10]=' ';M[11]='с';M[12]='т';M[13]='р';M[14]='а';M[15]='н';M[16]='н';M[17]='о';M[18]='й';M[19]=' ';M[20]='б';M[21]='о';M[22]='л';M[23]='е';M[24]='з';
M[25]='н';M[26]='и';M[27]='!';M[28]=' ';M[29]='И';M[30]='д';M[31]='и';M[32]=' ';M[33]='н';M[34]='а';M[35]=' ';M[36]='м';M[37]='е';M[38]='р';M[39]='т';M[40]='в';M[41]='я';M[42]='к';M[43]='!';M[44]=0;
break;
case 2:
M[0]='Т';M[1]='ы';M[2]=' ';M[3]='у';M[4]='м';M[5]='е';M[6]='р';M[7]=' ';M[8]='о';M[9]='т';M[10]=' ';M[11]='с';M[12]='у';M[13]='и';M[14]='ц';M[15]='и';M[16]='д';M[17]='а';M[18]='!';M[19]=' ';M[20]='И';M[21]='д';M[22]='и';M[23]=' ';M[24]='н';
M[25]='а';M[26]=' ';M[27]='м';M[28]='е';M[29]='р';M[30]='т';M[31]='в';M[32]='я';M[33]='к';M[34]='!';M[35]=0;
break;
case 3:
M[0]='Т';M[1]='ы';M[2]=' ';M[3]='у';M[4]='м';M[5]='е';M[6]='р';M[7]=' ';M[8]='о';M[9]='т';M[10]=' ';M[11]='в';M[12]='з';M[13]='р';M[14]='ы';M[15]='в';M[16]='а';M[17]=' ';M[18]='б';M[19]='о';M[20]='м';M[21]='б';M[22]='ы';M[23]='!';M[24]=' ';
M[25]='И';M[26]='д';M[27]='и';M[28]=' ';M[29]='н';M[30]='а';M[31]=' ';M[32]='м';M[33]='е';M[34]='р';M[35]='т';M[36]='в';M[37]='я';M[38]='к';M[39]='!';M[40]=0;
break;
case 4:
break;
case 5:
break;
case 6:
break;
}}
for (byte i=0;M[i]!=0;i++) display.write(M[i]);
}
}
void LCD(byte Val) { //Вывод инфы на дисплей
if (Val==1) PrDisplayLedTime=millis();
if (Val!=0) {
char Heal[3]={0,0,0}, Mes[2]={0,0};
//analogWrite(LedPin, DisplayBright);
sprintf(Heal, "%d", byte(Health/1000));
sprintf(Mes, "%d", Messages);
LCD_Sleep=false;
display.clearDisplay();
display.setCursor(0, 0);
//Хэлсы
if (!Death) {
display.write(95);display.setCursor(5, 0);display.write(96);}
else display.write(92);
display.write(Heal[0]);display.write(Heal[1]);display.write(Heal[2]);
//Звук
display.setCursor(36, 0);
if (Mute) display.write(62); else display.write(60);
//Сообщения
display.setCursor(48, 0);display.write(93);display.setCursor(53, 0);display.write(94);display.setCursor(62, 0);display.write(Mes[0]);display.write(Mes[1]);
//батарея
display.setCursor(78, 0);display.write(BatICO);
// Основной дисплей
PrintMessage();
display.display();
}
if (Val==0) {
// analogWrite(LedPin, 0);
display.clearDisplay();
display.display();
LCD_Sleep=true;
}
}
void Affect (int Ind) {
switch (Ind) {
case 0:
Poison+=6000;
PoisonAffect=6000;
break;
case 1:
Poison+=6000;
PoisonAffect=6000;
break;
case 2:
Poison+=10000;
PoisonAffect=10000;
break;
case 3:
Poison+=10000;
PoisonAffect=10000;
break;
case 4:
Poison+=5000;
PoisonAffect=5000;
break;
case 5:
Poison+=5000;
PoisonAffect=5000;
break;
case 6:
Poison+=5;
PoisonAffect=5;
break;
case 7:
Poison+=5000;
PoisonAffect=5000;
break;
case 8:
Poison+=5000;
PoisonAffect=5000;
break;
case 9:
Poison+=5000;
PoisonAffect=5000;
break;
}
}
void AdminDevice(byte PortNum){ //определение подключенного админ устройства
if (millis()-PrMillisAdminDevice[PortNum]>1000) {
int k;
int tmp3=analogRead(AdminDevPin[PortNum]);
if (tmp3>80) {
Signal(3);
Device[PortNum]=true;
for (k=0; k<13; k++) if (OutDevice[k] > tmp3) break;
switch (k) {
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
Health=MaxHealth;
break;
case 7:
break;
case 8:
break;
case 9:
Death_Stalker();
EEPROM_CLEAR();
Restore_Stalker();
break;
case 10:
Health=MaxHealth;
break;
case 11:
Zaraza=false;
Poison-=PoisonAffect;
PoisonAffect=0;
for (byte k=30;k<40;k++) if (EEPROM.read(k)==1) EEPROM.write(k,0);
break;
}
LCD(1);}
}
}
void ArtefaktDevice(byte PortNum){ //Определение подключенного артефакта
if (millis()-PrMillisArtefaktDevice[PortNum]>1000) {
int tmp3=analogRead(ArtefaktPin[PortNum]);
if (tmp3>80) {
ArtefaktID[PortNum]=0;
Signal(3);
Artefakt[PortNum]=true;
for (ArtefaktID[PortNum]; ArtefaktID[PortNum]<13; ArtefaktID[PortNum]++) if (OutDevice[ArtefaktID[PortNum]] > tmp3) break;
switch (ArtefaktID[PortNum]) {
case 1:
//1 артефакт
break;
case 2:
//2 артефакт
break;
case 3:
//3 артефакт
break;
case 4:
//4 артефакт
break;
case 5:
//5 артефакт
break;
case 6:
//6 артефакт
TreatArtefact+=17;
RadiationKoef-=15;
PoisonKoef-=20;
break;
case 7:
//7 артефакт
break;
case 8:
//8 артефакт
break;
case 9:
//9 артефакт
break;
case 10:
//10 артефакт
break;
case 11:
//11 артефакт
break;
}
ArtPgNum=PortNum;ArtInfo=true;PrArtInfoTime=millis();
LCD(1);}
}
}
void ArtefaktEject(byte PortNum) { //Убираем воздействие артефакта при его изьятии
Signal(4);
switch (ArtefaktID[PortNum]) {
case 1:
//1 артефакт
break;
case 2:
//2 артефакт
break;
case 3:
//3 артефакт
break;
case 4:
//4 артефакт
break;
case 5:
//5 артефакт
break;
case 6:
//6 артефакт
TreatArtefact-=17;
RadiationKoef+=15;
PoisonKoef+=20;
break;
case 7:
//7 артефакт
break;
case 8:
//8 артефакт
break;
case 9:
//9 артефакт
break;
case 10:
//10 артефакт
break;
case 11:
//11 артефакт
break;
}
ArtefaktID[PortNum]=0;
Artefakt[PortNum]=false;
LCD(1);
}
int ReadMessage() {
int l;
for (l=0;l<30;l++) {if (EEPROM.read(l)==1) break;}
if (l==29 && EEPROM.read(29)==0) l=31; else {EEPROM.write(l,0);NoReadMessages();}
return l;
}
void NoReadMessages() {
Messages=0;
for (byte k=0;k<30;k++) if (EEPROM.read(k)==1) Messages++;
}
void Push_Key() {
if (millis()-PrMillisPushKey>100) {
int tmp4=analogRead(KeysPin);
if (tmp4>100) {
DeathSignal=false;
if (abs(KeysACP[0]-tmp4)<15) {
if (!LCD_Sleep && DisplayPage!=31 && ArtPgNum==1) {DisplayPage=31;ArtPgNum=2;}
else if (ArtInfo && ArtPgNum==1) {ArtInfo=false;ArtPgNum=2;}
else if (ArtInfo && ArtPgNum==0) {PrArtInfoTime=millis();ArtPgNum=1;}
else {ArtInfo=true;PrArtInfoTime=millis();ArtPgNum=0;}
LCD(1);
Key=true;
}
if (abs(KeysACP[1]-tmp4)<15) {
if (!LCD_Sleep) {
if (DisplayPage==31) LCD(0);
if (Messages>0) {
if (DisplayPage!=31) {
if (Messages==0) DisplayPage=31;
else DisplayPage=ReadMessage();
LCD(1);
}
else {DisplayPage=ReadMessage();LCD(1);}
} else {DisplayPage=31;}
}
else LCD(1);
Key=true;}
if (abs(KeysACP[2]-tmp4)<15) {if (Mute) {Mute=false;Signal(8);} else Mute=true;LCD(1);Key=true;}
if (abs(KeysACP[3]-tmp4)<15) {if (DisplayBright>=230) DisplayBright=0; else DisplayBright+=50;LCD(1);Key=true;}
if (abs(KeysACP[4]-tmp4)<15 && millis()-PrMillisPushKey>2000) {if (!Death) {DeathCause=2;Death_Stalker();};Key=true;}
}
}
}
void loop() { //прога
Signal(0);
if (ArtInfo && millis() - PrArtInfoTime >= ArtInfoTime) ArtInfo=false;
if (millis() - PrMillisDisplayRefresh > 1000) {
PrMillisDisplayRefresh=millis();LCD_Refresh();
}
if (millis()-PrMillisChangeDisplayPg >= 3500) {
PrMillisChangeDisplayPg=millis();
if (DisplayChange) DisplayChange=false; else DisplayChange=true;
}
// Проверка батарейки
if (millis()-PrMillisBat > 30000) {
PrMillisBat=millis();
Volt=GetVoltage(VbatPin, 6.5, 8.0, 2.0);
}
if (millis() - PrDisplayLedTime > DisplayLedTime && !LCD_Sleep) {
LCD(0);
}
if (!Death) {
// Если есть радиация - воздействовать на игрока
if (RadiationLevel > 0) {Radiation_zone();SignalRadiation();}
}
if (TreatLevel>0 && Health<MaxHealth) Treat_zone();
// Если есть лечилка - воздействовать на игрока
// Отслеживание вредных воздействий
if (Poison>0 && millis()-PrMillisPoison>=1000) {
Health-=Poison/60;
PrMillisPoison=millis();
DeathCause=1;
}
// Если изменилось значение жизни - отобразить на дисплее и проверить не умер ли или воскрес
if (byte(PrHealth/1000) > byte(Health/1000)) {Life();LCD_Refresh();PrHealth=Health;}
if (byte(PrHealth/1000) < byte(Health/1000)) {Life();PrHealth=Health;LCD_Refresh();}
// Отслеживание кнопок
if (analogRead(KeysPin) > 100) {
if (!Key) Push_Key();
}
else {Key=false;PrMillisPushKey=millis();}
// Отслеживание админских модулей 1
if (analogRead(AdminDevPin[0]) > 80) {
if (!Device[0]) AdminDevice(0);
}
else {Device[0]=false;PrMillisAdminDevice[0]=millis();}
// Отслеживание админских модулей 2
if (analogRead(AdminDevPin[1]) > 80) {
if (!Device[1]) {AdminDevice(1);PrMillisAdminDevice[1]=millis();}
}
else Device[1]=false;
// Отслеживание Артефактов 1 разьема
if (analogRead(ArtefaktPin[0]) > 80 && !Death) {
if (!Artefakt[0]) ArtefaktDevice(0);
}
else {
Artefakt[0]=false;
PrMillisArtefaktDevice[0]=millis();
if (ArtefaktID[0]!=0) ArtefaktEject(0);
}
// Отслеживание Артефактов 2 разьема
if (analogRead(ArtefaktPin[1]) > 80 && !Death) {
if (!Artefakt[1]) ArtefaktDevice(1);
}
else {
PrMillisArtefaktDevice[1]=millis();
Artefakt[1]=false;
if (ArtefaktID[1]!=0) ArtefaktEject(1);
}
GetWifi();
//Pin13=!Pin13;
//digitalWrite(13, Pin13);
}