Делаем дозиметр!

Solid_niy
Offline
Зарегистрирован: 16.10.2017

Спасибо. В вашем zip файле только схема, а меня заинтересовала сама печатная плата для травления. А фотографии хорошего качества с подписанными элементами на печатной плате (как из поста #788) у вас не найдётся?

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Solid_niy, в архиве три файла:

Прочти.txt          короткое текстовое описание

ardosv1_01.lay6    печатная плата в формате SprintLayot6

ARD_dos_м1_04.JPG     схема

Solid_niy
Offline
Зарегистрирован: 16.10.2017

Спасибо большое. Невнимательно прочитал.

sva_khv
Offline
Зарегистрирован: 19.12.2016

arkam256 пишет:

А полностью схему сбросте с прошивкой

Схема такая и есть как выложил.

 

/*
Версия 1-9  04.09.2017
ДОЗИМЕТР
датчик СМБ-20
Текущее излучение
Накопление сумму за час
За сутки с интервалом 1 час запись в EEPROM ( с промежуточными итогами 15-30-45 мин)
При запуске возможна корректировка даты и  времени
Отображение предыдущих дней - 5 мин потом возврат к текущей дате


*/


#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_TFTLCD.h> // Hardware-specific library
#include <TouchScreen.h>     // тачпанель
#include <iarduino_RTC.h>    // часы
#include <EEPROM.h>          // флешпамять
#include <string.h>          //
#include <Wire.h>
//#include <Adafruit_BMP085.h>


// Управление экраном
#define LCD_CS A3 // Chip Select goes to Analog 3
#define LCD_CD A2 // Command/Data goes to Analog 2
#define LCD_WR A1 // LCD Write goes to Analog 1
#define LCD_RD A0 // LCD Read goes to Analog 0

#define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin

// Шина данных экрана
//   D0 connects to digital pin 8  (Notice these are
//   D1 connects to digital pin 9   NOT in order!)
//   D2 connects to digital pin 2
//   D3 connects to digital pin 3
//   D4 connects to digital pin 4
//   D5 connects to digital pin 5
//   D6 connects to digital pin 6
//   D7 connects to digital pin 7
// For the Arduino Mega, use digital pins 22 through 29
// (on the 2-row header at the end of the board).


// управление тачпанелью
#define YP A1  // must be an analog pin, use "An" notation!
#define XM A2  // must be an analog pin, use "An" notation!
#define YM 7   // can be a digital pin
#define XP 6   // can be a digital pin

// параметры резистивной матрицы тачпанели  X-240 Y-320 при любом повороте экрана
#define TS_MINX 175
#define TS_MINY 200
#define TS_MAXX 928
#define TS_MAXY 950
#define MINPRESS 10
#define MAXPRESS 1000
//пропорция пересчета в пикселы экрана
#define TochXProp 2.40 //пропорция пересчета в пикселы экрана Х 2.53
#define TochYProp 3.16       //пропорция пересчета в пикселы экрана Y 3.29
#define VIDEOROTAT 3  // ориентация экрана (значения 0-3 ( 3- горизонтальное начальный угол возле шлейфа тачпанели)

TSPoint pXY;  // данные от тач панели


// Assign human-readable names to some common 16-bit color values:
#define	BLACK   0x0000
#define	BLUE    0x001F
#define	BLUE2   0x0012
#define	RED     0xF800    // 0xF800
#define	GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF


// цвета на экране
#define COLOR_FON1   BLUE2    // BLUE2
#define COLOR_FON2   BLUE2   // BLUE2
#define COLOR_FON3   RED    // BLUE2
#define COLOR_CIFR   WHITE   // циферблат
#define COLOR_RAD1   GREEN     //  уровень радиации в норме
#define COLOR_RAD2   YELLOW   //   уровень попышеный
#define COLOR_RAD3   RED       //   уровень высокий
#define COLOR_IZMER  WHITE   // индикатор процесса измерения

#define RAD_UROVEN_POVISHEN   30     // повышеный уровень радиации
#define RAD_UROVEN_VISOKIY    100     // высокий уровень радиации

//прерывание (счетчик импульсов)
volatile int iKolImp;   // подсчет импульсов за интервал измерения
int iImpMas[8];          // кол-во импульсов в пред периоды
int iRadPredSek;        // пред секунда для проверки 15 сек интервала

char chTextTFT[30];  // общий буфер для вывода на экран

unsigned long iRadPulsTekChas;      // количество импульсов за час
int iKolPer15Chas;        // кол-во полных периодов по 15 сек  за час
int iDataTek;             // текущая дата
int iDataPokaz24;          // какую дату показывать из EEPROM   0-текущая,1-пред2-два дня назад 6-неделю назад
int iPokazRZ;              // отображение в ренгенах=0 или зивертах=1                   

#define PIN_INT_SCHET           19 // номер цифрового входа для прерывания  4 D19 Mega
#define NOMER_INT_SCHET          4 // номер прерывания 4 (  D19 Mega)
#define KOL_MIN_POKAZ_PRED_DNEY  5  // кол-во мин показа экрана с пред датой

unsigned long ulTimePokaz,ulTimePokaz1Sek; // время предыдущего показа экрана
unsigned long ulTimePressTch; // время предыдущего нажатия на тач
unsigned long ulTimeDataPokaz24;  // время начала показа экрана с пред датой

// генератор для преобразователя 400В
#define PIN_PWR_GEN      46 // номер цифрового входа для генератора преобразователя
#define SHIM_NORM  7
#define SHIM_MIN   1
#define SHIM_MAX   34

int iParamSHIM;         //значение ШИМ 

// измерение напряжения
#define PIN_READ_U400    12       // порт измерения папряжения
#define KOEF_ACP_400     1.99   // коэф пересчета АЦП в вольты на датчике СБМ20

// рабоота с EEPROM
#define  EEPROM_ADR_RAD  50    // начало блока данных в EEPROM с почасовой радиацией  50-дата,51-мес,52-год в формате 17,18,19,  53-0 час(2 байта),55- 1 час  99- 23 час

// create buttons---------------------
#define BUTTON_TEXTSIZE 2
char buttonlabels[9][5] = { "X","<<", ">>", "14", "21", "28", "All", "Clr", "Scan"};
uint16_t buttoncolors[9] = {BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, BLUE, GREEN, RED };  //фон кнопки
// объявляем массив кнопок;
Adafruit_GFX_Button buttons[9];

// объявление устройств
Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
iarduino_RTC time(RTC_DS3231);   // Объявляем объект time для модуля 
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

int iSignalSchet;         //включение звукрвого сигнала на щелчек
//??? отладка
int iKolPr;

// давление
//Adafruit_BMP085 datBMP185; int32_t iDavPas,iDavRt;  // давление в Паскалях и ммРтутfloat flDavKorKoeff=1.0027;


//==============================================================================
void setup(void) 
{
int i;
  time.begin();        // Инициируем RTC модуль    
// инициализация экрана
  tft.reset();
  uint16_t identifier = tft.readID();
  tft.begin(identifier);
  tft.cp437(true);
  tft.setRotation(VIDEOROTAT);  
// настройки  
  iPokazRZ=1;          // отображегние в зивертах
  SetDataTime();    
// установки счетчика импульсов
  RadKolImp(0);
  RadChas(0,0,0);
// настройка перывания от разрядника 
  pinMode(PIN_INT_SCHET, INPUT);
  digitalWrite(PIN_INT_SCHET, HIGH);      
  attachInterrupt(NOMER_INT_SCHET, InterSchet, FALLING );  // установка функции обработки прерывания на № 4 пин 19 (MEGA) при переходе с высокого на низкий уровень
// интервалы времени
  ulTimePokaz1Sek=ulTimePokaz=ulTimePressTch=millis();     
//  time.settime(0,34,16,01,6,17,4);         // Устанавливаем время: 

// настройка генератора
  pinMode(PIN_PWR_GEN, OUTPUT);

//  настройка тамера 1 на 1.5 кГц  ШИМ выхода 
  TCCR5A = TCCR5A & 0xe0 | 3;
  TCCR5B = TCCR5B & 0xe0 | 0x0a;

// установка оптимальной длины импульса ШИМ
  iParamSHIM=SHIM_NORM; 
  pinMode(PIN_PWR_GEN, OUTPUT);  
  analogWrite(PIN_PWR_GEN,iParamSHIM); // 

// инициализация данных в EEPROM
    time.gettime();
    iDataTek=time.day;                                       // текущая дата для контроля смены суток
    RadDenInitEEPROM(0,time.day,time.month,time.year,0);     // проверяем текущий день в памяти или другой и инициализируем при необходимости

    iDataPokaz24=0;  // показ графика за сегодняшний день
// сиглал разрядника откл  
    iSignalSchet=0;  
// ОТЛАДКА
iKolPr=0;

//      buttonlabels[0][0]=178;  // значек динамика 
// ссылка на экран, х-центр кнопки, Y - центр кнопки, ширина, высота, цвет рамки,цвет кнопки, цвет текста, текст, размер текста
      buttons[0].initButton(&tft, 20, 20,40,40, WHITE, buttoncolors[0], WHITE, buttonlabels[0], BUTTON_TEXTSIZE); 
      buttons[1].initButton(&tft, 20, 215,36,50, WHITE, buttoncolors[1], WHITE, buttonlabels[1], BUTTON_TEXTSIZE); 
      buttons[2].initButton(&tft, 298, 215,36,50, WHITE, buttoncolors[2], WHITE, buttonlabels[2], BUTTON_TEXTSIZE); 
// датчик давления      
//      datBMP185.begin();
      
 
}




//==================================================================================
void loop(void) 
{
int iPeriodScheta=0,iReg400,iTouchZ;
// временные параметры
int i,i2=0;

// проверка  и регул напр 400В
    iReg400=TestRegNapreg400();

// проверяем тачпанель
  pXY = ts.getPoint();
  pinMode(YP, OUTPUT);
  pinMode(XM, OUTPUT);
  iTouchZ=pXY.z;
  if(iTouchZ>10)  // нажатие на экран
  {  i=(millis()-ulTimePressTch)/500;  //если i>1 время пред нажатия больше 0.5 сек
     i=2;
     if(i>1)
     { ulTimePressTch=millis();
// вкл -выкл пищалки    
       if(buttons[0].contains(TCGetX(), TCGetY()))
       {    if(iSignalSchet==0) 
          {  iSignalSchet=1;
             buttonlabels[0][0]=178;
             buttons[0].initButton(&tft, 20, 20,40,40, WHITE, buttoncolors[0], WHITE, buttonlabels[0], BUTTON_TEXTSIZE); 
             buttons[0].drawButton();
          }   
          else 
          {  iSignalSchet=0;
             buttonlabels[0][0]=88;
             buttons[0].initButton(&tft, 20, 20,40,40, WHITE, buttoncolors[0], WHITE, buttonlabels[0], BUTTON_TEXTSIZE); 
             buttons[0].drawButton();
          }   
        }
// показ почасовое пред суток        
        if(buttons[1].contains(TCGetX(), TCGetY()))
        {  if(iDataPokaz24<6) iDataPokaz24++; 
           DataPokaz24TimerVozvrata(0);
           drawDispley1();
        }  
// показ данных за след сутки
        if(buttons[2].contains(TCGetX(), TCGetY()))
        {  if(iDataPokaz24>0) iDataPokaz24--; 
           DataPokaz24TimerVozvrata(0);
           drawDispley1();
        }  
        
     
     }
  }

// контроль показа предыдущей даты более 5 мин и перехлд к тек дате
    DataPokaz24TimerVozvrata(1);
// обновляем часы
    time.gettime();   
//контроль периода сбора импульсов 15 сек
    iPeriodScheta=RadKontrolPeriodScheta();
// отображение информации  каждые 15 сек
    if(iPeriodScheta==1)  
    {  
// получение  текущего давления   
//       iDavPas=datBMP185.readPressure();    iDavRt=iDavPas*flDavKorKoeff/133.322;
// перерисовка экрана      
       drawDispley1();
       ulTimePokaz=millis();     
       drawIndikIzmer(0);
    }    
// проверяем смену даты    
    RadKontrolDataTek();   
// показ части данных каждую секунду
    i=(millis()-ulTimePokaz1Sek)/1000;
    if(i>0)  //i>0
    { ulTimePokaz1Sek=millis();
// показ индикатора измерений   
      i=(millis()-ulTimePokaz)/1000;
      drawIndikIzmer(i);    
// подсчет среднего за 1 час 
 
// печать контрольных величин
/*
i=0;
       if(i==1)
       {
// отчищаем участок экрана
          tft.drawRect(0,59,62,122,WHITE);    // рисуем рамку
          tft.fillRect(1,60,60,120,COLOR_FON1);  // заливаем внутри рамки белым
          tft.setTextSize(2);  tft.setTextColor(WHITE); 
// печать кол-ва импульсов            i=iKolImp;

          i=pXY.z;
          itoa(i,chTextTFT, 10);  
          tft.setCursor(10,62);       tft.println(chTextTFT);           
// результат проверки напр преобразователя          itoa(iReg400,chTextTFT, 10);           tft.setCursor(4,80);       tft.println(chTextTFT);           
// параметр ШИМ

          itoa(iParamSHIM,chTextTFT, 10);  
          tft.setCursor(4,80);       tft.println(chTextTFT);   
// напряжение преобразователя
          itoa(GetNapreg400(),chTextTFT, 10);  
          tft.setCursor(4,98);       tft.println(chTextTFT);           

// 
          itoa(iRadPulsTekChas,chTextTFT, 10);  
          tft.setCursor(4,116);       tft.println(chTextTFT);           

// 
          itoa(iKolPer15Chas,chTextTFT, 10);  
          tft.setCursor(4,134);       tft.println(chTextTFT);  
 
// 
          itoa(iKolPr,chTextTFT, 10);  
          tft.setCursor(4,152);       tft.println(chTextTFT); 
//           itoa(RadChas(2, 8,0),chTextTFT, 10);            tft.setCursor(4,150);       tft.println(chTextTFT);         

         
          iKolPr=0; 
        } 
*/        
    }
    iKolPr++;
//    delay(100);
}


//=======================================================================
// контроль показа предудущей даты не  более 5 мин
// 0-сброс счетчика  1 - контроль
void  DataPokaz24TimerVozvrata(int iDeistvie)
{ 
int i;

  if(iDataPokaz24>0)
  { if(iDeistvie==0)  ulTimeDataPokaz24=millis(); // запоминаем время начала показа
    if(iDeistvie==1)              // проверяем время показа
    { i=(millis()-ulTimeDataPokaz24)/1000;  
      if(i>60*KOL_MIN_POKAZ_PRED_DNEY) iDataPokaz24=0;  // если показываем больше 5 мин - возвращаемся к текущей дате
    }
  }  
  
}  





//==========================================================================
// контроль интервала подсчета импульсов
// возвращает 1 если данные обновили
int RadKontrolPeriodScheta(void)
{
int iTesSek=time.seconds,iTekHours=time.Hours,iTekMinutes=time.minutes;
int iNew=0;
   if(iTesSek==0||iTesSek==15||iTesSek==30||iTesSek==45)
   {  if(iRadPredSek!=iTesSek)
      { iNew=1; 
// накопление данных за час
         RadChas(1,0,0);      
// проверка сохранения промежуточного результата
         if((iTekMinutes==15||iTekMinutes==30||iTekMinutes==45)&&iKolPer15Chas>8&&iTesSek==30)
         { RadChas(8,iTekHours,0);
         }  
// проверка закрытия часа
         if(iTekMinutes==0&&iKolPer15Chas>8)
         {  if(iTekHours==0) RadChas(9,23,0);
            else RadChas(9,iTekHours-1,0);
         }   
// закрытие 15 сек интервала  
         RadKolImp(1);
      }
   }
   iRadPredSek=iTesSek;
   return iNew;
} 

//==========================================================================
// контроль смены даты
// возвращает 1 если данные обновили
int RadKontrolDataTek(void)
{
int i,iNew=0;
    time.gettime();
// проверяем смену даты
    if(iDataTek!=time.day&&time.minutes>10)   // в течении первого часа (10 мин) показываем график предыдущих суток
    { iDataTek=time.day;
      iNew=1;
// перепысываем данные по суткам в EEPROM
      for(i=5;i>=0;i--) RadWriteIshToPri(i,i+1);
// обнуляем текущие сутки      
      RadDenInitEEPROM(0,time.day,time.month,time.year,0);     // проверяем текущий день в памяти или другой и инициализируем при необходимости
    }  
    return iNew;
} 

//==========================================================================
// учет инмпульсов  iVid 0-сброс параметров   1- закрытие интервала
void RadKolImp(int iVid)
{ 
int i;  
  switch(iVid)
  { case 0: for(i=0;i<8;i++) iImpMas[i]=0;
            iKolImp=0; 
    break;
    
    case 1: 
// сбор 15 сек интервалов в массив    
            for(i=7;i>0;i--)
            { iImpMas[i]=iImpMas[i-1];
            }
            iImpMas[0]=iKolImp;
            iKolImp=0; 
    break;
  }
}


//==========================================================================
// учет инмпульсов за час  iVid 
//  0-сброс параметров 1-накопление текущего часа  
//  2- возвращает мкР за iChas   
//  3-возвращает записаную дату (если iChas  0-дата, 1-месяц,2-год)
//  8 - запись в ПЗУ пром итогов за час (15-30-45 мин)  без обнуления данных за час
//  9- закрытие часа iChas
// iChas от 0 до 23  (при получении даты значение от 0 до 2)
// iSmeDen - смещение в днях - текущий 0, вчерашний 1, позавчерашний 2 и последний неделю назад 6.
int RadChas(int iVid, int iChas,int iSmeDen)
{ 
int i,iRez=0;  
byte bHi,bLo;
// проверка входных условий
  if(iChas<0||iChas>23) return 0;
  if(iSmeDen<0||iSmeDen>6) return 0;

  switch(iVid)
  { case 0:  iRadPulsTekChas=iKolPer15Chas=0;
    break;
    
    case 1: // накопление данных за час
             iRadPulsTekChas=iRadPulsTekChas+iKolImp;
             iKolPer15Chas++;
    break;        
    
    case 2:
        if(iChas>=0&&iChas<24) 
        { bHi=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+3+iChas*2);
          bLo=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+3+iChas*2+1);
// получение int  из двух байт          
          iRez=word(bHi, bLo);
        }  
    break;     
// получаем дату 
    case 3:
        if(iChas>=0&&iChas<3) 
        { bLo=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+iChas);
// получение int  из двух байт          
          iRez=bLo;
        }  
    break;     

    case 8:  //подсчет радиации в мкР за час и сохранение в EEPROM без обнуления данных за час
    case 9: //подсчет радиации в мкР за час и сохранение в EEPROM
        i=iRadPulsTekChas*8*18/78/iKolPer15Chas;
        bHi = highByte(i); // старший байт
        bLo = lowByte(i); // младший байт
        EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+3+iChas*2,bHi);        
        EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+3+iChas*2+1,bLo);        
