1

Тема: AD7793

http://forum.rcl-radio.ru/uploads/images/2022/08/cf7006c4144ade5d2d4fb6e4a7103eec.png


// AD7793
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5

#define AVDD_MONITOR 0b111 // CONF
#define TEMP_SENSOR  0b110 // CONF
#define CH1          0b000 // CONF
#define CH2          0b001 // CONF
#define CH3          0b011 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define GAIN_1       0b000      // CONF
#define GAIN_2       0b001      // CONF
#define GAIN_4       0b010      // CONF
#define GAIN_8       0b011      // CONF
#define GAIN_16      0b100      // CONF
#define GAIN_32      0b101      // CONF
#define GAIN_64      0b110      // CONF
#define GAIN_128     0b111      // CONF

#define F_ADC_500    0b0001 // MODE 
#define F_ADC_250    0b0010 // MODE 
#define F_ADC_125    0b0011 // MODE 
#define F_ADC_62_5   0b0100 // MODE 
#define F_ADC_50_0   0b0101 // MODE 
#define F_ADC_39_2   0b0110 // MODE
#define F_ADC_33_3   0b0111 // MODE 
#define F_ADC_19_6   0b1000 // MODE 
#define F_ADC_16_7   0b1001 // MODE 
#define F_ADC_12_5   0b1011 // MODE 
#define F_ADC_10_0   0b1100 // MODE 
#define F_ADC_8_33   0b1101 // MODE 
#define F_ADC_6_25   0b1110 // MODE  
#define F_ADC_4_17   0b1111 // MODE       

void setup(){ 
  Serial.begin(9600);
  pinMode(SCLK,OUTPUT);pinMode(CS,OUTPUT);pinMode(DIN,OUTPUT);pinMode(DOUT,INPUT);
  digitalWrite(SCLK,HIGH);digitalWrite(CS,HIGH);digitalWrite(DIN,HIGH);
  delay(100);
  reset();
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER 
  write_byte(0x08,(0xC0<<8)|0x0A, 16);// MODE REGISTER System Zero-Scale Calibration
  write_byte(0x08,(0xE0<<8)|0x0A, 16);// MODE REGISTER System Full-Scale Calibration
  Serial.print("Stat ");Serial.println(read_byte(0x40,8),BIN);// STATUS REGISTER
  Serial.print("ID   ");Serial.println(read_byte(0x60,8),BIN);// ID REGISTER 
  Serial.print("Ofst ");Serial.println(read_byte(0x70,24));//OFFSET REGISTER
  Serial.print("ful  ");Serial.println(read_byte(0x78,24));//OFULL-SCALE REGISTER 
  write_byte(0x28,0x00, 8);// IO REGISTER
}
 
void loop(){ 
// READ ADC //////////////////////////////////////////////////////////////////
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_1)<<8)|0x90|CH1, 16); // CONFIGURATION REGISTER 
  long adc = read_byte(0x58,24);
// BIPOLAR  
  Serial.print("Data b_B ");Serial.println(adc-0x800000);//DATA REGISTER
  Serial.print("Data V_B ");Serial.println((1.17/0x800000*(adc-0x800000)),6);//DATA REGISTER 
// UNIPOLAR
//  Serial.print("Data b_U ");Serial.println(adc);//DATA REGISTER
//  Serial.print("Data V_U ");Serial.println((1.17/0xFFFFFF*adc),6);//DATA REGISTER 
  Serial.println();
  delay(5);

// READ AVDD ///////////////////////////////////////////////////////////////////  
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER
    adc = read_byte(0x58,24);
// BIPOLAR  
  Serial.print("Data AV b_B ");Serial.println(adc-0x800000);//DATA REGISTER
  Serial.print("Data AV V_B ");Serial.println((1.17/0x800000*(adc-0x800000)*6),4);//DATA REGISTER 
  Serial.println();
  delay(5);

// TEMP SENSOR ///////////////////////////////////////////////////////////////////  
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_1)<<8)|0x90|TEMP_SENSOR, 16); // CONFIGURATION REGISTER
    adc = read_byte(0x58,24);
// BIPOLAR  
  Serial.print("Data T b_B ");Serial.println(adc-0x800000);//DATA REGISTER
  Serial.print("Data T V_B ");Serial.println(1.170/0x800000*(adc-0x800000),4);//DATA REGISTER 
  Serial.println();
  delay(1000);  
}

void write_byte(byte reg, long data, int bit_){
     digitalWrite(CS,LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH); 
     }
     digitalWrite(CS,HIGH);
     }

     
  long read_byte(byte reg, int bit_){
     digitalWrite(CS,LOW);
  while(digitalRead(DOUT)!=LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW); 
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  while(digitalRead(DOUT)!=LOW); 
  long data_out=0;
  long dat;
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }

void reset(){
     digitalWrite(CS,LOW);   
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }
 

2

Re: AD7793

http://forum.rcl-radio.ru/uploads/images/2022/08/23fe8445ffa370827481e1829202e724.png

http://forum.rcl-radio.ru/uploads/images/2022/08/6243ddd151b0570e6b57e1b746c459d8.png


// AD7793
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5

#define AVDD_MONITOR 0b111 // CONF
#define TEMP_SENSOR  0b110 // CONF
#define CH1          0b000 // CONF
#define CH2          0b001 // CONF
#define CH3          0b011 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define GAIN_1       0b000      // CONF
#define GAIN_2       0b001      // CONF
#define GAIN_4       0b010      // CONF
#define GAIN_8       0b011      // CONF
#define GAIN_16      0b100      // CONF
#define GAIN_32      0b101      // CONF
#define GAIN_64      0b110      // CONF
#define GAIN_128     0b111      // CONF

#define F_ADC_500    0b0001 // MODE 
#define F_ADC_250    0b0010 // MODE 
#define F_ADC_125    0b0011 // MODE 
#define F_ADC_62_5   0b0100 // MODE 
#define F_ADC_50_0   0b0101 // MODE 
#define F_ADC_39_2   0b0110 // MODE
#define F_ADC_33_3   0b0111 // MODE 
#define F_ADC_19_6   0b1000 // MODE 
#define F_ADC_16_7   0b1001 // MODE 
#define F_ADC_12_5   0b1011 // MODE 
#define F_ADC_10_0   0b1100 // MODE 
#define F_ADC_8_33   0b1101 // MODE 
#define F_ADC_6_25   0b1110 // MODE  
#define F_ADC_4_17   0b1111 // MODE       

void setup(){ 
  Serial.begin(9600);
  pinMode(SCLK,OUTPUT);pinMode(CS,OUTPUT);pinMode(DIN,OUTPUT);pinMode(DOUT,INPUT);
  digitalWrite(SCLK,HIGH);digitalWrite(CS,HIGH);digitalWrite(DIN,HIGH);
  delay(100);
  reset();
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER 
  write_byte(0x08,(0xC0<<8)|0x0A, 16);// MODE REGISTER System Zero-Scale Calibration
  write_byte(0x08,(0xE0<<8)|0x0A, 16);// MODE REGISTER System Full-Scale Calibration
  Serial.print("Stat ");Serial.println(read_byte(0x40,8),BIN);// STATUS REGISTER
  Serial.print("ID   ");Serial.println(read_byte(0x60,8),BIN);// ID REGISTER 
  Serial.print("Ofst ");Serial.println(read_byte(0x70,24));//OFFSET REGISTER
  Serial.print("ful  ");Serial.println(read_byte(0x78,24));//OFULL-SCALE REGISTER 
  write_byte(0x28,0x00, 8);// IO REGISTER
}
 
void loop(){ 
// READ ADC //////////////////////////////////////////////////////////////////
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_16)<<8)|0x90|CH1, 16); // CONFIGURATION REGISTER 
  long adc = read_byte(0x58,24);
// BIPOLAR  
  Serial.print("Data b_B ");Serial.println(adc-0x800000);//DATA REGISTER
  Serial.print("Data V_B ");Serial.println((1170.00/0x800000*(adc-0x800000))/16,3);//DATA REGISTER 
  delay(500);  
}

void write_byte(byte reg, long data, int bit_){
     digitalWrite(CS,LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH); 
     }
     digitalWrite(CS,HIGH);
     }

     
  long read_byte(byte reg, int bit_){
     digitalWrite(CS,LOW);
  while(digitalRead(DOUT)!=LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW); 
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  while(digitalRead(DOUT)!=LOW); 
  long data_out=0;
  long dat;
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }

void reset(){
     digitalWrite(CS,LOW);   
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }
 

3

Re: AD7793

AD7793 + термопара

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>   // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <OneWire.h>             // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <EEPROM.h>
 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
 OneWire  ds(6); // Вход датчика 18b20


// AD7793 x16 Umax=73mV CH1_DIFF Fads=4.17Hz
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5

#define AVDD_MONITOR 0b111 // CONF
#define TEMP_SENSOR  0b110 // CONF
#define CH1          0b000 // CONF
#define CH2          0b001 // CONF
#define CH3          0b011 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define GAIN_1       0b000      // CONF
#define GAIN_2       0b001      // CONF
#define GAIN_4       0b010      // CONF
#define GAIN_8       0b011      // CONF
#define GAIN_16      0b100      // CONF
#define GAIN_32      0b101      // CONF
#define GAIN_64      0b110      // CONF
#define GAIN_128     0b111      // CONF

#define F_ADC_500    0b0001 // MODE 
#define F_ADC_250    0b0010 // MODE 
#define F_ADC_125    0b0011 // MODE 
#define F_ADC_62_5   0b0100 // MODE 
#define F_ADC_50_0   0b0101 // MODE 
#define F_ADC_39_2   0b0110 // MODE
#define F_ADC_33_3   0b0111 // MODE 
#define F_ADC_19_6   0b1000 // MODE 
#define F_ADC_16_7   0b1001 // MODE 
#define F_ADC_12_5   0b1011 // MODE 
#define F_ADC_10_0   0b1100 // MODE 
#define F_ADC_8_33   0b1101 // MODE 
#define F_ADC_6_25   0b1110 // MODE  
#define F_ADC_4_17   0b1111 // MODE       

// XA K
 const float a[]{0,2.5173462*10,-1.1662878,-1.08336338,-8.9773540/10,-3.7342377/10,-8.6632643/100,-1.0450598/100,-5.1920577/10000};
 const float a1[]{0,2.508355*10,7.860106/100,-2.503131/10,8.315270/100,-1.228034/100,9.804036/10000,-4.413030/100000,1.057734/1000000,-1.052755*pow(10,-8)};
 const float a2[]{-1.318058*100,4.830222*10,-1.646031,5.464731/100,-9.6550715/10000,8.802193/1000000,-3.110810/100000000};
 // XK L
 const float b[]{1.1573067/10000,1.5884573*10,4.0458554/100,0.3170064,0.1666128,5.146958/100,9.5288883/1000,1.0301283/1000,6.0654431/100000,1.5131878/1000000};
 const float b1[]{7.2069422/1000,1.5775525*10,-0.2261183,9.4286756/1000,-3.5394655/10000,1.0050886/100000,-1.9323678/10000000,2.3816891/1000000000,-1.7130654*pow(10,-11),5.4857331*pow(10,-14)};
 
float temp_ds,u,u0,t_iz;
unsigned long times=millis()+10000;
int menu;

void setup(){ 
  Serial.begin(9600);
  pinMode(SCLK,OUTPUT);pinMode(CS,OUTPUT);pinMode(DIN,OUTPUT);pinMode(DOUT,INPUT);
  digitalWrite(SCLK,HIGH);digitalWrite(CS,HIGH);digitalWrite(DIN,HIGH);
  delay(100);
  reset();
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER 
  write_byte(0x08,(0xC0<<8)|0x0A, 16);// MODE REGISTER System Zero-Scale Calibration
  write_byte(0x08,(0xE0<<8)|0x0A, 16);// MODE REGISTER System Full-Scale Calibration
  Serial.print("Stat ");Serial.println(read_byte(0x40,8),BIN);// STATUS REGISTER
  Serial.print("ID   ");Serial.println(read_byte(0x60,8),BIN);// ID REGISTER 
  Serial.print("Ofst ");Serial.println(read_byte(0x70,24));//OFFSET REGISTER
  Serial.print("ful  ");Serial.println(read_byte(0x78,24));//OFULL-SCALE REGISTER 
  write_byte(0x28,0x00, 8);// IO REGISTER
  pinMode(A0,INPUT_PULLUP);
  menu = EEPROM.read(0);
  lcd.init();lcd.backlight();
  lcd.setCursor(5, 0);lcd.print(F("AD7793"));
  delay(1000);lcd.clear();
}
 
void loop(){ 
// READ ADC //////////////////////////////////////////////////////////////////
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_16)<<8)|0x90|CH1, 16); // CONFIGURATION REGISTER 
  long adc = read_byte(0x58,24);
  u = (1170.00/0x800000*(adc-0x800000))/16;
// BIPOLAR  
  Serial.print("Data b_B ");Serial.println(adc-0x800000);//DATA REGISTER
  Serial.print("Data V_B ");Serial.println((1170.00/0x800000*(adc-0x800000))/16,3);//DATA REGISTER 
// DS18B20 
  if(millis()-times>10000){temp_ds = dsRead(0);times=millis();}