// сбразываем счетчики с наступлением нового часа        
        if(iVid==9) iRadPulsTekChas=iKolPer15Chas=0; 
    break;
  }
  return iRez;
}

//==========================================================================
// iVid 0-проверить совпадает ли дата в ячейках памяти со смещением iSmeDen , если нет - отчистить день
// iSmeDen - смещение в днях - текущий 0, вчерашний 1, позавчерашний 2 и последний неделю назад 6.
int RadDenInitEEPROM(int iVid, byte bD,byte bM, byte bG,int iSmeDen)
{ 
int i,iRez=0;  
byte bDE,bME,bGE;
// проверка входных условий
  if(iSmeDen<0||iSmeDen>6) return 0;

  switch(iVid)
  { case 0:  
         bDE=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen));
         bME=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+1);
         bGE=EEPROM.read((EEPROM_ADR_RAD+51*iSmeDen)+2);
         if(bD!=bDE||bM!=bME||bG!=bGE)
         { EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen),bD);   
           EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+1,bM);   
           EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+2,bG);   
           for(i=0;i<48;i++) EEPROM.write((EEPROM_ADR_RAD+51*iSmeDen)+3+i,0);  
         }  
     break;
   }
   return iRez;
}


//==========================================================================
// запись данных за сутки из iDenIst в iDenPri
// возвращает 0 - ОК, 99- ошибка входных параметров
int RadWriteIshToPri(int iDenIst, int iDenPri)
{ 
int i;  
byte bD;
// проверка входных условий
   if(iDenIst<0||iDenIst>6) return 99;
   if(iDenPri<0||iDenPri>6) return 99;
   if(iDenPri==iDenIst) return 0;
   for(i=0;i<51;i++)
   {  bD=EEPROM.read((EEPROM_ADR_RAD+51*iDenIst)+i);
      EEPROM.write((EEPROM_ADR_RAD+51*iDenPri)+i,bD);  
   }
   return 0;
}