// LCD ///////////////////////////////////////////////////////////////////////  
  if(digitalRead(A0)==LOW){menu++;}
  if(menu>1){menu=0;}
  
  lcd.setCursor(0, 1);lcd.print(u,3);lcd.print("mV  ");
  lcd.setCursor(10, 1);lcd.print(temp_ds,1);lcd.print(char(223)); lcd.print("C  "); 
  if(menu==0){txa(); lcd.setCursor(13,0);lcd.print("TXA");EEPROM.update(0,menu);}
  if(menu==1){txk(); lcd.setCursor(13,0);lcd.print("TXK");EEPROM.update(0,menu);}
  lcd.setCursor(0, 0);
  if(t_iz==-1000){lcd.print("LOW      ");}
  else if(t_iz==10000){lcd.print("HIGH     ");}
  else{lcd.print(t_iz,2);lcd.print(char(223)); lcd.print("C  "); }
  
  delay(10);  
}

void write_byte(byte reg, long data, int bit_){
     digitalWrite(CS,LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH); 
     }
     digitalWrite(CS,HIGH);
     }

     
  long read_byte(byte reg, int bit_){
     digitalWrite(CS,LOW);
  while(digitalRead(DOUT)!=LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW); 
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  while(digitalRead(DOUT)!=LOW); 
  long data_out=0;
  long dat;
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }

void reset(){
     digitalWrite(CS,LOW);   
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  data[0] = ds.read();// Чтение памяти byte low
  data[1] = ds.read();// Чтение памяти byte high
  float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
} 

void txa(){u0=u+temp_ds*0.0400;// окружающая температура 0.0400 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXA(K)
if(u0<0){t_iz=(a[0]*pow(u0,0))+(a[1]*pow(u0,1))+(a[2]*pow(u0,2))+(a[3]*pow(u0,3))+(a[4]*pow(u0,4))+(a[5]*pow(u0,5))+(a[6]*pow(u0,6))+(a[7]*pow(u0,7))+(a[8]*pow(u0,8));}
if(u0>=0&&u0<=20.64){t_iz=(a1[0]*pow(u0,0))+(a1[1]*pow(u0,1))+(a1[2]*pow(u0,2))+(a1[3]*pow(u0,3))+(a1[4]*pow(u0,4))+(a1[5]*pow(u0,5))+(a1[6]*pow(u0,6))+(a1[7]*pow(u0,7))+(a1[8]*pow(u0,8))+(a1[9]*pow(u0,9));}
if(u0>20.64){t_iz=(a2[0]*pow(u0,0))+(a2[1]*pow(u0,1))+(a2[2]*pow(u0,2))+(a2[3]*pow(u0,3))+(a2[4]*pow(u0,4))+(a2[5]*pow(u0,5))+(a2[6]*pow(u0,6));}
if(u<-6.35){t_iz=-1000;} if(u>54.9){t_iz=10000;}}
 
void txk(){u0=u+temp_ds*0.06476;// окружающая температура 0.06476 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXK(L)
if(u0<0){t_iz=(b[0]*pow(u0,0))+(b[1]*pow(u0,1))+(b[2]*pow(u0,2))+(b[3]*pow(u0,3))+(b[4]*pow(u0,4))+(b[5]*pow(u0,5))+(b[6]*pow(u0,6))+(b[7]*pow(u0,7))+(b[8]*pow(u0,8))+(b[9]*pow(u0,9));}
if(u0>=0){t_iz=(b1[0]*pow(u0,0))+(b1[1]*pow(u0,1))+(b1[2]*pow(u0,2))+(b1[3]*pow(u0,3))+(b1[4]*pow(u0,4))+(b1[5]*pow(u0,5))+(b1[6]*pow(u0,6))+(b1[7]*pow(u0,7))+(b1[8]*pow(u0,8))+(b1[9]*pow(u0,9));}
if(u<-9.49){t_iz=-1000;} if(u>66.47){t_iz=10000;}
}

4

Re: AD7793

AD7793 + термопара + терморегулятор

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>   // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>             // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <OneWire.h>             // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <EEPROM.h>
#include <MsTimer2.h>            // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 

 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
 OneWire  ds(6); // Вход датчика 18b20
 Encoder myEnc(8, 9);// DT, CLK


// AD7793 x16 Umax=73mV CH1_DIFF Fads=4.17Hz
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5

#define AVDD_MONITOR 0b111 // CONF
#define TEMP_SENSOR  0b110 // CONF
#define CH1          0b000 // CONF
#define CH2          0b001 // CONF
#define CH3          0b011 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define GAIN_1       0b000      // CONF
#define GAIN_2       0b001      // CONF
#define GAIN_4       0b010      // CONF
#define GAIN_8       0b011      // CONF
#define GAIN_16      0b100      // CONF
#define GAIN_32      0b101      // CONF
#define GAIN_64      0b110      // CONF
#define GAIN_128     0b111      // CONF

#define F_ADC_500    0b0001 // MODE 
#define F_ADC_250    0b0010 // MODE 
#define F_ADC_125    0b0011 // MODE 
#define F_ADC_62_5   0b0100 // MODE 
#define F_ADC_50_0   0b0101 // MODE 
#define F_ADC_39_2   0b0110 // MODE
#define F_ADC_33_3   0b0111 // MODE 
#define F_ADC_19_6   0b1000 // MODE 
#define F_ADC_16_7   0b1001 // MODE 
#define F_ADC_12_5   0b1011 // MODE 
#define F_ADC_10_0   0b1100 // MODE 
#define F_ADC_8_33   0b1101 // MODE 
#define F_ADC_6_25   0b1110 // MODE  
#define F_ADC_4_17   0b1111 // MODE       

// XA K
 const float a[]{0,2.5173462*10,-1.1662878,-1.08336338,-8.9773540/10,-3.7342377/10,-8.6632643/100,-1.0450598/100,-5.1920577/10000};
 const float a1[]{0,2.508355*10,7.860106/100,-2.503131/10,8.315270/100,-1.228034/100,9.804036/10000,-4.413030/100000,1.057734/1000000,-1.052755*pow(10,-8)};
 const float a2[]{-1.318058*100,4.830222*10,-1.646031,5.464731/100,-9.6550715/10000,8.802193/1000000,-3.110810/100000000};
 // XK L
 const float b[]{1.1573067/10000,1.5884573*10,4.0458554/100,0.3170064,0.1666128,5.146958/100,9.5288883/1000,1.0301283/1000,6.0654431/100000,1.5131878/1000000};
 const float b1[]{7.2069422/1000,1.5775525*10,-0.2261183,9.4286756/1000,-3.5394655/10000,1.0050886/100000,-1.9323678/10000000,2.3816891/1000000000,-1.7130654*pow(10,-11),5.4857331*pow(10,-14)};
 
float temp_ds,u,u0,t_iz;
unsigned long times,times_enc,times_eeprom,oldPosition  = -999,newPosition;;
int menu,reg;
bool w,start=1;
float gis=0.2; // гистерезис

void setup(){ 
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(SCLK,OUTPUT);pinMode(CS,OUTPUT);pinMode(DIN,OUTPUT);pinMode(DOUT,INPUT);
  digitalWrite(SCLK,HIGH);digitalWrite(CS,HIGH);digitalWrite(DIN,HIGH);
  delay(100);
  reset();
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER 
  write_byte(0x08,(0xC0<<8)|0x0A, 16);// MODE REGISTER System Zero-Scale Calibration
  write_byte(0x08,(0xE0<<8)|0x0A, 16);// MODE REGISTER System Full-Scale Calibration
  Serial.print("Stat ");Serial.println(read_byte(0x40,8),BIN);// STATUS REGISTER
  Serial.print("ID   ");Serial.println(read_byte(0x60,8),BIN);// ID REGISTER 
  Serial.print("Ofst ");Serial.println(read_byte(0x70,24));//OFFSET REGISTER
  Serial.print("ful  ");Serial.println(read_byte(0x78,24));//OFULL-SCALE REGISTER 
  write_byte(0x28,0x00, 8);// IO REGISTER
  pinMode(10,INPUT);
  pinMode(13,OUTPUT);
  menu = EEPROM.read(0);reg = EEPROM.read(1)*256 + EEPROM.read(2);
  lcd.init();lcd.backlight();
  lcd.setCursor(5, 0);lcd.print(F("AD7793"));
  delay(1000);lcd.clear();
}
 
void loop(){ 
// ENCODER ///////////////////////////////////////////////////////////////////
 if(newPosition != oldPosition){oldPosition = newPosition;
  reg=reg+newPosition;myEnc.write(0);newPosition=0;times_enc=millis();times_eeprom=millis();w=1;
  if(menu==0&&reg>1350){reg=1350;}if(menu==0&&reg<-270){reg=-270;}
  if(menu==1&&reg>800){reg=800;}if(menu==1&&reg<-200){reg=-200;}
  }
// READ ADC //////////////////////////////////////////////////////////////////
if(millis()-times_enc>1000||start==1){  
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_16)<<8)|0x90|CH1, 16); // CONFIGURATION REGISTER 
  long adc = read_byte(0x58,24);
  u = (1170.00/0x800000*(adc-0x800000))/16;
// BIPOLAR  
  Serial.print("Data b_B ");Serial.println(adc-0x800000);//DATA REGISTER
  Serial.print("Data V_B ");Serial.println((1170.00/0x800000*(adc-0x800000))/16,3);//DATA REGISTER 
// DS18B20 
  if(millis()-times>10000||start==1){temp_ds = dsRead(0);times=millis();}
  start=0;
}
// LCD ///////////////////////////////////////////////////////////////////////  
  if(digitalRead(10)==LOW){menu++;}
  if(menu>1){menu=0;}
  
  lcd.setCursor(0, 1);lcd.print(u,3);lcd.print("mV  ");
  lcd.setCursor(10, 1);lcd.print(reg); lcd.print(" ");lcd.setCursor(14, 1);lcd.print(char(223)); lcd.print("C  ");
  if(menu==0){txa(); lcd.setCursor(13,0);lcd.print("TXA");EEPROM.update(0,menu);}
  if(menu==1){txk(); lcd.setCursor(13,0);lcd.print("TXK");EEPROM.update(0,menu);}
  lcd.setCursor(0, 0);
  if(t_iz==-1000){lcd.print("LOW      ");}
  else if(t_iz==10000){lcd.print("HIGH     ");}
  else{lcd.print(t_iz,2);lcd.print(char(223)); lcd.print("C  "); }
// rele + gis ////////////////////////
  if(reg >= t_iz + gis){digitalWrite(13,HIGH);lcd.setCursor(10,0);lcd.print("H");}
  if(reg <= t_iz - gis){digitalWrite(13,LOW);lcd.setCursor(10,0);lcd.print("L");} 

////////////////////// eeprom ////////////////////////////////////////  
  if(w==1&&millis()-times_eeprom>10000){ 
   EEPROM.update(1,highByte(reg)); EEPROM.update(2,lowByte(reg));w=0;}   
  delay(10);  
}

void write_byte(byte reg, long data, int bit_){
     digitalWrite(CS,LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH); 
     }
     digitalWrite(CS,HIGH);
     }

     
  long read_byte(byte reg, int bit_){
     digitalWrite(CS,LOW);
  while(digitalRead(DOUT)!=LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW); 
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  while(digitalRead(DOUT)!=LOW); 
  long data_out=0;
  long dat;
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }

void reset(){
     digitalWrite(CS,LOW);   
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  data[0] = ds.read();// Чтение памяти byte low
  data[1] = ds.read();// Чтение памяти byte high
  float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
} 

void txa(){u0=u+temp_ds*0.0400;// окружающая температура 0.0400 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXA(K)
if(u0<0){t_iz=(a[0]*pow(u0,0))+(a[1]*pow(u0,1))+(a[2]*pow(u0,2))+(a[3]*pow(u0,3))+(a[4]*pow(u0,4))+(a[5]*pow(u0,5))+(a[6]*pow(u0,6))+(a[7]*pow(u0,7))+(a[8]*pow(u0,8));}
if(u0>=0&&u0<=20.64){t_iz=(a1[0]*pow(u0,0))+(a1[1]*pow(u0,1))+(a1[2]*pow(u0,2))+(a1[3]*pow(u0,3))+(a1[4]*pow(u0,4))+(a1[5]*pow(u0,5))+(a1[6]*pow(u0,6))+(a1[7]*pow(u0,7))+(a1[8]*pow(u0,8))+(a1[9]*pow(u0,9));}
if(u0>20.64){t_iz=(a2[0]*pow(u0,0))+(a2[1]*pow(u0,1))+(a2[2]*pow(u0,2))+(a2[3]*pow(u0,3))+(a2[4]*pow(u0,4))+(a2[5]*pow(u0,5))+(a2[6]*pow(u0,6));}
if(u<-6.35){t_iz=-1000;} if(u>54.9){t_iz=10000;}}
 
void txk(){u0=u+temp_ds*0.06476;// окружающая температура 0.06476 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXK(L)
if(u0<0){t_iz=(b[0]*pow(u0,0))+(b[1]*pow(u0,1))+(b[2]*pow(u0,2))+(b[3]*pow(u0,3))+(b[4]*pow(u0,4))+(b[5]*pow(u0,5))+(b[6]*pow(u0,6))+(b[7]*pow(u0,7))+(b[8]*pow(u0,8))+(b[9]*pow(u0,9));}
if(u0>=0){t_iz=(b1[0]*pow(u0,0))+(b1[1]*pow(u0,1))+(b1[2]*pow(u0,2))+(b1[3]*pow(u0,3))+(b1[4]*pow(u0,4))+(b1[5]*pow(u0,5))+(b1[6]*pow(u0,6))+(b1[7]*pow(u0,7))+(b1[8]*pow(u0,8))+(b1[9]*pow(u0,9));}
if(u<-9.49){t_iz=-1000;} if(u>66.47){t_iz=10000;}
}