//==========================================================================
// отображение основного экрана
void drawDispley1(void)
{
    tft.fillScreen(COLOR_FON1);
    
    tft.setTextColor(WHITE); 
    tft.setTextSize(2);   
// отображаем название прибора
    tft.setCursor(55,2);
    tft.println(utf8rus("ДОЗИМЕТР-SVA-1.7")); 
    
// текущее время    
    drawTime();
    
// текущая дата    
    drawDate();
    
// отображение кнопок    
    drawKnopki1(0);    

//радиация за день по часам    
    drawRadDen(iDataPokaz24,2);       

// отображение радиации    
    drawRadRZ(RadGetRengen(),iPokazRZ);    

}

//=========================================================================
// пересчет импульсов в излучение в мкрР/час
int RadGetRengen(void)
{
int i,iSumImp=0,iRengen;  
  if(iImpMas[0]!=0)
  { for(i=0;i<8;i++) 
     if(iImpMas[i]!=0)  iSumImp=iSumImp+iImpMas[i];
     else iSumImp=iSumImp+iImpMas[0];
     iRengen=iSumImp*18/78;  // коэфф пересчета импульсов за 2 мин
  }   
  else iRengen=0;
  return iRengen;
}  


//==========================================================================
// отображение излучения в ренгенах  iZ==1 - показ в зивертах, иначе в ренгенах
void drawRadRZ(int imkReng,int iZ)
{
double flRad;
//imkReng=145;
   tft.setTextColor(COLOR_RAD1); 
   if(imkReng>=RAD_UROVEN_POVISHEN)    tft.setTextColor(COLOR_RAD2); 
   if(imkReng>RAD_UROVEN_VISOKIY)    tft.setTextColor(COLOR_RAD3); 
   tft.setTextSize(4);   
   if(iZ==1)
   { flRad=imkReng/100.0;
     tft.setCursor(120,100);  
     dtostrf(flRad,0,2,chTextTFT);
     tft.println(chTextTFT);    
     tft.setTextSize(3);
     tft.setCursor(120,140);
     tft.println(utf8rus("мкЗв/час"));   
   }  
   else
   { tft.setCursor(120,100);   
     itoa(imkReng,chTextTFT, 10);  
     tft.println(chTextTFT);    
     tft.setTextSize(3);
     tft.setCursor(100,140);
     tft.println(utf8rus("мкР/час"));  
   }  

}


//==========================================================================
// отображение времени
void drawTime(void)
{
   tft.setTextColor(COLOR_CIFR);  tft.setTextSize(2);   
   tft.setCursor(200,28); 
   tft.println(utf8rus(time.gettime("H:i")));    
}


//==========================================================================
// отображение даты
void drawDate(void)
{
   tft.setTextColor(COLOR_CIFR);   tft.setTextSize(2);   
   tft.setCursor(50,28); 
   tft.println(utf8rus(time.gettime("d.m.Y")));     //time.gettime("d-m-Y, H:i:s, D");  
}


//==========================================================================
// отображение индикатора замера
void drawIndikIzmer(int iSec)
{
  if(iSec==0) tft.drawRect(300,12,15,28,COLOR_IZMER);  
  else   tft.fillRect(300,40-2*iSec,15,3,COLOR_IZMER); 
}

//==========================================================================
// отображение кнопок основного экрана
void drawKnopki1(int iSec)
{
    switch(iSec)
    { case 0:
        buttons[0].drawButton();
        buttons[1].drawButton();      
        buttons[2].drawButton();   
      break;
    }  
}


//==========================================================================
// отображение излучения за день  0- текущий 1-один день назад 2 два дня назад
// iSmeY  - 0 обычный, 1- поднять и в низу поставить дату 2- поднять и внизу дату кроме текущего дня
void drawRadDen(int iSmeDney, int iSme)
{
int i,j,iRen,iColor,iSmeY=0;
   if(iSme==1||(iSme==2&&iSmeDney!=0)) iSmeY=18;
// рисуем уровни
    for(i=0;i<24;i++) 
    {  iRen=RadChas(2,i,iSmeDney);
       j=iRen/1.5;
       if(iRen>=RAD_UROVEN_VISOKIY)  iColor=COLOR_RAD3;
       else 
       { if(iRen>=RAD_UROVEN_POVISHEN) iColor=COLOR_RAD2; 
         else iColor=COLOR_RAD1;
       }     
       tft.fillRect(40+i*10,221-j-iSmeY,8,1+j,iColor);  
    }
// рисуем линии приделов
   tft.drawLine(40,202-iSmeY,278,202-iSmeY,COLOR_RAD2); 
// рисуем часы с 1 до 23
    tft.setTextColor(COLOR_IZMER); 
    tft.setTextSize(1); 
    for(i=1;i<24;i=i+2)
    {  itoa(i,chTextTFT, 10);  
       if(i<10) tft.setCursor(32+4+10*i,230-iSmeY); 
       else tft.setCursor(29+4+10*i,230-iSmeY);
       tft.println(chTextTFT);
    }
// печать даты в самом низу
   if(iSmeY>0)
   { tft.setTextColor(COLOR_IZMER); tft.setTextSize(2);   
     tft.setCursor(100,222); 
     sprintf(chTextTFT,"%02u.%02u.%u",RadChas(3,0,iSmeDney),RadChas(3,1,iSmeDney),RadChas(3,2,iSmeDney)+2000);
     tft.println(chTextTFT); 
   }  
}


//==========================================================================
// проверка и регулировка напряжения
//Возвращает 0-норма  1,2 пытаемся регулировать 
// 7-нет напряжения  8-низкое не получается поднять 9-повышеное но не более 420В,
// 99-повышеное, не рег отстанавливаем преобраз
int TestRegNapreg400(void)
{ 
int i=0,iRez=0;
    i=GetNapreg400();
    if(i<10) return(7);
    if(i<388)  //388
    { 
      if(iParamSHIM==SHIM_MAX) return(8);
      if(iParamSHIM<SHIM_MAX) iParamSHIM++;
      analogWrite(PIN_PWR_GEN,iParamSHIM); 
      return(1);
    } 
    if(i>404)  //404
    { if(iParamSHIM==SHIM_MIN)
      { 
        if(i>420) // повышеное, не возможно понизить - отстанавливаем преобраз
        { digitalWrite(PIN_PWR_GEN,LOW);
          return(99);
        }
        return(9);
      }      
      if(iParamSHIM>SHIM_MIN) iParamSHIM--;
      analogWrite(PIN_PWR_GEN,iParamSHIM); 
      return(2);
    }
    return iRez;
}


//==========================================================================
// получение значения напряжения на преобразвателе
int GetNapreg400(void)
{ 
int i=0;
    i=analogRead(PIN_READ_U400)/KOEF_ACP_400;
    return i;
}


//==========================================================================
// настройка дыты и времени
int SetDataTime(void)
{
char chB1=24,chB2=25;
int iExit=0,iTouchZ,iKor=9,iPause=3,iF0,iF1;
unsigned ulTime;
  ulTime=millis();
  while(iExit==0) 
  { if(iKor!=0)
    {  time.gettime(); 
       tft.fillScreen(BLACK);
       tft.fillRect(1,30,318,40,COLOR_FON1);  
       tft.fillRect(1,150,318,40,COLOR_FON1);  
       tft.fillRect(1,200,318,40,GREEN);   
       tft.setTextColor(COLOR_CIFR);  tft.setTextSize(3);   
       tft.setCursor(16,40);  tft.println(chB1);    tft.setCursor(72,40);  tft.println(chB1);    tft.setCursor(130,40);  tft.println(chB1);    
       tft.setCursor(184,40);  tft.println(chB1);   tft.setCursor(250,40);  tft.println(chB1);    
       tft.setCursor(16,160);  tft.println(chB2);   tft.setCursor(72,160);  tft.println(chB2);   tft.setCursor(130,160);  tft.println(chB2);     
       tft.setCursor(184,160);  tft.println(chB2);  tft.setCursor(250,160);  tft.println(chB2);   
       tft.setTextColor(COLOR_CIFR);  tft.setTextSize(3); 
       tft.setCursor(10,100); 
       tft.println(utf8rus(time.gettime("H:i d.m.Y"))); 
       tft.setCursor(100,210); 
       tft.println(utf8rus("ВЫХОД")); 
       
       if(iPokazRZ==1)       {  iF0=BLACK;iF1=GREEN;       }
       else {  iF1=BLACK;iF0=GREEN;       }
       
       tft.fillRect(10,1,150,28,iF0); 
       tft.setCursor(20,5); 
       tft.println(utf8rus("Рентген"));
       tft.fillRect(162,1,150,28,iF1); 
       tft.setCursor(180,5); 
       tft.println(utf8rus("Зиверт"));
       
       
       iKor=0;
    }  
   
// проверяем тачпанель
     pXY = ts.getPoint();
     pinMode(YP, OUTPUT);
     pinMode(XM, OUTPUT);
     iTouchZ=pXY.z;
     if(iTouchZ>10)  // нажатие на экран
     {  iKor=0;
        ulTime=millis();
        iPause=60;
        if(TCGetY()>200) iExit=1;
        if(TCGetY()>30&&TCGetY()<70) iKor=1;  // 
        if(TCGetY()>150&&TCGetY()<190) iKor=-1;
        if(iKor!=0)
        { if(TCGetX()<40) time.settime(-1,-1,time.Hours+iKor,-1,-1,-1,-1);  // час
          if(TCGetX()>50&&TCGetX()<90)  time.settime(-1,time.minutes+iKor,-1,-1,-1,-1,-1);  //мин
          if(TCGetX()>110&&TCGetX()<150) time.settime(-1,-1,-1,time.day +iKor,-1,-1,-1);  //день
          if(TCGetX()>160&&TCGetX()<210) time.settime(-1,-1,-1,-1,time.month +iKor,-1,-1); //мес
          if(TCGetX()>230&&TCGetX()<270) time.settime(-1,-1,-1,-1,-1,time.year+iKor,-1); //год
        }  
        if(TCGetY()<30) // переключение рентген-зиверт
        { if(TCGetX()<150) iPokazRZ=0;
          if(TCGetX()>170) iPokazRZ=1;
          iKor=9;
        }
        delay(200);   
     }  
     if(((millis()-ulTime)/1000)>iPause) iExit=1;     
  }  
   tft.fillScreen(BLACK);
}  