void to_Timer(){newPosition = myEnc.read()/4;} 

5

Re: AD7793

AD7793 + термопара + термосопротивление + терморегулятор

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>   // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Encoder.h>             // http://rcl-radio.ru/wp-content/uploads/2019/05/Encoder.zip 
#include <OneWire.h>             // http://rcl-radio.ru/wp-content/uploads/2018/07/OneWire.zip
#include <EEPROM.h>
#include <MsTimer2.h>            // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip 

 LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей
 OneWire  ds(6); // Вход датчика 18b20
 Encoder myEnc(8, 9);// DT, CLK


// AD7793 x16 Umax=73mV CH1_DIFF Fads=4.17Hz
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5

#define AVDD_MONITOR 0b111 // CONF
#define TEMP_SENSOR  0b110 // CONF
#define CH1          0b000 // CONF
#define CH2          0b001 // CONF
#define CH3          0b011 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define GAIN_1       0b000      // CONF
#define GAIN_2       0b001      // CONF
#define GAIN_4       0b010      // CONF
#define GAIN_8       0b011      // CONF
#define GAIN_16      0b100      // CONF
#define GAIN_32      0b101      // CONF
#define GAIN_64      0b110      // CONF
#define GAIN_128     0b111      // CONF

#define F_ADC_500    0b0001 // MODE 
#define F_ADC_250    0b0010 // MODE 
#define F_ADC_125    0b0011 // MODE 
#define F_ADC_62_5   0b0100 // MODE 
#define F_ADC_50_0   0b0101 // MODE 
#define F_ADC_39_2   0b0110 // MODE
#define F_ADC_33_3   0b0111 // MODE 
#define F_ADC_19_6   0b1000 // MODE 
#define F_ADC_16_7   0b1001 // MODE 
#define F_ADC_12_5   0b1011 // MODE 
#define F_ADC_10_0   0b1100 // MODE 
#define F_ADC_8_33   0b1101 // MODE 
#define F_ADC_6_25   0b1110 // MODE  
#define F_ADC_4_17   0b1111 // MODE       

// XA K
 const float a[]{0,2.5173462*10,-1.1662878,-1.08336338,-8.9773540/10,-3.7342377/10,-8.6632643/100,-1.0450598/100,-5.1920577/10000};
 const float a1[]{0,2.508355*10,7.860106/100,-2.503131/10,8.315270/100,-1.228034/100,9.804036/10000,-4.413030/100000,1.057734/1000000,-1.052755*pow(10,-8)};
 const float a2[]{-1.318058*100,4.830222*10,-1.646031,5.464731/100,-9.6550715/10000,8.802193/1000000,-3.110810/100000000};
 // XK L
 const float b[]{1.1573067/10000,1.5884573*10,4.0458554/100,0.3170064,0.1666128,5.146958/100,9.5288883/1000,1.0301283/1000,6.0654431/100000,1.5131878/1000000};
 const float b1[]{7.2069422/1000,1.5775525*10,-0.2261183,9.4286756/1000,-3.5394655/10000,1.0050886/100000,-1.9323678/10000000,2.3816891/1000000000,-1.7130654*pow(10,-11),5.4857331*pow(10,-14)};
 
float temp_ds,u,u0,t_iz;
unsigned long times,times_enc,times_eeprom,oldPosition  = -999,newPosition;;
int menu,reg;
bool w,start=1;
/// калибровка
float gis=0.2;
float i_1ma = 1.0137;
float r_0_kall = 0.29;

void setup(){ 
  Serial.begin(9600);
  MsTimer2::set(1, to_Timer);MsTimer2::start();
  pinMode(SCLK,OUTPUT);pinMode(CS,OUTPUT);pinMode(DIN,OUTPUT);pinMode(DOUT,INPUT);
  digitalWrite(SCLK,HIGH);digitalWrite(CS,HIGH);digitalWrite(DIN,HIGH);
  delay(100);
  reset();
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((UNIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER 
  write_byte(0x08,(0xC0<<8)|0x0A, 16);delay(10);// MODE REGISTER System Zero-Scale Calibration
  write_byte(0x08,(0xE0<<8)|0x0A, 16);delay(10);// MODE REGISTER System Full-Scale Calibration
  Serial.print("Stat ");Serial.println(read_byte(0x40,8),BIN);// STATUS REGISTER
  Serial.print("ID   ");Serial.println(read_byte(0x60,8),BIN);// ID REGISTER 
  Serial.print("Ofst ");Serial.println(read_byte(0x70,24));//OFFSET REGISTER
  Serial.print("ful  ");Serial.println(read_byte(0x78,24));//OFULL-SCALE REGISTER 
  write_byte(0x28,0b00001011, 8);// IO REGISTER 2mA
  pinMode(10,INPUT);
  pinMode(13,OUTPUT);
  menu = EEPROM.read(0);reg = EEPROM.read(1)*256 + EEPROM.read(2);
  lcd.init();lcd.backlight();
  lcd.setCursor(5, 0);lcd.print(F("AD7793"));
  delay(1000);lcd.clear();
}
 
void loop(){ 
// ENCODER ///////////////////////////////////////////////////////////////////
 if(newPosition != oldPosition){oldPosition = newPosition;
  reg=reg+newPosition;myEnc.write(0);newPosition=0;times_enc=millis();times_eeprom=millis();w=1;
  if(menu==0&&reg>1350){reg=1350;}if(menu==0&&reg<-270){reg=-270;}
  if(menu==1&&reg>800){reg=800;}if(menu==1&&reg<-200){reg=-200;}
  if(menu==2&&reg>850){reg=850;}if(menu==1&&reg<-200){reg=-200;}
  }
  
/// termopara ///////////////////  
// READ ADC //////////////////////////////////////////////////////////////////
if((millis()-times_enc>1000||start==1)&&menu<2){  
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((BIPOLAR|GAIN_16)<<8)|0x90|CH1, 16); // CONFIGURATION REGISTER 
  long adc = read_byte(0x58,24);
  u = (1170.00/0x800000*(adc-0x800000))/16;
// BIPOLAR  
  Serial.print("Data b_B ");Serial.println(adc-0x800000);//DATA REGISTER
  Serial.print("Data V_B ");Serial.println((1170.00/0x800000*(adc-0x800000))/16,3);//DATA REGISTER 
// DS18B20 
  if(millis()-times>10000||start==1){temp_ds = dsRead(0);times=millis();}
  start=0;
}
/// end termopara

// READ ADC //////////////////////////////////////////////////////////////////
if(millis()-times_enc>1000&&menu>1){  
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((UNIPOLAR|GAIN_1)<<8)|0x90|CH2, 16); // CONFIGURATION REGISTER 
  long adc = read_byte(0x58,24);
  u = (1170.00/0xFFFFFF*adc)/i_1ma/2 + r_0_kall;// 2mA
// UNIPOLAR
  Serial.print("Data b_U ");Serial.println(adc);//DATA REGISTER
  Serial.print("Data V_U ");Serial.println((1170.00/0xFFFFFF*adc)/1,3);//DATA REGISTER 

  
}

// LCD ///////////////////////////////////////////////////////////////////////  
  if(digitalRead(10)==LOW){menu++;EEPROM.update(0,menu);}
  if(menu>2){menu=0;}
  
  lcd.setCursor(0, 1);
  if(menu<2){lcd.print(u,3);lcd.print("mV  ");}else{lcd.print(u,2);lcd.print(" Om ");}
  lcd.setCursor(10, 1);lcd.print(reg); lcd.print(" ");lcd.setCursor(14, 1);lcd.print(char(223)); lcd.print("C  ");
  if(menu==0){txa(); lcd.setCursor(12,0);lcd.print(" TXA");}
  if(menu==1){txk(); lcd.setCursor(12,0);lcd.print(" TXK");}
  if(menu==2){p100(); lcd.setCursor(12,0);lcd.print("100P");}
  lcd.setCursor(0, 0);
  if(t_iz==-1000){lcd.print("LOW      ");}
  else if(t_iz==10000){lcd.print("HIGH     ");}
  else{lcd.print(t_iz,2);lcd.print(char(223)); lcd.print("C "); }
// rele + gis ////////////////////////
  if(reg >= t_iz + gis){digitalWrite(13,HIGH);lcd.setCursor(10,0);lcd.print("H");}
  if(reg <= t_iz - gis){digitalWrite(13,LOW);lcd.setCursor(10,0);lcd.print("L");} 

////////////////////// eeprom ////////////////////////////////////////  
  if(w==1&&millis()-times_eeprom>10000){ 
   EEPROM.update(1,highByte(reg)); EEPROM.update(2,lowByte(reg));w=0;}   
  delay(10);  
}

void write_byte(byte reg, long data, int bit_){
     digitalWrite(CS,LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH); 
     }
     digitalWrite(CS,HIGH);
     }

     
  long read_byte(byte reg, int bit_){
     digitalWrite(CS,LOW);
  while(digitalRead(DOUT)!=LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW); 
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  while(digitalRead(DOUT)!=LOW); 
  long data_out=0;
  long dat;
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }

void reset(){
     digitalWrite(CS,LOW);   
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }

float dsRead(byte x) {
  byte data[2], addr[8][8], kol = 0;
  while (ds.search(addr[kol])) {  // поиск датчиков, определение адреса и кол-ва датчиков
    kol++;
  } 
  ds.reset_search();  // Сброс поиска датчика
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0x44, 0);  // Измерение температуры с переносом данных в память
  ds.reset();         // Инициализация, выполняется сброс шины
  ds.select(addr[x]); // Обращение к датчику по адресу
  ds.write(0xBE);     // Обращение памяти
  data[0] = ds.read();// Чтение памяти byte low
  data[1] = ds.read();// Чтение памяти byte high
  float value = ((data[1] << 8) | data[0]) / 16.0; return (float)value; // Расчет температуры и вывод
} 

void txa(){u0=u+temp_ds*0.0400;// окружающая температура 0.0400 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXA(K)
if(u0<0){t_iz=(a[0]*pow(u0,0))+(a[1]*pow(u0,1))+(a[2]*pow(u0,2))+(a[3]*pow(u0,3))+(a[4]*pow(u0,4))+(a[5]*pow(u0,5))+(a[6]*pow(u0,6))+(a[7]*pow(u0,7))+(a[8]*pow(u0,8));}
if(u0>=0&&u0<=20.64){t_iz=(a1[0]*pow(u0,0))+(a1[1]*pow(u0,1))+(a1[2]*pow(u0,2))+(a1[3]*pow(u0,3))+(a1[4]*pow(u0,4))+(a1[5]*pow(u0,5))+(a1[6]*pow(u0,6))+(a1[7]*pow(u0,7))+(a1[8]*pow(u0,8))+(a1[9]*pow(u0,9));}
if(u0>20.64){t_iz=(a2[0]*pow(u0,0))+(a2[1]*pow(u0,1))+(a2[2]*pow(u0,2))+(a2[3]*pow(u0,3))+(a2[4]*pow(u0,4))+(a2[5]*pow(u0,5))+(a2[6]*pow(u0,6));}
if(u<-6.35){t_iz=-1000;} if(u>54.9){t_iz=10000;}}
 
void txk(){u0=u+temp_ds*0.06476;// окружающая температура 0.06476 мВ на 1 гр.Цельсия от 0 до 40 гр.Цельсия для TXK(L)
if(u0<0){t_iz=(b[0]*pow(u0,0))+(b[1]*pow(u0,1))+(b[2]*pow(u0,2))+(b[3]*pow(u0,3))+(b[4]*pow(u0,4))+(b[5]*pow(u0,5))+(b[6]*pow(u0,6))+(b[7]*pow(u0,7))+(b[8]*pow(u0,8))+(b[9]*pow(u0,9));}
if(u0>=0){t_iz=(b1[0]*pow(u0,0))+(b1[1]*pow(u0,1))+(b1[2]*pow(u0,2))+(b1[3]*pow(u0,3))+(b1[4]*pow(u0,4))+(b1[5]*pow(u0,5))+(b1[6]*pow(u0,6))+(b1[7]*pow(u0,7))+(b1[8]*pow(u0,8))+(b1[9]*pow(u0,9));}
if(u<-9.49){t_iz=-1000;} if(u>66.47){t_iz=10000;}
}

void p100(){if(u>=100.00){t_iz=(sqrt(0.000015752961+0.0000023364*(1-u/100.00))-0.003969 )/-0.0000011682;}
if(u<100.00){t_iz=251.903*(pow(u/100.00-1,1)) + 8.80035*(pow(u/100.00-1,2)) - 2.91506 *(pow(u/100.00-1,3)) + 1.67611*(pow(u/100.00-1,4));}
if(u<17.24){t_iz=-1000;} if(u>395.16){t_iz=10000;}
  }

void to_Timer(){newPosition = myEnc.read()/4;} 

6

Re: AD7793

http://forum.rcl-radio.ru/uploads/images/2022/08/8ca5186f9a957fe535879f53c2c7703a.png


AD7793 МИЛЛИОММЕТР 0...32 Ом

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>   // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
LiquidCrystal_I2C lcd(0x27,16,2);  // Устанавливаем дисплей

// AD7793 DVDD = 5V | AVDD = 5V | R = 0...32 Om
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5