//=============================================================
// получение значения нажатия Х в интеравле разрешения экрана
// возвращает 0 при ошибке или выходе за пределы
int TCGetX(void)
{
int iRez=0;
float flP;
   if(VIDEOROTAT==1||VIDEOROTAT==3)
   { if(pXY.y>TS_MINY&&pXY.y<TS_MAXY)
     { flP=(pXY.y-TS_MINY)/TochXProp;       //пересчет в координаты дисплея
       iRez=flP;   
       if(iRez>=320) iRez=319;
       if(VIDEOROTAT==1) iRez=320-iRez;
       if(iRez<1) iRez=1;
     }  
   }
   if(VIDEOROTAT==0||VIDEOROTAT==2)
   { if(pXY.x>TS_MINX&&pXY.x<TS_MAXX)
     { flP=(pXY.x-TS_MINX)/TochYProp;       //пересчет в координаты дисплея
       iRez=flP;   
       if(VIDEOROTAT==2) iRez=240-iRez;
       if(iRez<1) iRez=1;
       if(iRez>240) iRez=240;     
     }  
   }
   return(iRez);  
}  


//=============================================================
// получение значения нажатия Y в интеравле разрешения экрана
// возвращает 0 при ошибке или выходе за пределы
int TCGetY(void)
{
int iRez=0;
float flP;
   if(VIDEOROTAT==1||VIDEOROTAT==3)
   { if(pXY.x>TS_MINX&&pXY.x<TS_MAXX)
     { flP=(pXY.x-TS_MINX)/TochYProp;       //пересчет в координаты дисплея
       iRez=flP;   
       if(VIDEOROTAT==1) iRez=240-iRez;
       if(iRez<1) iRez=1;
       if(iRez>240) iRez=240;     
     }  
   }
   if(VIDEOROTAT==0||VIDEOROTAT==2)  
   { if(pXY.y>TS_MINY&&pXY.y<TS_MAXY)
     { flP=(pXY.y-TS_MINX)/TochXProp;       //пересчет в координаты дисплея
       iRez=flP;   
       if(iRez>=320) iRez=319;
       if(VIDEOROTAT==0) iRez=320-iRez;
       if(iRez<1) iRez=1;
     }  
   }
   return(iRez);  
}  


/*
void TEST_display_2()
{
  byte i1,i2;

  tft.fillScreen(BLACK);
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);
  tft.setTextSize(2);
  
  for(i1=0; i1<16; i1++) 
  {
    for(i2=0; i2<20; i2++)
      if((i1 == 0) && (i2 == 0x0A || i2 == 0x0D)) tft.write(0x20);
      else tft.write(i1*20+i2);
    tft.println("");
  }
}
*/

//=============================================================
// обработка прерывания от импульса разрядника
void InterSchet(void)
{
  iKolImp++;
  if(iSignalSchet!=0) tone(18,1000,50); 
}

  
//===============================================================
/* Recode russian fonts from UTF-8 to Windows-1251 */
String utf8rus(String source)
{
  int i,k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[i]; i++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[i]; i++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n; target = target + String(m);
  }
return target;
}

 

Sajsen
Offline
Зарегистрирован: 30.10.2017

Большое спасибо разработчикам Дозиметра Ardos. Когда я решил сделать дозиметр, то выбрал именно эту схему. Простота, малое количество деталей, хорошая поддержка - вот достоинства этой схемы. ( Когда делал, наступил на все "грабли" какие возможно, наладил, заработало и только тогда догадался дочитать форум до конца...)

Мой вариант печатной  платы, размер 102х60 мм (у СБМ20 отпилен плюсовой изолятор) Детали использованы от старых мониторов, лазерных принтеров...

1707
Offline
Зарегистрирован: 08.02.2017

Не грех и печатку запилить от такого проекта :)

Sajsen
Offline
Зарегистрирован: 30.10.2017

1707 пишет:

Не грех и печатку запилить от такого проекта :)

Не жалко, выложил: https://yadi.sk/d/fsmqV0gf3PEBdC

Плата рассчитана на AtMega328 в DIP корпусе, без кварца (внутренний генератор 8 мГц). Нарисовано в Спринт лайоут 5. Элементы не подписаны... Программировл процессор в Ардуино, потом ставил в плату. 

ПС: у AtMega328 в DIP нет "ардуино пин А6", я использовал "пин А5", и программу немного поправил...

ППС: Версия платы 2 (односторонняя под ЛУТ), исправлены явные огрехи, высоковольтная часть сделана на SMD резисторах... (много перемычек - красный слой)

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Sajsen, хекс (а лучше вместе с исходником) и фьюзы добавите? Без них по одной печатке тяжковато повторить будет :)

Заливали из ИДЕ с внешним кварцем и загрузчиком (через уну с панелькой), потом меняли фьюзы на внутренний генератор?

Sajsen
Offline
Зарегистрирован: 30.10.2017

tekagi пишет:

Sajsen, хекс (а лучше вместе с исходником) и фьюзы добавите? Без них по одной печатке тяжковато повторить будет :)

Заливали из ИДЕ с внешним кварцем и загрузчиком (через уну с панелькой), потом меняли фьюзы на внутренний генератор?

В программировании Arduino IDE ничего не понимаю, только Ассемблер (очень давно...) Выкладываю свой исходник (исправлено буквально несколько строк):

"#define  ADC 160  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)

#define k_delitel 600 //коефициент дельтеля напряжения, зависит от вашего делителя."
----------------------------------
"byte Read_HV () {
  ADCSRA = 0b11100111;
  //ADMUX = 0b11100110;//выбор внутреннего опорного 1,1В и А6 <-Старая строка 
  ADMUX = 0b11100101;//выбор внутреннего опорного 1,1В и А5"  <- исправлено для Пин А5
-----------------------------------
ARDOs_noSleep_v106.ino : https://yadi.sk/d/ejPx02ix3PESnT
gif.c:                                 https://yadi.sk/i/QGHntLqR3PESn3
 
Кроме того в Arduino IDE надо выбрать или добавить плату с тактовой частотой 8 мГц описано тут:
Как записать загрузчик описано тут:
У меня собран программатор :
http://easyelectronics.ru/usb-programmator-avr-usbasp.html ,(вытащил родной чип из Ардуины, вставил чистый, подключил программатор, зашил, прочитал фьюзы, поменял - ТОЛЬКО СНЯЛ ГАЛКУ - CKDIV8, записал фьюзы). Есть методика записи при помощи только Ардуино УНО.
С фьюзами много хуже... Долго считал калькулятором: http://fusecalc.mirmk.ru/ , читал тут: http://easyelectronics.ru/avr-uchebnyj-kurs-konfiguraciya-fuse-bit.html
Получилось так (поправьте если не прав):
 
ПС: По фьюзам из всего прочитанного я понял, что с завода процессор идет с включенным внутренним генератором и делителем на 8 т.е тактовая частота 1мГц (втыкай в любую схему и заработает без кварца). То есть чтобы частота была 8 Мгц надо снять галку CKDIV8, и больше ничего не трогать!
 
 
ortus
Offline
Зарегистрирован: 16.10.2017

Доброго времени суток! Решил тоже себе запилить дозик, спасибо автору за проект и за его поддержку. Возник вопрос, при прилете одного гамма-кванта, ардуинка выдает двойной сигнал, что это может быть?  

ortus
Offline
Зарегистрирован: 16.10.2017

В общем вот такое шасси получилось для установки в корпус...

ortus
Offline
Зарегистрирован: 16.10.2017

В общем вот такое шасси получилось для установки в корпус...

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

ortus пишет:

Возник вопрос, при прилете одного гамма-кванта, ардуинка выдает двойной сигнал, что это может быть?  

Есть возможность посмотреть сигнал после формирователя импульса осциллографом?

Если есть в запасе СБМ20 - попробуйте заменить, на "подсевших" трубках такой эффект иногда встречается.

ortus
Offline
Зарегистрирован: 16.10.2017

К сожалению ослика нет, другого сбм-20 так же нет, остались только сбт11(((( на подсевших при прилете частицы на выходе угасающий треск, здесь же ровно два импульса, покрутил в настройках накачку на 4-6 эффект частично пропадает... 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Странно. Напряжение на высокой стороне калибровали, не превышает допустимое для счётчика? Я ранее описывал настройку.

СБТ11, емнип, тоже работает на 400В, для проверки использовать можно. Показания, конечно, соответствовать не будут, но удвоение импульса проверить можно. Но только после проверки соответствия высокого, жалко будет хороший счётчик загубить завышенным.

ortus
Offline
Зарегистрирован: 16.10.2017

проверил, опорное верно, накачка верно, заметил одну особенность когда нахожусь в меню настройки опорного и накачки эффект пропадает, щелкает один раз на каждый прилет.... сейчас попробую перепрошить с крайней версии на более старую...

 

ortus
Offline
Зарегистрирован: 16.10.2017

проверил, опорное верно, накачка верно, заметил одну особенность когда нахожусь в меню настройки опорного и накачки эффект пропадает, щелкает один раз на каждый прилет.... сейчас попробую перепрошить с крайней версии на более старую...

 

228
Offline
Зарегистрирован: 16.09.2017

У меня точно также как и у товарища ortus, но я както не обращал на это внимания. Прошивка тоже стоит последняя. Кстати я собирал прибор по схеме с умножителем, может в этом дело ?

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

ortus пишет:

Доброго времени суток! Решил тоже себе запилить дозик, спасибо автору за проект и за его поддержку. Возник вопрос, при прилете одного гамма-кванта, ардуинка выдает двойной сигнал, что это может быть?  

Это баги программы, я уже и не помню подробностей, в общем посмотрел программу v1,05(04), когда в подпрограмме "void poisk_f() {//режим поиска" происходит обнуление  значения "shet = 0;" ПРОИСХОДИТ ДОПОЛНИТЕЛЬНЫЙ щелчек с интервалом от 100мс до 1000мс, в режиме меню такого не происходит!

Лечение в подпрограмме: "void poisk_f() {//режим поиска"

исправить строку: 

if (buzz_ON == 1) {//включаем бузер

на

if ((buzz_ON == 1) && (shet_s > 0)) {//включаем бузер

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

228 пишет:

У меня точно также как и у товарища ortus, но я както не обращал на это внимания.

Это потому что вы им не пользуетесь, если бы пользовались то подобный баг обнаружился быстро, я про это писал месяцев этак(надо смотреть сколько), в прошивке есть еще куча багов не исправленных, в своем варианте я подобное давным давно исправил и уже успел забыть за это...

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

ImaSoft, в новых версиях эта строчка вынесена в подпрограмму "void signa () { //индикация каждой частички звуком светом"

Багфикс работает, спасибо. Навскидку остальных исправлений не помните? Багов, к сожалению, пока ещё хватает :(

/* ArDOs   v106 без режима сна
***Дозиметр на Ардуино
***IDE Arduino 1.8.2
  ветка форума arduino.ru/forum/proekty/delaem-dozimetr
  сайт srukami.inf.ua/ardos.html
*/
#include <util/delay.h> //уже есть
#include <EEPROM.h>//уже есть
#include <LCD5110_Graph.h>//нужно установить

//настройки /////////////начало
LCD5110 myGLCD(A1, A0, 12, 10, 11); //подключение дисплея
//LCD5110 myGLCD(12, 11, 10, A4, A5); //подключение дисплея
#define contrast 60 //контрастность дисплея
byte treviga_1 = 30; //первая ступень тревоги
byte treviga_2 = 60; //вторая ступень тревоги
byte ton_BUZZ = 70; //тональность буззера
#define  ADC 163  //значение АЦП при котором 400В с учетом вашего делителя напряжения (0..255)
#define k_delitel 576 //коефициент дельтеля напряжения, зависит от вашего делителя.
byte puls = 2; //тонкая настройка длинны импульса высоковольтного транса
byte scrin_GRAF = 1; //скорость построения графика в секундах
bool buzz_ON = 1;  //включить индикацию бузером (1)
bool podsvetka = 0; //подсветка
bool son_OK = 0; //разрешение или запрет сна
float opornoe = 1.10; //делить на opornoe/10
#define son_t 40 //время засыпания в секундах
#define save_DOZ 20 //как часто сохранять накопленную доху например каждые 20мкР
byte beta_time = 1; //время замера бета излучения
//настройки //////////////конец
//служебные переменные
extern uint8_t SmallFont[], MediumNumbers[], TinyFont[];
extern uint8_t logo_bat[], logo_rag[], logo_tr[], gif_chast_1[], gif_chast_2[];
volatile int shet = 0;
unsigned long t_milis = 0, gr_milis = 0, lcd_milis = 0, toch_milis = 0, timer_mil = 0;
unsigned long spNAK_milis = 0, time_doza = 0, bat_mill = 0;
int hv_adc, hv_400, shet_s = 0, fon = 0, shet_gr = 0, shet_n = 0;
int speed_nakT = 0, speed_nak = 0, time_sh_l = 0, MIN, HOUR, result;
int doza_vr = 0, val_dr_pr = 0, val_dr_OK = 0;
byte mass_p[84], mass_toch[201], m = 0, n_menu = 0, sys_menu = 0, mass_36[41];
byte val_kl = 0, val_ok = 0, menu = 0, zam_180p = 0, zam_36p = 0, gif_x = 0;
byte sek = 0, minute = 0, bet_z = 0, gotovo = 0;
int  bet_z0 = 0, bet_z1 = 0, bet_r = 0;
float VCC = 0.0, doz_v = 0.0, stat_percent = 99.0;
bool tr = 0, poisk = 1, fonarik = 0, g_fl = 0, toch;
//-------------------------------------------------------------
void setup() {
  //Serial.begin(19200);
  ACSR |= 1 << ACD; //отключаем компаратор
  //ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  pinMode(3, INPUT_PULLUP); //кнопка
  pinMode(4, INPUT_PULLUP); //кнопка
  pinMode(7, INPUT_PULLUP); //кнопка
  DDRB |= (0 << 0); PORTB &= ~(1 << 0); //пин пустой 8
  DDRC |= (0 << 4); PORTC &= ~(1 << 4); //пин пустой А4
  DDRC |= (0 << 5); PORTC &= ~(1 << 5); //пин пустой А5
  DDRB |= (1 << 1);//пин фонаря
  DDRC |= (1 << 3);//A3 дисплей GND
  DDRC |= (1 << 2);//A2 дисплей Light
  PORTC &= ~(1 << 3); //A3 дисплей GND
  PORTC  |= (1 << 2); //A2 дисплей Light
  eeprom_readS ();
  eeprom_readD ();
  lcd_init();
  attachInterrupt(0, Schet, FALLING);//прерываниям пин 2
  DDRB |= (1 << 5); //пины на выход
  DDRD |= (1 << 5);
  DDRD |= (1 << 6);
  DDRD |= (1 << 6);//пин бузера
  nakachka();
}
//-------------------------------------------------------------
void loop() {
  if (menu == 0) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      menu = 3;
      shet = 0; zam_180p = 0; fon = 0;
      stat_percent = 99.0;
      if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
        val_kl++;
        if (val_kl == 6) {
          val_kl = 0;
          fonarik = !fonarik;
        }
      }
    }
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      menu = 4;
      shet = 0;
      bet_z0 = 0;
      bet_z1 = 0;
      bet_r = 0;
      bet_z = 0;
      gotovo = 0;
      sek = 0;
      minute = 0;
      if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
        val_kl++;
        if (val_kl == 6) {
          val_kl = 0;
          fonarik = !fonarik;
        }
      }
    }
  }
  if (menu == 4) {
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      menu = 0;
      shet = 0;
      stat_percent = 99.0;
      if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
        val_kl++;
        if (val_kl == 6) {
          val_kl = 0;
          fonarik = !fonarik;
        }
      }
    }
  }
  if (fonarik == 0) { //фонарик
    PORTB &= ~(1 << 1);//пин фонаря
  } else if (fonarik == 1) {
    PORTB |= (1 << 1);//пин фонаря
  }
  if (podsvetka == 1) {
    PORTC &= ~(1 << 2); //A2 дисплей Light
  }
  if (podsvetka == 0) {
    PORTC |= (1 << 2); //A2 дисплей Light
  }
  if (millis() - lcd_milis >= 300) { //скорость отрисоаки дисплея
    lcd_milis = millis();
    if (menu == 0) {
      lcd_poisk();//вывод на дисплей режима поиск
      poisk_f();
    }
    if (menu == 1) {
      lcd_menu();//вывод на дисплей меню
    }
    if (menu == 2) {
      lcd_sys();//вывод на дисплей системного меню
    }
    if (menu == 3) {
      zamer_200s();//вывод на дисплей замер 180сек
    }
    if (menu == 4) {
      zamer_beta();
    }
  }
  generator();//накачка по обратной связи с АЦП
  if (shet_s != shet) {
    signa ();//подача сигнала о частичке
  }
  if (!(PIND & (1 << PIND3))) { //нажатие ок
    _delay_ms(500);//антидребезг
    OK();
  }
  if (menu == 1) {
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      if (n_menu == 0) {
        treviga_1++;
      }
      if (n_menu == 1) {
        treviga_2++;
      }
      if (n_menu == 2) {
        podsvetka = !podsvetka;
      }
      if (n_menu == 3) {
        son_OK = !son_OK;
      }
      if (n_menu == 4) {
        scrin_GRAF++;
        if (scrin_GRAF > 10) {
          scrin_GRAF = 1;
        }
      }
      if (n_menu == 5) {
        buzz_ON = !buzz_ON;
      }
      if (n_menu == 6) {
        menu = 0;
      }
      if (n_menu == 7) {
        eeprom_wrS ();
        menu = 0;
      }
    }
  }
  if (menu == 2) {
    if (!(PIND & (1 << PIND4))) { //нажатие >>>
      _delay_ms(500);//антидребезг
      if (sys_menu == 0) {
        opornoe = opornoe + 0.01;
        if (opornoe < 0.98) {
          opornoe = 1.20;
        }
        if (opornoe > 1.20) {
          opornoe = 0.98;
        }
      }
      if (sys_menu == 1) {
        puls++;
        if (puls < 1) {
          puls = 200;
        }
        if (puls > 200) {
          puls = 1;
        }
      }
      if (sys_menu == 2) {
        time_doza = 0;//сброс накопленной дозы
        doz_v = 0;//сброс накопленной дозы
        eeprom_wrD ();
        myGLCD.clrScr();
        myGLCD.setFont(SmallFont);
        myGLCD.print("SBROS OK", CENTER, 24);
        myGLCD.update();
        _delay_ms(1000);
      }
      if (sys_menu == 3) {
        menu = 0;
      }
      if (sys_menu == 4) {
        eeprom_wrS ();
        menu = 0;
      }
      if (sys_menu == 5) {
        beta_time++;
      }
    }
  }
  if (menu == 1) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      if (n_menu == 0) {
        treviga_1--;
      }
      if (n_menu == 1) {
        treviga_2--;
      }
      if (n_menu == 2) {
        podsvetka = !podsvetka;
      }
      if (n_menu == 3) {
        son_OK = !son_OK;
      }
      if (n_menu == 4) {
        scrin_GRAF--;
        if (scrin_GRAF < 1) {
          scrin_GRAF = 10;
        }
      }
      if (n_menu == 5) {
        buzz_ON = !buzz_ON;
      }
      if (n_menu == 6) {
        menu = 0;
      }
      if (n_menu == 7) {
        eeprom_wrS ();
        menu = 0;
      }
    }
  }
  if (menu == 2) {
    if (!(PIND & (1 << PIND7))) { //нажатие <<<
      _delay_ms(500);//антидребезг
      if (sys_menu == 0) {
        opornoe = opornoe - 0.01;
        if (opornoe < 0.98) {
          opornoe = 1.20;
        }
        if (opornoe > 1.20) {
          opornoe = 0.98;
        }
      }
      if (sys_menu == 1) {
        puls--;
        if (puls < 1) {
          puls = 200;
        }
        if (puls > 200) {
          puls = 1;
        }
      }
      if (sys_menu == 2) {
        time_doza = 0;//сброс накопленной дозы
        doz_v = 0;//сброс накопленной дозы
        eeprom_wrD ();
        myGLCD.clrScr();
        myGLCD.setFont(SmallFont);
        myGLCD.print("SBROS OK", CENTER, 24);
        myGLCD.update();
        _delay_ms(1000);
      }
      if (sys_menu == 3) {
        menu = 0;
      }
      if (sys_menu == 4) {
        eeprom_wrS ();
        menu = 0;
      }
      if (sys_menu == 5) {
        beta_time--;
      }
    }
  }
}
//-------------------------------------------------------------
void OK () { //нажатие ОК
  if (!(PIND & (1 << PIND3))) { //удержаиние OK
    val_ok++;
    if (val_ok == 10) {
      val_ok = 0;
      menu = 2;
    }
  }
  if (menu == 2) {
    sys_menu++;
    if (sys_menu > 5) {
      sys_menu = 0;
    }
  }
  if (menu == 1) {
    n_menu++;
    if (n_menu > 7) {
      n_menu = 0;
    }
  }
  if (menu == 0) {
    menu = 1;
  }
  if (menu == 3) {
    menu = 1;
  }
}
//--------------------------------------------------------------
void gif_nabor() {
  myGLCD.drawLine(0, 24, 84, 24); myGLCD.drawLine(0, 38, 84, 38);
  for (int i = 83 - zam_180p * 0.47; i < 84; i++) {
    myGLCD.drawLine(i, 24, i, 38);
  }
  g_fl = !g_fl;
  if (g_fl == 0) {
    myGLCD.drawBitmap(gif_x, 27, gif_chast_1, 8, 8);
  } else {
    myGLCD.drawBitmap(gif_x, 27, gif_chast_2, 8, 8);
  }
  if (zam_180p < 200) {
    gif_x = gif_x + 1;
    if (gif_x >= 83 - zam_180p * 0.47) {
      gif_x = 0;
    }
    myGLCD.print("ANALIZ", CENTER, 40);
  }

  if (zam_180p >= 200) {
    myGLCD.print("OBNOVLENIE", CENTER, 40);
  }
}
//--------------------------------------------------------------
void zamer_200s() {
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("%", 20, 0); myGLCD.printNumF(stat_percent, 1, 26, 0);
  myGLCD.setFont(MediumNumbers);
  if (fon > 0) {
    if (fon >= 1000) {
      myGLCD.printNumI(fon, LEFT, 7);
    }
    if (fon < 1000) {
      myGLCD.printNumI(fon, CENTER, 7);
    }
  }
  myGLCD.setFont(SmallFont); myGLCD.print("uR/h", RIGHT, 12);
  gif_nabor();
  battery();
  myGLCD.update();
  if (millis() - toch_milis >= 1000) {
    toch_milis = millis();
    for (int i = 0; i < 200; i++) { //сдвигаем
      mass_toch[i] = mass_toch[i + 1];
    }
    mass_toch[199] = shet;
    shet = 0;
    if (zam_180p < 200) { //первый набор массива
      zam_180p++;
      int fon_vr1 = 0;
      for (int i = 200 - zam_180p; i < 200; i++) {
        fon_vr1 = fon_vr1 + mass_toch[i];
      }
      fon = fon_vr1 * (40.0 / zam_180p);
    }
    if (zam_180p >= 200) { //набор массива
      int fon_vr1 = 0;
      for (int i = 0; i < 200; i++) {
        fon_vr1 = fon_vr1 + mass_toch[i];
      }
      fon = fon_vr1 / 5;
    }
    if (zam_180p <= 36) {
      stat_percent = stat_percent - 2.0;
    }
    if (zam_180p > 36 && zam_180p <= 72) {
      stat_percent = stat_percent - 0.3;
    }
    if (zam_180p > 72 && zam_180p <= 100) {
      stat_percent = stat_percent - 0.2;
    }
    if (zam_180p > 100 && zam_180p <= 200) {
      stat_percent = stat_percent - 0.1;
    }
    if (stat_percent < 5) {
      stat_percent = 5.0;
    }
  }
  if (!(PIND & (1 << PIND7))) { //нажатие <<<
    _delay_ms(500);//антидребезг
    menu = 0;
    shet = 0; fon = 0; zam_36p = 0;
    for (int i = 0; i < 18; i++) { //чистим
      mass_36[i] = 0;
    }
    if (!(PIND & (1 << PIND7))) {//нажатие <<< фонарик
      val_kl++;
      if (val_kl == 6) {
        val_kl = 0;
        fonarik = !fonarik;
      }
    }
  }
}
//--------------------------------------------------------------
void lcd_poisk() {//вывод на дисплей режима поиск
  if (shet < treviga_1 && fon < treviga_1) {//проверяем тревогу
    tr = 0;
  }
  if (shet > treviga_1 || fon > treviga_1) {//проверяем тревогу
    tr = 1;
  }
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  if (tr == 1) { //опасно
    myGLCD.drawBitmap(0, 0, logo_tr, 24, 8);
  }
  myGLCD.print("%", 20, 0); myGLCD.printNumF(100 - (zam_36p * 2.0), 1, 26, 0);
  myGLCD.setFont(MediumNumbers);
  if (fon > 0) {
    if (fon >= 1000) {
      myGLCD.printNumI(fon, LEFT, 7);
    }
    if (fon < 1000) {
      myGLCD.printNumI(fon, CENTER, 7);
    }
  }
  myGLCD.setFont(SmallFont); myGLCD.print("uR/h", RIGHT, 12);
  time_d ();
  myGLCD.setFont(TinyFont);
  myGLCD.printNumI(HOUR, 0, 26);
  if (HOUR >= 9) {
    myGLCD.print("h", 13, 26);
  }
  if (HOUR < 9) {
    myGLCD.print("h", 5, 26);
  }
  myGLCD.printNumI(MIN, 18, 26);
  if (MIN >= 9) {
    myGLCD.print("m", 26, 26);
  }
  if (MIN < 9) {
    myGLCD.print("m", 23, 26);
  }
  myGLCD.setFont(SmallFont);
  if (doz_v < 1000) {
    myGLCD.printNumF(doz_v, 1, 41, 24); myGLCD.print("uR", RIGHT, 24);
  }
  if (doz_v >= 1000) {
    myGLCD.printNumF(doz_v / 1000.0, 2, 41, 24); myGLCD.print("mR", RIGHT, 24);
  }
  myGLCD.drawLine(0, 32, 83, 32);//верхняя
  battery();
  for (int i = 0; i < 82; i ++) { //печатаем график
    if (mass_p[i] > 0) {
      if (mass_p[i] <= 15) {
        myGLCD.drawLine(i + 1, 47, i + 1, 47 - mass_p[i]);
      }
      if (mass_p[i] > 15) {
        myGLCD.drawLine(i + 1, 47, i + 1, 47 - 15);
      }
    }
  }
  myGLCD.update();
}
//-------------------------------------------------------------
void lcd_menu() { //вывод на дисплей меню
  myGLCD.clrScr();
  myGLCD.setFont(TinyFont);
  myGLCD.print("OPASN.1", 0, 0); myGLCD.printNumI(treviga_1, CENTER, 0); myGLCD.print("uR/h", RIGHT, 0);
  myGLCD.print("OPASN.2", 0, 6); myGLCD.printNumI(treviga_2, CENTER, 6); myGLCD.print("uR/h", RIGHT, 6);
  myGLCD.print("PODSV.", 0, 12); myGLCD.printNumI(podsvetka, CENTER, 12);
  myGLCD.print("------", 0, 18); myGLCD.printNumI(son_OK, CENTER, 18); myGLCD.print("on/off", RIGHT, 18);//usr
  myGLCD.print("POISK.", 0, 24); myGLCD.printNumI(scrin_GRAF, CENTER, 24); myGLCD.print("SEK", RIGHT, 24);
  myGLCD.print("ZVUK", 0, 30); myGLCD.printNumI(buzz_ON, CENTER, 30);
  myGLCD.print("OUT", 0, 36);
  myGLCD.print("SAVE", 0, 42);
  myGLCD.print(">", 30, n_menu * 6);
  myGLCD.update();
}
//-------------------------------------------------------------
void lcd_sys() { //вывод на дисплей меню
  VCC_read();
  speed_nakachka ();//скорость накачки имлульсы/сек
  myGLCD.clrScr();
  myGLCD.setFont(TinyFont);
  myGLCD.print("OPORN", 0, 0); myGLCD.printNumF(opornoe, 2, CENTER, 0); myGLCD.print("VCC", 55, 0); myGLCD.printNumF(VCC, 2, RIGHT, 0);
  hv_400 = hv_adc * opornoe * k_delitel / 255; //считем высокео перед выводом
  myGLCD.print("NAKAH", 0, 6); myGLCD.printNumI(puls, CENTER, 6); myGLCD.printNumI(hv_400, RIGHT, 6);
  myGLCD.print("DOZA", 0, 12); myGLCD.print(">>", CENTER, 12); myGLCD.print("SBROS", RIGHT, 12);
  myGLCD.print("OUT", 0, 18);
  myGLCD.print("SAVE", 0, 24);
  myGLCD.print("BETA", 0, 30); myGLCD.printNumI(beta_time, CENTER, 30); myGLCD.print("MIN", RIGHT, 30);
  myGLCD.print(">", 30, sys_menu * 6);
  myGLCD.print("SPEED N", 0, 40); myGLCD.printNumI(speed_nak, CENTER, 40); myGLCD.print("imp/sek", RIGHT, 40);
  myGLCD.update();
}
//-------------------------------------------------------------
void zamer_beta() {// замер бета или продуктов
  if (gotovo == 0) {
    if (!(PIND & (1 << PIND3))) { //нажатие OK
      gotovo = 1;
    }
    myGLCD.clrScr();
    myGLCD.setFont(SmallFont);
    myGLCD.print("Zamer ", 20, 10); myGLCD.printNumI(bet_z, 55, 10);
    myGLCD.print("nagmi OK", CENTER, 20);
    myGLCD.update();
  }
  if (gotovo == 1) {
    timer_soft();
    byte otsup = 0;
    if (minute > 9) {
      otsup = 5;
    }
    myGLCD.clrScr();
    battery();
    myGLCD.setFont(TinyFont);
    myGLCD.printNumI(minute, LEFT, 0);
    if (toch == 0) {
      myGLCD.print(":", 5 + otsup, 0);
    } else {
      myGLCD.print(" ", 5 + otsup, 0);
    }
    myGLCD.printNumI(sek, 10 + otsup, 0); myGLCD.print("time", 23 + otsup, 0);
    myGLCD.drawLine(0, 8, 83, 8);
    myGLCD.setFont(SmallFont);
    myGLCD.drawLine(40, 8, 40, 28);
    myGLCD.print("Zamer0", LEFT, 10); myGLCD.print("Zamer1", RIGHT, 10);
    myGLCD.printNumI(bet_z0, LEFT, 20); myGLCD.printNumI(bet_z1, RIGHT, 20);
    myGLCD.drawLine(0, 28, 83, 28);
    if (bet_z < 2) {
      myGLCD.print("Idet zamer", CENTER, 30); myGLCD.printNumI(bet_z, RIGHT, 30);
      myGLCD.printNumI(bet_r, CENTER, 38);
    }
    if (bet_z == 2) {
      myGLCD.print("Rezultat", CENTER, 30);
      myGLCD.printNumI(bet_r, CENTER, 38); myGLCD.print("mkR/h", RIGHT, 38);
    }
    myGLCD.update();
    if (bet_z == 0) { //первый замер
      bet_z0 = bet_z0 + shet;
      shet = 0;
      if (minute >= beta_time) {
        bet_z = 1;
        sek = 0;
        minute = 0;
        gotovo = 0;
      }
    }
    if (bet_z == 1) { //второй замер
      bet_z1 = bet_z1 + shet;
      shet = 0;
      if (minute >= beta_time) {
        bet_z = 2;
        sek = 0;
        minute = 0;
      }
    }
    if (bet_z == 2) { //результат
      bet_r = bet_z1 - bet_z0;
      bet_r = bet_r / (1.5 * beta_time);
    }
  }
  if (!(PIND & (1 << PIND4))) { //нажатие >>>
    _delay_ms(500);//антидребезг
    menu = 0;
    shet = 0; fon = 0; zam_36p = 0;
    for (int i = 0; i < 18; i++) { //чистим
      mass_36[i] = 0;
    }
  }
}
//-------------------------------------------------------------
void poisk_f() {//режим поиска
  if (poisk == 1) {
    if (millis() - gr_milis >= scrin_GRAF * 1000) { //счет для графика
      gr_milis = millis();
      val_ok = 0;//сброс удержания системного меню
      shet_gr = shet - shet_n;
      if (shet_gr < 0) {
        shet_gr = 1;
      }
      mass_p[m] = shet_gr ;
      shet_n = shet;
      if (m < 82) {
        m++;
      }
      if (m == 82) {
        for (int i = 0; i < 83; i++) {
          mass_p[i] = mass_p[i + 1];
        }
        mass_p[82] = shet_gr;
      }
    }
    if (millis() - toch_milis >= 1000) {
      toch_milis = millis();
      for (int i = 0; i < 40; i++) { //сдвигаем
        mass_36[i] = mass_36[i + 1];
      }
      mass_36[40] = shet;
      if (zam_36p < 40) { //первый набор массива
        zam_36p++;
        fon = fon + shet;
      }
      if (zam_36p >= 40) { //набор массива
        int fon_vr1 = 0;
        for (int i = 0; i < 40; i++) {
          fon_vr1 = fon_vr1 + mass_36[i];
        }
        fon = fon_vr1;
      }
      shet = 0;
      doz_v = doz_v + fon / 100.0 / 40.0;
      time_doza = time_doza + 1;
      if (doz_v - doza_vr >= save_DOZ) { //а не пора ли сохранить дозу ?)
        eeprom_wrD ();
        doza_vr = doz_v;
      }
    }
  }
}
//-------------------------------------------------------------
void signa () { //индикация каждой частички звуком светом
  shet_s = shet;
if ((buzz_ON == 1) && (shet_s > 0))  {//включаем бузер
    PORTB |= (1 << 5); //светодиод
    int d = 30;
    while (d > 0) {
      PORTD |= (1 << 6);
      _delay_us(ton_BUZZ);
      PORTD &= ~(1 << 6);
      _delay_us(ton_BUZZ);
      d--;
    }
    PORTB &= ~(1 << 5);//светодиод
  }
  //generator();//накачка по обратной связи с АЦП
}
//-------------------------------------------------------------
void Schet() { //прерывание от счетчика на пин 2
  shet++;
}
//-------------------------------------------------------------
void generator() {//накачка по обратной связи с АЦП
  hv_adc  = Read_HV();
  if (hv_adc < ADC) { //Значение АЦП при котором на выходе 400В
    int c = puls;
    PORTD |= (1 << 5); //пин накачки
    while (c > 0) {
      asm("nop");
      c--;
    }
    PORTD &= ~(1 << 5);//пин накачки
    speed_nakT++;
  }
}
//-------------------------------------------------------------
byte Read_HV () {
  ADCSRA = 0b11100111;
  ADMUX = 0b11100110;//выбор внутреннего опорного 1,1В и А6
  for (int i = 0; i < 10; i++) {
    while ((ADCSRA & 0x10) == 0);
    ADCSRA |= 0x10;
  }
  result = 0;
  for (int i = 0; i < 10; i++) {
    while ((ADCSRA & 0x10) == 0);
    ADCSRA |= 0x10;
    result += ADCH;
  }
  result /= 10;
  return result;
}
//-------------------------------------------------------------
void battery() { //батарейка
  if (bat_mill - millis() > 2000) {
    bat_mill = millis();
    VCC_read();
  }
  myGLCD.drawBitmap(59, 0, logo_bat, 24, 8);
  myGLCD.setFont(TinyFont);
  myGLCD.printNumF(VCC, 2, 63, 2);
}
//-------------------------------------------------------------
void VCC_read() { // Чтение напряжения батареи
  ADCSRA = 0b11100111;
  ADMUX = 0b01101110;//Выбор внешнего опорного+BG
  _delay_ms(5);
  while ((ADCSRA & 0x10) == 0);
  ADCSRA |= 0x10;
  byte resu = ADCH;
  //ADCSRA &= ~(1 << ADEN);  // отключаем АЦП,
  VCC = (opornoe * 255.0) / resu;
}
//-------------------------------------------------------------
void lcd_init() {
  myGLCD.InitLCD();
  myGLCD.setContrast(contrast);
  myGLCD.clrScr();
  myGLCD.drawBitmap(0, 0, logo_rag, 84, 48);
  myGLCD.setFont(SmallFont);
  myGLCD.print("Arduino+", CENTER, 32);
  myGLCD.print("Dosimetr v1.06", CENTER, 40);
  myGLCD.update();
  _delay_ms(1000);
}
//-------------------------------------------------------------
void eeprom_wrS () { //запись настроек в память
  EEPROM.write(0, 222);
  EEPROM.write(1, treviga_1);
  EEPROM.write(2, podsvetka);
  EEPROM.write(3, son_OK);
  EEPROM.write(4, scrin_GRAF);
  EEPROM.write(5, buzz_ON);
  EEPROM.write(6, puls);
  EEPROM.write(7, opornoe * 100);
  EEPROM.write(8, treviga_2);
  EEPROM.write(13, beta_time);
  myGLCD.clrScr();
  myGLCD.setFont(SmallFont);
  myGLCD.print("Save OK", CENTER, 24);
  myGLCD.update();
  _delay_ms(1000);
}
//-------------------------------------------------------------
void eeprom_wrD () { //запись настроек в память время накопления дозы
  byte hi = time_doza >> 8;
  byte low = time_doza;
  EEPROM.write(9, hi);
  EEPROM.write(10, low);
  hi = int(doz_v) >> 8;
  low = int(doz_v);
  EEPROM.write(11, hi);
  EEPROM.write(12, low);
}
//-------------------------------------------------------------
void eeprom_readD () { //чтание настроек из памяти время накопления дозы
  byte hi  = EEPROM.read(9);
  byte low  = EEPROM.read(10);
  time_doza = (hi << 8) | low;
  hi  = EEPROM.read(11);
  low  = EEPROM.read(12);
  doz_v = (hi << 8) | low;
}
//-------------------------------------------------------------
void eeprom_readS () { //чтание настроек из памяти
  if (EEPROM.read(0) == 222) {
    treviga_1 = EEPROM.read(1);
    podsvetka = EEPROM.read(2);
    son_OK = EEPROM.read(3);
    scrin_GRAF = EEPROM.read(4);
    buzz_ON = EEPROM.read(5);
    puls = EEPROM.read(6);
    opornoe = EEPROM.read(7) / 100.0;
    treviga_2 = EEPROM.read(8);
    beta_time = EEPROM.read(13);
  }
  _delay_ms(10);
}
//-------------------------------------------------------------
void nakachka() {//первая накачка
  byte n = 0;
  while (n < 30) {
    PORTD |= (1 << 5);//дергаем пин
    int c = puls;
    while (c > 0) {
      asm("nop");
      c--;
    }
    PORTD &= ~(1 << 5);//дергаем пин
    n++;
    _delay_us(100);
  }
}
//-------------------------------------------------------------
void speed_nakachka () { //скорость накачки имлульсы/сек
  if (millis() - spNAK_milis >= 1000) {
    spNAK_milis = millis();
    speed_nak = speed_nakT;
    speed_nakT = 0;
  }
}
//-------------------------------------------------------------
void time_d() {
  HOUR = time_doza / 3600;
  MIN = (time_doza / 60) % 60;
}
//-------------------------------------------------------------
void timer_soft() {
  if (millis() - timer_mil >= 1000) {
    timer_mil = millis();
    sek++;
    toch = !toch;
    if (sek > 60) {
      sek = 0;
      minute++;
    }
  }
}

 