#define AVDD_MONITOR 0b111 // CONF
#define TEMP_SENSOR  0b110 // CONF
#define CH1          0b000 // CONF
#define CH2          0b001 // CONF
#define CH3          0b011 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define GAIN_1       0b000      // CONF
#define GAIN_2       0b001      // CONF
#define GAIN_4       0b010      // CONF
#define GAIN_8       0b011      // CONF
#define GAIN_16      0b100      // CONF
#define GAIN_32      0b101      // CONF
#define GAIN_64      0b110      // CONF
#define GAIN_128     0b111      // CONF

#define F_ADC_500    0b0001 // MODE 
#define F_ADC_250    0b0010 // MODE 
#define F_ADC_125    0b0011 // MODE 
#define F_ADC_62_5   0b0100 // MODE 
#define F_ADC_50_0   0b0101 // MODE 
#define F_ADC_39_2   0b0110 // MODE
#define F_ADC_33_3   0b0111 // MODE 
#define F_ADC_19_6   0b1000 // MODE 
#define F_ADC_16_7   0b1001 // MODE 
#define F_ADC_12_5   0b1011 // MODE 
#define F_ADC_10_0   0b1100 // MODE 
#define F_ADC_8_33   0b1101 // MODE 
#define F_ADC_6_25   0b1110 // MODE  
#define F_ADC_4_17   0b1111 // MODE   

#define R_100        99.969  
#define K_0          0.0025
#define K_AVDD       6.065

 byte v1[8] = {0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07};
 byte v2[8] = {0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00};      
 byte v3[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F};
 byte v4[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x1F,0x1F};
 byte v5[8] = {0x1C,0x1C,0x00,0x00,0x00,0x00,0x1C,0x1C};
 byte v6[8] = {0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C,0x1C};
 byte v7[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07};
 byte v8[8] = {0x1F,0x1F,0x00,0x00,0x00,0x00,0x00,0x00};
 byte d1,d2,d3,d4,d5,d6,e1,e2,e3,a[6],x;