ImaSoft
ImaSoft аватар
Offline
Зарегистрирован: 22.09.2015

Если честно уже многое забыл!

Вот с коментов что вытянул:

* Вторник- v1.07 от 23.05.17, Много было внесено изменений с версии ArDOS v1.05

* Среда  v1.18 от 12.07.17, Исправил битность сохранение значения time_doza, так как сохранялось только 2 байта 16бит, что приводило к неправильному отображения накопленного времени дозы, после включения устройства, так же сделал ограничение счетчика до 999h59m

Все основные баги были сделаны до версии v1.07 от 23.05.17, но небыли записаны.

 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Что ж, похоже придётся ждать, пока кто-нибудь из кодеров заинтересуется дальнейшим развитием проекта...

Surikat
Offline
Зарегистрирован: 13.07.2016

Добрый день Форумчане ! 

проблема нет генераций высокого напряежения (модерн-я ДБГ-05Б) отсутвуют импульсы  

при дотрагивание до отверткой до радиодеталей части  ВН или где снимается и обратный  сигнал  приосхдит  тактирование завышенного фона ардуинке, на  примере ардоса на схеме укажите точки замеровом осциллографом , впервый раз сталкиваюсь с дозиметрами и трансформаторами ВН

придотрагивание до ВН части напряжения (пальцам руки)

кто сталкивался с такой проблемой 

 

вопрос по дозиметру Ардос какие можно применить транзисторы в корпусе  то-92 в вн части (я поставил кт3117а1) и импульсной  части поставил кт3102вм

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Surikat, cобираете по принципу bodriy2014, из частей оригинального ДБГ? В точках, отмеченных стрелками импульсы накачки есть? Длительность импульса в меню увеличивали?

Транзистор накачки поставьте тот же, что и был в ДБГ (КТ940 А или Б), он более-менее высоковольтный. 3117 и 3102 имеют малое допустимое напряжение КЭ и работать не будут (с большой долей вероятности уже пробило). Там с индуктивности импульс четыреста и более вольт. Возможно будет работать MJE13003 (13001, 13002).

В формирователе импульса - родной кт3107 или любой маломощный pnp (bc557, кт361...).

Не самый лёгкий путь выбрали, с большинством возникающих проблем Вам придётся разбираться самостоятельно. Базовая схема АрДоса попроще в настройке будет.

ortus
Offline
Зарегистрирован: 16.10.2017

Однако доброго времени суток! Проверил ардос на источнике от дп-5в, за пределом в 1000 микрорентген ожидал, что прибор автоматически сконвертирует в милирентгены, оного не произошло, чему был удивлен(((, источник прокисший уже, но 3,5 милирентгена выдавливает, колокольчик оповещения опасных уровней ввергает в уныние, заменить бы на значок радиации, и при привышении пороговых значений уровней опасности отсутствует звуковое оповещение((( баги вроде не критичные, но заставляют обращать на них внимание. Уважаемый IMASOFT так как я сам в программировании ардуинок полный нуб, возможно Вы посодействуете в решении данных багов? Участники проекта были бы благодарны Вам за допил программы...

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Звук тревоги я к какой-то версии прикручивал, надо бы покопаться в архиве и перенести в текущую.

ortus
Offline
Зарегистрирован: 16.10.2017

Было бы замечательно!

ortus
Offline
Зарегистрирован: 16.10.2017

Автор отстранился от проекта, на сколько я понимаю?

ortus
Offline
Зарегистрирован: 16.10.2017

У кого есть поверочные источники проверьте реакцию Ардоса на высокие уровни, на моем экземпляре с крайней прошивкой начиная от 1500 uR  начинает самопроизвольно выходить в меню, замер или в анализ, такое ощущение что идут глюки проги или начинает прошивать по схеме....

1707
Offline
Зарегистрирован: 08.02.2017

ortus пишет:

Автор отстранился от проекта, на сколько я понимаю?

Да

Surikat
Offline
Зарегистрирован: 13.07.2016

ВОПРОС ПО КОНДЕНСАТОРАМ ОНИ ВСЕ ДОЛЖНЫ БЫТЬ ПЛЕНОЧНЫЕ +630 

УМЕНЯ ОГРОМНЫЙ ВОПРОС ПО ТРАНСФОРМАТОРУ  КТО ИЗ ЧЕГО ДЕЛАЛ, УМЕНЯ НЕТ ВОЗМОЖНОСТИ ДОСТАТЬ ПРОВОД.

1707
Offline
Зарегистрирован: 08.02.2017

Только С11 на 630В. Транс выдирал с платы бесперебойника, они по параметрам один в один, но у меня не завелись толком. Потом заменил транзистор на 6346, и мотал с провода который достал из старого допотопного радио. Так же на Али продаются 0,1 диаметром.

Medvedik
Medvedik аватар
Offline
Зарегистрирован: 09.07.2017

Последний эксперимент с "Трансформатором" - покупная индуктивнось на 10 мГн https://www.chipdip.ru/product/rlb1314-103kl , на ней 4 витка провода 0,5 мм диаметром

Medvedik
Medvedik аватар
Offline
Зарегистрирован: 09.07.2017

В жёлтой термоусадке чуть левее и выше экранчика)

Выпрямитель: US1M (https://www.chipdip.ru/product/us1m)

Фильтр: 0,1*630V (https://www.chipdip.ru/product/grm43dr72j104k)

ortus
Offline
Зарегистрирован: 16.10.2017

Я лично брал от старой 15 ваттной энергосберегайки, до этого на гантельке смотал, но по напруге не дотянул, не сталморочить себе голову и использовал транс, добавил 3.5 витка медного проводника в лаке, толщина по лаку составила 0.8 мм

ortus
Offline
Зарегистрирован: 16.10.2017

Уважаемый ImaSoft, Вы можете скинуть кусок кода который отвечает за вывод показаний накачки на экран как у Вас в вашей версии ПО?

 

ortus
Offline
Зарегистрирован: 16.10.2017

А что это у Вас за чудной такой источник? Что то из скалярки?

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Ториевая ручка)) Кстати, не проверяли, торон она не выделяет? Айзон за китайские ториевые артефакты рассказывал, а про такую возможность не упоминал.

 

Surikat пишет:

УМЕНЯ ОГРОМНЫЙ ВОПРОС ПО ТРАНСФОРМАТОРУ  КТО ИЗ ЧЕГО ДЕЛАЛ, УМЕНЯ НЕТ ВОЗМОЖНОСТИ ДОСТАТЬ ПРОВОД.

 

Тонкий провод всречается в высоковольтных катушках, маломощных реле, контурных катушках длинно-и средневолновых приёмников и т.д. Для намотки его надо немного (два-три метра максимум), если сматывать б/у - выбирать катушки, не залитые лаком, следить, чтобы не повредилась лаковая изоляция.

Ш-образный сердечник можно взять от китайских зарядок (об этом не раз говорилось в теме). Как разобрать такой сердечник для перемотки, не повредив - листайте гугль/ютуб, примеров масса. Гантельки встречаются в разной технике (свои брал с электронных балластов для люминисцентных ламп и компового блока питания). Верхний правый на картинке трансформатор и вовсе был намотан на стержневом сердечнике выходного дросселя от БП АТХ, но в работе оказался крайне неэкономичным (около 10мА при ЕРФ). Если появится свободное время - проведу эксперимент с внутренней частью дросселя от DC-DC конвертера (синяя платка на фото), она тоже имеет форму гантельки, но места для намотки там намного больше.

Но проще всего последовать совету Medvedik.

Medvedik
Medvedik аватар
Offline
Зарегистрирован: 09.07.2017

С этим дросселем-трансформатором накачка кушает 1,0 - 1,2 мА при ЕРФ.

Полевик на макете опять в корпусе D-Pack: P1703BDS с мёртвенькой материнки.

Ручка не пачкается и вродь ничего не выделяет) С расстояния 10 см дозик её не видит. Замеры проводил по 5, 15 и 30 минут.

 

Surikat
Offline
Зарегистрирован: 13.07.2016

ВСЕМ СПАСИБО ЗА ПОМОЩЬ!

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

ortus пишет:

...колокольчик оповещения опасных уровней ввергает в уныние, заменить бы на значок радиации,...

Берёте программку Image Generate, ставите поле 24х8 пикселов, рисуете картинку по душе :) Сгенерированый софтиной код вставляется в несколько кликов.

Вопос к ortus и остальным собирающим проект. Как должна работать авария по превышению заданного порога? В последней версии с поддержкой сна (ЕМНИП 1.043) я делал так. Сработка - непрерывный сигнал 7 секунд (длительность задаётся в скетче) - выключение сигнала. Или лучше держать сигнал включённым, пока измеряемый фон выше порога?

ortus
Offline
Зарегистрирован: 16.10.2017

Доброго времени суток! Уважаемый Tekaji, спасибо за наводку по программе! Касаемо сигнала тревоги, лично мое, сугубо мое мнение такое, так как оповещений по привышению уровня в программе заведено два (у меня первое привышение порога стоит на 35 микрорентген, до 35 микрорентген включительно является нормой, второй порог у меня стоит 50 микрорентген, это допустимые санитарные значения) При привышении первого порога должен отрабатывать прирывистый короткий сигнал, а вот при сработке второй аварии должен долбить постоянный сигнал секунд 5-7, в общем как реализованно у Вас, но с учетом, что если уровень выше допустимой и санитарной срабатывает вторая авария минуя первую, тем самым человек будет знать какой уровень аварии происходит, так же следует учесть, что варианты реализации звуковой схемы у людей могут быть разные, у кого то по схеме с пассивным бузером, а у кого то и с схемой усиления с генераторным бузей...

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Уровня в дефайнах то два, но тревога в коде (к которой я цеплялся) реализована одна... У меня как раз с активным бузером и транзисторным ключом на выходе ардуинки, попробую сделать и под пассивный бузер. Пока тестирую не наделал ли новых багов при переносе со старой версии (с 11й страницы топика).
З.Ы. Трилистник радиации в 24х8 не влазит. Черепушка тоже)

ortus
Offline
Зарегистрирован: 16.10.2017

Просто с одной стороны, постоянно вопящий прибор, заставляет быстрее двигать булками (вспоминаем самый яркий пример: Терра-П), с другой стороны, у человека который мало знаком с микро, мили, рентгенами с зивертами и тд. , вопящий прибор скорее вызывать будет психосоматическую реакцию, что тоже не айс допустим, не дай боги в критической ситуации, да и вопящий постоянно прибор не кисло так раздражает....

ortus
Offline
Зарегистрирован: 16.10.2017

То же верно, достаточно одного уровня и одного сигнала.... Усложнять не стоит....

ortus
Offline
Зарегистрирован: 16.10.2017

На счет черепушек и трилистников не столь актуально как тревога по звуку, а есть ли возможность заставить включаться и отключаться подсветку в купе с звуковым сигналом аварии?

 

tekagi
tekagi аватар
Offline
Зарегистрирован: 07.10.2016

Думаю, в этом смысла нет, мигающая подсветка снизит информативность дисплея. На полной схеме АрДоса есть вибра (на тестовой плате у меня распаяна) и фонарик, при желании можно прикрутить тактильную тревогу и стробоскоп. А пока со звуком бы разобраться...

ortus
Offline
Зарегистрирован: 16.10.2017

Отличная идея на счет моргания светодиода при привышении фона

Surikat
Offline
Зарегистрирован: 13.07.2016

tekagi пишет:
Думаю, в этом смысла нет, мигающая подсветка снизит информативность дисплея. На полной схеме АрДоса есть вибра (на тестовой плате у меня распаяна) и фонарик, при желании можно прикрутить тактильную тревогу и стробоскоп. А пока со звуком бы разобраться...

я поддерживаю! например звук5 секунд ; вибра + светоиндикацией