void setup(){ 
  Serial.begin(9600);
  pinMode(SCLK,OUTPUT);pinMode(CS,OUTPUT);pinMode(DIN,OUTPUT);pinMode(DOUT,INPUT);
  digitalWrite(SCLK,HIGH);digitalWrite(CS,HIGH);digitalWrite(DIN,HIGH);
  delay(100);
  reset();
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((UNIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER 
  write_byte(0x08,(0xC0<<8)|0x0A, 16);delay(100);// MODE REGISTER System Zero-Scale Calibration
  write_byte(0x08,(0xE0<<8)|0x0A, 16);delay(100);// MODE REGISTER System Full-Scale Calibration
  Serial.print("Stat ");Serial.println(read_byte(0x40,8),BIN);// STATUS REGISTER
  Serial.print("ID   ");Serial.println(read_byte(0x60,8),BIN);// ID REGISTER 
  Serial.print("Ofst ");Serial.println(read_byte(0x70,24));//OFFSET REGISTER
  Serial.print("ful  ");Serial.println(read_byte(0x78,24));//OFULL-SCALE REGISTER 
  write_byte(0x28,0x00, 8);// IO REGISTER 
  lcd.init();lcd.backlight();
  lcd.createChar(1, v1);lcd.createChar(2, v2);lcd.createChar(3, v3);lcd.createChar(4, v4);
  lcd.createChar(5, v5);lcd.createChar(6, v6);lcd.createChar(7, v7);lcd.createChar(8, v8);
  lcd.setCursor(5, 0);lcd.print(F("AD7793"));
  delay(1000);lcd.clear();
}
 
void loop(){ 
// READ ADC //////////////////////////////////////////////////////////////////  
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((UNIPOLAR|GAIN_1)<<8)|0x90|CH2, 16); // CONFIGURATION REGISTER 
  long adc = read_byte(0x58,24);
  float u = 1170.00/0xFFFFFF*adc/1;
  Serial.print("DATA:  ");Serial.println(adc);
  delay(1);
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
  write_byte(0x10,((UNIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER
  adc = read_byte(0x58,24);
  float u_100 = 1170.00/0xFFFFFF*adc*K_AVDD;
  delay(1);  
  float r = ((R_100*u)/(u_100-u))-K_0;
  long number = r*10000;
  Serial.print("R_NUM: ");Serial.println(number);
  Serial.print("AVDD:  ");Serial.println(u_100);
  Serial.println();
/// R < 10 
if(r<10){
     a[0]=number/10000;
     a[1]=number/1000%10;
     a[2]=number/100%10;
     a[3]=number/10%10;
     a[4]=number%10;
   for(x=0;x<5;x++){
    switch(x){
        case 0: e1=0;e2=1,e3=2;break;
        case 1: e1=4,e2=5,e3=6;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
        case 4: e1=13,e2=14,e3=15;break;
   }digit();}
   lcd.setCursor(3,1);lcd.print(".");lcd.setCursor(3,0);lcd.print(" ");
}
/// R > 10 
if(r>=10){
  if(number>319999){number=319999;lcd.setCursor(6,0);lcd.print("*");}
  else{lcd.setCursor(6,0);lcd.print(" ");}
     a[0]=number/100000;
     a[1]=number/10000%10;
     a[2]=number/1000%10;
     a[3]=number/100%10;
     a[4]=number/10%10;
   for(x=0;x<5;x++){
    switch(x){
        case 0: e1=0;e2=1,e3=2;break;
        case 1: e1=3,e2=4,e3=5;break;
        case 2: e1=7,e2=8,e3=9;break;
        case 3: e1=10,e2=11,e3=12;break;
        case 4: e1=13,e2=14,e3=15;break;
   }digit();}
   lcd.setCursor(6,1);lcd.print(".");
}
}

void digit(){
  switch(a[x]){
    case 0: d1=1,d2=8,d3=6,d4=1,d5=3,d6=6;break;
    case 1: d1=32,d2=2,d3=6,d4=32,d5=32,d6=6;break;
    case 2: d1=2,d2=8,d3=6,d4=1,d5=4,d6=5;break;
    case 3: d1=2,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    case 4: d1=1,d2=3,d3=6,d4=32,d5=32,d6=6;break;
    case 5: d1=1,d2=4,d3=5,d4=7,d5=3,d6=6;break;
    case 6: d1=1,d2=4,d3=5,d4=1,d5=3,d6=6;break;
    case 7: d1=1,d2=8,d3=6,d4=32,d5=32,d6=6;break;
    case 8: d1=1,d2=4,d3=6,d4=1,d5=3,d6=6;break;
    case 9: d1=1,d2=4,d3=6,d4=7,d5=3,d6=6;break;
    case 10:d1=150,d2=150,d3=150,d4=150,d5=150,d6=150;break;
    }
lcd.setCursor(e1,0);lcd.write((uint8_t)d1);
lcd.setCursor(e2,0);lcd.write((uint8_t)d2);lcd.setCursor(e3,0);lcd.write((uint8_t)d3);lcd.setCursor(e1,1);
lcd.write((uint8_t)d4);lcd.setCursor(e2,1);lcd.write((uint8_t)d5);lcd.setCursor(e3,1);lcd.write((uint8_t)d6);}

void write_byte(byte reg, long data, int bit_){
     digitalWrite(CS,LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH); 
     }
     digitalWrite(CS,HIGH);
     }

     
  long read_byte(byte reg, int bit_){
     digitalWrite(CS,LOW);
  while(digitalRead(DOUT)!=LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW); 
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  while(digitalRead(DOUT)!=LOW); 
  long data_out=0;
  long dat;
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }

void reset(){
     digitalWrite(CS,LOW);   
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }

7

Re: AD7793

Поясните write_byte не компилируется как поправить?
write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER

8

Re: AD7793

Опубликуйте скетч который используете.

9

Re: AD7793

использую :
// AD7793
#define SCLK   2
#define CS     3
#define DIN    4
#define DOUT   5

#define AVDD_MONITOR 0b111 // CONF
#define TEMP_SENSOR  0b110 // CONF
#define CH1          0b000 // CONF
#define CH2          0b001 // CONF
#define CH3          0b011 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define BIPOLAR      0b00000000 // CONF
#define UNIPOLAR     0b00010000 // CONF
#define GAIN_1       0b000      // CONF
#define GAIN_2       0b001      // CONF
#define GAIN_4       0b010      // CONF
#define GAIN_8       0b011      // CONF
#define GAIN_16      0b100      // CONF
#define GAIN_32      0b101      // CONF
#define GAIN_64      0b110      // CONF
#define GAIN_128     0b111      // CONF 
#define F_ADC_500    0b0001 // MODE
#define F_ADC_250    0b0010 // MODE
#define F_ADC_125    0b0011 // MODE
#define F_ADC_62_5   0b0100 // MODE
#define F_ADC_50_0   0b0101 // MODE
#define F_ADC_39_2   0b0110 // MODE
#define F_ADC_33_3   0b0111 // MODE
#define F_ADC_19_6   0b1000 // MODE
#define F_ADC_16_7   0b1001 // MODE
#define F_ADC_12_5   0b1011 // MODE
#define F_ADC_10_0   0b1100 // MODE
#define F_ADC_8_33   0b1101 // MODE
#define F_ADC_6_25   0b1110 // MODE 
#define F_ADC_4_17   0b1111 // MODE




void setup()
{
Serial.begin(9600);
  pinMode(SCLK,OUTPUT);pinMode(CS,OUTPUT);pinMode(DIN,OUTPUT);pinMode(DOUT,INPUT);
  digitalWrite(SCLK,HIGH);digitalWrite(CS,HIGH);digitalWrite(DIN,HIGH);
  delay(100);
  //reset();
  write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER
//  write_byte(0x10,((BIPOLAR|GAIN_1)<<8)|0x90|AVDD_MONITOR, 16); // CONFIGURATION REGISTER
// write_byte(0x08,(0xC0<<8)|0x0A, 16);// MODE REGISTER System Zero-Scale Calibration
//  write_byte(0x08,(0xE0<<8)|0x0A, 16);// MODE REGISTER System Full-Scale Calibration
//  Serial.print("Stat ");Serial.println(read_byte(0x40,8),BIN);// STATUS REGISTER
//  Serial.print("ID   ");Serial.println(read_byte(0x60,8),BIN);// ID REGISTER
//  Serial.print("Ofst ");Serial.println(read_byte(0x70,24));//OFFSET REGISTER
//  Serial.print("ful  ");Serial.println(read_byte(0x78,24));//OFULL-SCALE REGISTER
// write_byte(0x28,0x00, 8);// IO REGISTER
 
}
  void loop()
{

}

10

Re: AD7793

Он же не полный.

11

Re: AD7793

сообщение об ошибке
Arduino: 1.8.13 (Windows 10), Плата:"Arduino Nano, ATmega328P"
Компиляция скетча...

"D:\\arduino-1.0.1\\arduino-1.8.13\\arduino-1.8.13-windows\\arduino-1.8.13\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_NANO -DARDUINO_ARCH_AVR "-ID:\\arduino-1.0.1\\arduino-1.8.13\\arduino-1.8.13-windows\\arduino-1.8.13\\hardware\\arduino\\avr\\cores\\arduino" "-ID:\\arduino-1.0.1\\arduino-1.8.13\\arduino-1.8.13-windows\\arduino-1.8.13\\hardware\\arduino\\avr\\variants\\eightanaloginputs" "C:\\Users\\User\\AppData\\Local\\Temp\\arduino_build_255010\\sketch\\7793_11.ino.cpp" -o "C:\\Users\\User\\AppData\\Local\\Temp\\arduino_build_255010\\sketch\\7793_11.ino.cpp.o"

E:\7793_1\PROB\7793_11\7793_11.ino: In function 'void setup()':

7793_11:49:3: error: 'write_byte' was not declared in this scope

   write_byte(0x08,(0x20<<8)|F_ADC_4_17, 16);// MODE REGISTER

   ^~~~~~~~~~

exit status 1

'write_byte' was not declared in this scope

12

Re: AD7793

Добавьте несколько функции за пределами loop()

void write_byte(byte reg, long data, int bit_){
     digitalWrite(CS,LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, (data >> i) & 1);
     digitalWrite(SCLK,HIGH); 
     }
     digitalWrite(CS,HIGH);
     }

     
  long read_byte(byte reg, int bit_){
     digitalWrite(CS,LOW);
  while(digitalRead(DOUT)!=LOW); 
  for(int i = 7; i >= 0; i--){
     digitalWrite(SCLK,LOW); 
     digitalWrite(DIN, (reg >> i) & 1);
     digitalWrite(SCLK,HIGH);
     }
  while(digitalRead(DOUT)!=LOW); 
  long data_out=0;
  long dat;
  for(int i = bit_-1; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(SCLK,HIGH);
     dat = digitalRead(DOUT);
     data_out |= (dat<<i); 
     }
     digitalWrite(CS,HIGH);
     return data_out; 
  }

void reset(){
     digitalWrite(CS,LOW);   
  for(int i = 31; i >= 0; i--){
     digitalWrite(SCLK,LOW);
     digitalWrite(DIN, HIGH);
     digitalWrite(SCLK,HIGH);
     }
     digitalWrite(CS,HIGH);
  }

Скетч который Вы опубликовали не имеет этих функций

13

Re: AD7793

СПАСИБО ВСЕ ОК
ПРОГЛЯДЕЛ ЭТИ функции в конце
При копировании скеча в буфер обмена с сайта
и последующий прогон программной оболочки Arduino IDE сразу не идет
то ли добавляются какие то не видимые значки или может англ.буквы меняются на русские "O"
идет ошибка
stray '\302' in program но с этой ошибкой я справился