Помогите добавить в код еще 8 разрядов семисегмента

awladimer
Offline
Зарегистрирован: 13.02.2017

Всем привет. Помогите дописать код. Схема такая три регистра 74HC595 и 16 разрядов семисегмента нашол код на иностранном сайте на две 74HC595 и 8 разрядов работает отлично но как добавить еще 8 незнаю помогите пожалуйста

const int clock = 13; //SCK
const int latch = 10; //RCK 
const int data = 11;  //DIO

byte value[] ={0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72};
byte digit[] ={B11111110,B11111101,B11111011,B11110111,B11101111,B11011111,B10111111,B01111111};
byte ii = 0;
byte v0, v1,v2,v3,v4,v5,v6,v7;
byte vvalue = value[0];
 
void setup() {
  pinMode(clock, OUTPUT);
  pinMode(latch, OUTPUT);
  pinMode(data, OUTPUT);
  
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter value to 0
  OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);  
  sei();//allow interrupts
  
  v0=v1=v2=v3=v4=v5=v6=v7=0;  
}
 


ISR(TIMER0_COMPA_vect){   
  ii++;
  if (ii==8) ii=0;

  if (ii==0) { vvalue = v0; }
  else if (ii==1) { vvalue = v1; }    
  else if (ii==2) { vvalue = v2; }
  else if (ii==3) { vvalue = v3; }
  else if (ii==4) { vvalue = v4; }
  else if (ii==5) { vvalue = v5; }
  else if (ii==6) { vvalue = v6; }
  else if (ii==7) { vvalue = v7; }

  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,B11111111);
  shiftOut(data,clock,MSBFIRST,B11111111);
  shiftOut(data,clock,MSBFIRST,B11111111);
  digitalWrite(latch,HIGH); 

  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,digit[ii]);
  shiftOut(data,clock,MSBFIRST,value[vvalue]);
  digitalWrite(latch,HIGH);   
}
//long i;

void loop() {

//  for (i=1;i<=99999999;i++) {
   v7 = 7;//i % 10;
   v6 = 6;//(i / 10) % 10;
   v5 = 5;//(i / 100) % 10;
   v4 = 4;//(i / 1000) % 10;
   v3 = 3;//(i / 10000) % 10;
   v2 = 2;//(i / 100000) % 10;
   v1 = 1;//(i / 1000000) % 10;
   v0 = 0;//(i / 10000000) % 10;
   delay(30);
  //}
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
const int clockPin = 13; //SCK
const int latchPin = 10; //RCK
const int dataPin = 11;  //DIO

const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72};
const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
byte ii = 0;
byte v[16];
void clearDisplay() {
  for (int i = 0; i < 16; i++) v[i] = 0;
}
void initDisplay() {
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter MAP to 0
  OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts
  clearDisplay();

}
ISR(TIMER0_COMPA_vect) {
  ii++;
  if (ii > 15)ii = 0;
  if (ii < 8) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
  else {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii-8]);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
}
//------------------------------------------
//-----------------------------------------
void setup() {
  initDisplay();
}
void loop() {
  //  for (i=1;i<=99999999;i++) {
  v[7] = 7;//i % 10;
  v[6] = 6;//(i / 10) % 10;
  v[5] = 5;//(i / 100) % 10;
  v[4] = 4;//(i / 1000) % 10;
  v[3] = 3;//(i / 10000) % 10;
  v[2] = 2;//(i / 100000) % 10;
  v[1] = 1;//(i / 1000000) % 10;
  v[0] = 0;//(i / 10000000) % 10;
  delay(30);
  //}
}

 

awladimer
Offline
Зарегистрирован: 13.02.2017

Огромное спасибо единственное первый левый v8 до v15 потом v0 до v7 еще раз спасибо.

Green
Offline
Зарегистрирован: 01.10.2015

Я фигею с этих кодеров! А вот у меня Ардуино NG и чо?

sadman41
Offline
Зарегистрирован: 19.10.2016

Тоже найди код и принеси квону. Он отработает.

Green
Offline
Зарегистрирован: 01.10.2015

Не, ну я понимаю, практика, навыки... Но не до такой же степени!

awladimer
Offline
Зарегистрирован: 13.02.2017

qwone пишет:

/**/
const int clockPin = 13; //SCK
const int latchPin = 10; //RCK
const int dataPin = 11;  //DIO

const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72};
const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
byte ii = 0;
byte v[16];
void clearDisplay() {
  for (int i = 0; i < 16; i++) v[i] = 0;
}
void initDisplay() {
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter MAP to 0
  OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts
  clearDisplay();

}
ISR(TIMER0_COMPA_vect) {
  ii++;
  if (ii > 15)ii = 0;
  if (ii < 8) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
  else {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii-8]);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
}
//------------------------------------------
//-----------------------------------------
void setup() {
  initDisplay();
}
void loop() {
  //  for (i=1;i<=99999999;i++) {
  v[7] = 7;//i % 10;
  v[6] = 6;//(i / 10) % 10;
  v[5] = 5;//(i / 100) % 10;
  v[4] = 4;//(i / 1000) % 10;
  v[3] = 3;//(i / 10000) % 10;
  v[2] = 2;//(i / 100000) % 10;
  v[1] = 1;//(i / 1000000) % 10;
  v[0] = 0;//(i / 10000000) % 10;
  delay(30);
  //}
}

 

qwone а если ещё 8 добавить чет невдуплюсь изменяю все 16 на 24 15 на 23 все сбивается

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
/**/
const int clockPin = 13; //SCK
const int latchPin = 10; //RCK
const int dataPin = 11;  //DIO

const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72};
const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
byte ii = 0;
byte v[24];
void clearDisplay() {
  for (int i = 0; i < 24; i++) v[i] = 0;
}
void initDisplay() {
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter MAP to 0
  OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts
  clearDisplay();

}
ISR(TIMER0_COMPA_vect) {
  ii++;
  if (ii > 15)ii = 0;
  if (ii < 8) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
  else if (ii < 16) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii - 8]);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
  else {
  digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii - 16]);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
}
//------------------------------------------
//-----------------------------------------
void setup() {
  initDisplay();
}
void loop() {
  //  for (i=1;i<=99999999;i++) {
  v[7] = 7;//i % 10;
  v[6] = 6;//(i / 10) % 10;
  v[5] = 5;//(i / 100) % 10;
  v[4] = 4;//(i / 1000) % 10;
  v[3] = 3;//(i / 10000) % 10;
  v[2] = 2;//(i / 100000) % 10;
  v[1] = 1;//(i / 1000000) % 10;
  v[0] = 0;//(i / 10000000) % 10;
  delay(30);
  //}
}

 

awladimer
Offline
Зарегистрирован: 13.02.2017

qwone пишет:

/**/
const int clockPin = 13; //SCK
const int latchPin = 10; //RCK
const int dataPin = 11;  //DIO

const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72};
const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
byte ii = 0;
byte v[24];
void clearDisplay() {
  for (int i = 0; i < 24; i++) v[i] = 0;
}
void initDisplay() {
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter MAP to 0
  OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts
  clearDisplay();

}
ISR(TIMER0_COMPA_vect) {
  ii++;
  if (ii > 15)ii = 0;
  if (ii < 8) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
  else if (ii < 16) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii - 8]);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
  else {
  digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii - 16]);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
}
//------------------------------------------
//-----------------------------------------
void setup() {
  initDisplay();
}
void loop() {
  //  for (i=1;i<=99999999;i++) {
  v[7] = 7;//i % 10;
  v[6] = 6;//(i / 10) % 10;
  v[5] = 5;//(i / 100) % 10;
  v[4] = 4;//(i / 1000) % 10;
  v[3] = 3;//(i / 10000) % 10;
  v[2] = 2;//(i / 100000) % 10;
  v[1] = 1;//(i / 1000000) % 10;
  v[0] = 0;//(i / 10000000) % 10;
  delay(30);
  //}
}

 

Ок заработало только вот почемуто середина 8 сегментов теперь невысвечивает

нашол

if (ii > 15)ii = 0;заменил на
if (ii > 23)ii = 0;

 

только теперь мерцание заметно

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Дальше меняте  shiftOut. Но это без меня.

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
	uint8_t i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
	}
}

 

awladimer
Offline
Зарегистрирован: 13.02.2017

qwone пишет:

Дальше меняте  shiftOut. Но это без меня.

void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val)
{
	uint8_t i;

	for (i = 0; i < 8; i++)  {
		if (bitOrder == LSBFIRST)
			digitalWrite(dataPin, !!(val & (1 << i)));
		else	
			digitalWrite(dataPin, !!(val & (1 << (7 - i))));
			
		digitalWrite(clockPin, HIGH);
		digitalWrite(clockPin, LOW);		
	}
}

 

спасибо большое тебе

awladimer
Offline
Зарегистрирован: 13.02.2017

qwone помоги пожалуста добавить еще четыре датчика для тахометра

почитал про attachInterrupt оказалось только 2 пина можно использовать

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

#include <OneWire.h>
long lastUpdateTime = 0,tax1 = 0L,tax2 = 0L,tax3 = 0L;
bool _SV1CP0needSend = 0,_SV2CP0needSend = 0,_SV3CP0needSend = 0;
unsigned long _SCT_1 = 0UL,_SCT_1IC = 0UL,_SCT_1P = 0UL,_SCT_2 = 0UL,_SCT_2IC = 0UL,_SCT_2P = 0UL,_SCT_3 = 0UL,_SCT_3IC = 0UL,_SCT_3P = 0UL;
const int clockPin = 13; //SCK
const int latchPin = 10; //RCK
const int dataPin = 11;  //DIO
OneWire  ds(4);  // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком
int temperature = 0;
//long lastUpdateTime = 0;// Переменная для хранения времени последнего считывания с датчика
const int TEMP_UPDATE_TIME = 1000;// Определяем периодичность проверок
  //                 0    1    2    3    4    5    6   7   8,   9,знак гр, С   -  пусто,точка          всего=15
const byte MAP[] = {0x7E,0xC,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xDE,0xC6,0x72,0x80,0x0,0x1};//0x1
const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
byte ii = 0;
byte v[16];
void clearDisplay() {
  for (int i = 0; i < 16; i++) v[i] = 0;
}
void initDisplay() {
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter MAP to 0
  OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts
  clearDisplay();

}
ISR(TIMER0_COMPA_vect) {
  ii++;
  if (ii > 15)ii = 0;
  if (ii < 8) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
  else {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii-8]);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
}
//------------------------------------------
//-----------------------------------------
void setup() {
  initDisplay();
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(5, INPUT);
    _SCT_1P=micros();
    _SCT_2P=micros();
    _SCT_3P=micros();
  attachInterrupt( digitalPinToInterrupt (2), _SCT_1coutFunction, FALLING);
  attachInterrupt( digitalPinToInterrupt (3), _SCT_2coutFunction, FALLING);
  attachInterrupt( digitalPinToInterrupt (5), _SCT_3coutFunction, FALLING);
}
void temperaturaread(){
    detectTemperature(); // Определяем температуру от датчика DS18b20
  Serial.println(temperature); // Выводим полученное значение температуры
  // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться
}
 
int detectTemperature(){
 
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
 
  if (millis() - lastUpdateTime > TEMP_UPDATE_TIME)
  {
    lastUpdateTime = millis();
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
 
    // Формируем значение
    temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4;
  }
 }
void TaxometrRead(){
   if((( micros()-_SCT_1P) >1000000)||(( micros()-_SCT_1P) <0)){_SCT_1 = _SCT_1IC;_SCT_1IC=0;_SCT_1P = micros();}
   if(!(( (_SCT_1)*(30L))==(tax1))){_SV1CP0needSend = 1;} tax1 = (_SCT_1)*(30L);  
   if((( micros()-_SCT_2P) >1000000)||(( micros()-_SCT_2P) <0)){_SCT_2 = _SCT_2IC;_SCT_2IC=0;_SCT_2P = micros();} 
   if(!(( (_SCT_2)*(30L))==(tax2))){_SV2CP0needSend = 1;} tax2 = (_SCT_2)*(30L); 
   if((( micros()-_SCT_3P) >1000000)||(( micros()-_SCT_3P) <0)){_SCT_3 = _SCT_3IC;_SCT_3IC=0;_SCT_3P = micros();} 
   if(!(( (_SCT_3)*(30L))==(tax3))){_SV3CP0needSend = 1;} tax3 = (_SCT_3)*(30L); 
}
long taxometr1,taxometr2,taxometr3,temp,tt;
 void loop() {

  
  detectTemperature();
   temp = int(temperature);
    tt = int(temp / 100) % 10;
     v[12] = 10;
     v[13] = int(temp % 10);
     v[14] = int(temp / 10) % 10;
   if (tt > 0){
   v[15] = int(temp / 100) % 10;
   }
   else{
    v[15] = 0xff;
   }
     TaxometrRead();
       taxometr1 = int(tax1);   // пин 2
   v[0] = int(taxometr1 % 10);
   v[1] = int(taxometr1 / 10) % 10;
   v[2] = int(taxometr1 / 100) % 10;
   v[3] = int(taxometr1 / 1000) % 10;
       taxometr2 = int(tax2);   //пин 3
   v[4] = int(taxometr2 % 10);
   v[5] = int(taxometr2 / 10) % 10;
   v[6] = int(taxometr2 / 100) % 10;  
   v[7] = int(taxometr2 / 1000) % 10;
       taxometr3 = int(tax3);  // пин 1
   v[8] = int(taxometr3 % 10);
   v[9] = int(taxometr3 / 10) % 10;
   v[10] = int(taxometr3 / 100) % 10;  
   v[11] = int(taxometr3 / 1000) % 10;

}
 void  _SCT_1coutFunction()
{ _SCT_1IC++;
} 
 void  _SCT_2coutFunction()
{ _SCT_2IC++;
} 
 void  _SCT_3coutFunction()
{ _SCT_3IC++;
}

 

awladimer
Offline
Зарегистрирован: 13.02.2017

Люди добрые помогите пожалуйста нехочется использовать мегу2560

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

awladimer пишет:

Люди добрые помогите пожалуйста нехочется использовать мегу2560

Помочь с чем именно?

awladimer
Offline
Зарегистрирован: 13.02.2017

добавить еще четыре датчика для тахометра

почитал про attachInterrupt оказалось только 2 пина можно использовать

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

#include <OneWire.h>
long lastUpdateTime = 0,tax1 = 0L,tax2 = 0L,tax3 = 0L;
bool _SV1CP0needSend = 0,_SV2CP0needSend = 0,_SV3CP0needSend = 0;
unsigned long _SCT_1 = 0UL,_SCT_1IC = 0UL,_SCT_1P = 0UL,_SCT_2 = 0UL,_SCT_2IC = 0UL,_SCT_2P = 0UL,_SCT_3 = 0UL,_SCT_3IC = 0UL,_SCT_3P = 0UL;
const int clockPin = 13; //SCK
const int latchPin = 10; //RCK
const int dataPin = 11;  //DIO
OneWire  ds(4);  // Создаем объект OneWire для шины 1-Wire, с помощью которого будет осуществляться работа с датчиком
int temperature = 0;
//long lastUpdateTime = 0;// Переменная для хранения времени последнего считывания с датчика
const int TEMP_UPDATE_TIME = 1000;// Определяем периодичность проверок
  //                 0    1    2    3    4    5    6   7   8,   9,знак гр, С   -  пусто,точка          всего=15
const byte MAP[] = {0x7E,0xC,0xB6,0x9E,0xCC,0xDA,0xFA,0xE,0xFE,0xDE,0xC6,0x72,0x80,0x0,0x1};//0x1
const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
byte ii = 0;
byte v[16];
void clearDisplay() {
  for (int i = 0; i < 16; i++) v[i] = 0;
}
void initDisplay() {
  pinMode(clockPin, OUTPUT);
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter MAP to 0
  OCR0A = 255;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts
  clearDisplay();

}
ISR(TIMER0_COMPA_vect) {
  ii++;
  if (ii > 15)ii = 0;
  if (ii < 8) {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii]);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
  else {
    digitalWrite(latchPin, LOW);
    shiftOut(dataPin, clockPin, MSBFIRST, 0xFF);
    shiftOut(dataPin, clockPin, MSBFIRST, DIG[ii-8]);
    shiftOut(dataPin, clockPin, MSBFIRST, MAP[v[ii]]);
    digitalWrite(latchPin, HIGH);
  }
}
//------------------------------------------
//-----------------------------------------
void setup() {
  initDisplay();
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(5, INPUT);
    _SCT_1P=micros();
    _SCT_2P=micros();
    _SCT_3P=micros();
  attachInterrupt( digitalPinToInterrupt (2), _SCT_1coutFunction, FALLING);
  attachInterrupt( digitalPinToInterrupt (3), _SCT_2coutFunction, FALLING);
  attachInterrupt( digitalPinToInterrupt (5), _SCT_3coutFunction, FALLING);
}
void temperaturaread(){
    detectTemperature(); // Определяем температуру от датчика DS18b20
  Serial.println(temperature); // Выводим полученное значение температуры
  // Т.к. переменная temperature имеет тип int, дробная часть будет просто отбрасываться
}
 
int detectTemperature(){
 
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
 
  if (millis() - lastUpdateTime > TEMP_UPDATE_TIME)
  {
    lastUpdateTime = millis();
    ds.reset();
    ds.write(0xCC);
    ds.write(0xBE);
    data[0] = ds.read();
    data[1] = ds.read();
 
    // Формируем значение
    temperature = (data[1] << 8) + data[0]; temperature = temperature >> 4;
  }
 }
void TaxometrRead(){
   if((( micros()-_SCT_1P) >1000000)||(( micros()-_SCT_1P) <0)){_SCT_1 = _SCT_1IC;_SCT_1IC=0;_SCT_1P = micros();}
   if(!(( (_SCT_1)*(30L))==(tax1))){_SV1CP0needSend = 1;} tax1 = (_SCT_1)*(30L);  
   if((( micros()-_SCT_2P) >1000000)||(( micros()-_SCT_2P) <0)){_SCT_2 = _SCT_2IC;_SCT_2IC=0;_SCT_2P = micros();} 
   if(!(( (_SCT_2)*(30L))==(tax2))){_SV2CP0needSend = 1;} tax2 = (_SCT_2)*(30L); 
   if((( micros()-_SCT_3P) >1000000)||(( micros()-_SCT_3P) <0)){_SCT_3 = _SCT_3IC;_SCT_3IC=0;_SCT_3P = micros();} 
   if(!(( (_SCT_3)*(30L))==(tax3))){_SV3CP0needSend = 1;} tax3 = (_SCT_3)*(30L); 
}
long taxometr1,taxometr2,taxometr3,temp,tt;
 void loop() {

  
  detectTemperature();
   temp = int(temperature);
    tt = int(temp / 100) % 10;
     v[12] = 10;
     v[13] = int(temp % 10);
     v[14] = int(temp / 10) % 10;
   if (tt > 0){
   v[15] = int(temp / 100) % 10;
   }
   else{
    v[15] = 0xff;
   }
     TaxometrRead();
       taxometr1 = int(tax1);   // пин 2
   v[0] = int(taxometr1 % 10);
   v[1] = int(taxometr1 / 10) % 10;
   v[2] = int(taxometr1 / 100) % 10;
   v[3] = int(taxometr1 / 1000) % 10;
       taxometr2 = int(tax2);   //пин 3
   v[4] = int(taxometr2 % 10);
   v[5] = int(taxometr2 / 10) % 10;
   v[6] = int(taxometr2 / 100) % 10;  
   v[7] = int(taxometr2 / 1000) % 10;
       taxometr3 = int(tax3);  // пин 1
   v[8] = int(taxometr3 % 10);
   v[9] = int(taxometr3 / 10) % 10;
   v[10] = int(taxometr3 / 100) % 10;  
   v[11] = int(taxometr3 / 1000) % 10;

}
 void  _SCT_1coutFunction()
{ _SCT_1IC++;
} 
 void  _SCT_2coutFunction()
{ _SCT_2IC++;
} 
 void  _SCT_3coutFunction()
{ _SCT_3IC++;
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

дай водицы испить, а то так есть хочется, что переночевать негде )))

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Мда. Вот говорят же умные люди как надо поступать в таких случаях, а Квон не слушает никого. Попал в общем. Завтра ещё пара датчиков вылезет :)

awladimer
Offline
Зарегистрирован: 13.02.2017

Всем привет посмотрите пожалуйста код все ли правильно?

void SPI_init(void)
{
  DDRB |= ((1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)); //ножки SPI на выход
  PORTB &= ~((1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)); //низкий уровень
  SPCR = ((1 << SPE) | (1 << MSTR)); //включим шину, объ¤вим ведущим
}
//------------------------------------------
const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72};
const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
byte ii = 0;
byte v[24];
void clearDisplay() {
  for (int i = 0; i < 24; i++) v[i] = 0;
}
//------------------------------------------
void initDisplay() {
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter MAP to 0
  OCR0A = 254;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts
  clearDisplay(); 
}
ISR(TIMER0_COMPA_vect) {
  ii++;
  if (ii > 23) ii = 0;
  if (ii < 8) {
    SPDR = DIG[ii];
    while (!(SPSR & (1 << SPIF)));
    led595();
    led595();
    SPDR = MAP[v[ii]];
    while (!(SPSR & (1 << SPIF)));
    sdvig();
  }
  else if (ii < 16) {
    led595();
    SPDR = DIG[ii - 8];
    while (!(SPSR & (1 << SPIF)));
    led595();
    SPDR = MAP[v[ii]];
    while (!(SPSR & (1 << SPIF)));
    sdvig();
  }
  else {
    led595();
    led595();
    SPDR = DIG[ii - 16];
    while (!(SPSR & (1 << SPIF)));
    SPDR = MAP[v[ii]];
    while (!(SPSR & (1 << SPIF)));
    sdvig();
  }
}
//------------------------------------------
void led595() {
  SPDR = 0b11111111;
  while (!(SPSR & (1 << SPIF)));
}
//------------------------------------------
void sdvig() {
  PORTB |= (1 << PORTB2); //высокий уровень   dWrite(latchPin, LOW);
  PORTB &= ~(1 << PORTB2); //низкий уровень   dWrite(latchPin, HIGH);
}
//-----------------------------------------
void setup() {
  SPI_init();
  initDisplay();
  // sei();
}
//------------------------------------------
void loop() {
  // v[7] = 7;//i % 10;
  // v[6] = 6;//(i / 10) % 10;
  v[5] = 5;//(i / 100) % 10;
  v[4] = 4;//(i / 1000) % 10;
  v[3] = 3;//(i / 10000) % 10;
  v[2] = 2;//(i / 100000) % 10;
  v[1] = 1;//(i / 1000000) % 10;
  v[0] = 0;//(i / 10000000) % 10;
  v[8] = 9;
  v[9] = 8;
  v[10] = 7;
  v[11] = 6;
  v[12] = 5;
  v[13] = 4;
  v[14] = 3;
  v[15] = 2;
  v[16] = 0;
  v[17] = 0;
  v[18] = 0;
  v[19] = 0;
  v[20] = 0;
  v[21] = 0;
  v[22] = 0;
  v[23] = 1;
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

awladimer пишет:

Всем привет посмотрите пожалуйста код все ли правильно?

Сами запускали? Работает? Устраивает или что-то не так? Если не запускали - садитесь и запускайте. Если запускали - описывайте.

Почему-то кто за Вас это должен делать?

awladimer
Offline
Зарегистрирован: 13.02.2017

Извините писал сам запускал работает вроде все нравиться а вот коменты неуспел написать

просто нужен глаз спеца.

void SPI_init(void)
{
  DDRB |= ((1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)); //ножки SPI на выход
  PORTB &= ~((1 << PORTB2) | (1 << PORTB3) | (1 << PORTB5)); //низкий уровень
  SPCR = ((1 << SPE) | (1 << MSTR)); //включим шину, объ¤вим ведущим
}
//------------------------------------------
const byte MAP[] = {0x7E, 0xC, 0xB6, 0x9E, 0xCC, 0xDA, 0xFA, 0xE, 0xFE, 0xDE, 0xC6, 0x72};
const byte DIG[] = {B11111110, B11111101, B11111011, B11110111, B11101111, B11011111, B10111111, B01111111};
byte ii = 0;
byte v[24];
void clearDisplay() {
  for (int i = 0; i < 24; i++) v[i] = 0;
}
//------------------------------------------
void initDisplay() {
  cli();//stop interrupts
  //set timer0 interrupt at 980Hz
  TCCR0A = 0;// set entire TCCR0A register to 0
  TCCR0B = 0;// same for TCCR0B
  TCNT0  = 0;//initialize counter MAP to 0
  OCR0A = 254;//(must be <256) --> 16000000 / (prescaler*255) = 980 Hz
  TCCR0A |= (1 << WGM01);
  TCCR0B |= (1 << CS01) | (1 << CS00);   //prescaler = 64
  TIMSK0 |= (1 << OCIE0A);
  sei();//allow interrupts
  clearDisplay(); 
}
ISR(TIMER0_COMPA_vect) {
  ii++;
  if (ii > 23) ii = 0;
  if (ii < 8) {
    SPDR = DIG[ii];               // Передаем биты разряда
    while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся
    led595();
    led595();
    SPDR = MAP[v[ii]];            // Передаем биты сегмента
    while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся
    sdvig();
  }
  else if (ii < 16) {
    led595();
    SPDR = DIG[ii - 8];            // Передаем биты разряда
    while (!(SPSR & (1 << SPIF))); //подождем пока данные передадутся
    led595();
    SPDR = MAP[v[ii]];            // Передаем биты сегмента
    while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся
    sdvig();
  }
  else {
    led595();
    led595();
    SPDR = DIG[ii - 16];          // Передаем биты разряда
    while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся
    SPDR = MAP[v[ii]];            // Передаем биты сегмента
    while (!(SPSR & (1 << SPIF)));//подождем пока данные передадутся
    sdvig();
  }
}
//------------------------------------------
void led595() {
  SPDR = 0b11111111;
  while (!(SPSR & (1 << SPIF)));
}
//------------------------------------------
void sdvig() {    //сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER
  PORTB |= (1 << PORTB2); //высокий уровень   
  PORTB &= ~(1 << PORTB2); //низкий уровень   
}
//-----------------------------------------
void setup() {
  SPI_init();   //Инициализируем шину SPI
  initDisplay();
  // sei();
}
//------------------------------------------
void loop() {
  // v[7] = 7;//i % 10;
  // v[6] = 6;//(i / 10) % 10;
  // выводим цыфры
  v[5] = 5;//(i / 100) % 10;
  v[4] = 4;//(i / 1000) % 10;
  v[3] = 3;//(i / 10000) % 10;
  v[2] = 2;//(i / 100000) % 10;
  v[1] = 1;//(i / 1000000) % 10;
  v[0] = 0;//(i / 10000000) % 10;
  v[8] = 9;
  v[9] = 8;
  v[10] = 7;
  v[11] = 6;
  v[12] = 5;
  v[13] = 4;
  v[14] = 3;
  v[15] = 2;
  v[16] = 0;
  v[17] = 0;
  v[18] = 0;
  v[19] = 0;
  v[20] = 0;
  v[21] = 0;
  v[22] = 0;
  v[23] = 1;
}

 

awladimer
Offline
Зарегистрирован: 13.02.2017

щас телефон зарядиться скину фото работы

awladimer
Offline
Зарегистрирован: 13.02.2017

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

awladimer. Основное замечание. Очень все не удобно. По какой команде вы будете показывать значение , к примеру на 3-м дисплее? или на 5-м.

awladimer
Offline
Зарегистрирован: 13.02.2017

qwone пишет:

awladimer. Основное замечание. Очень все не удобно. По какой команде вы будете показывать значение , к примеру на 3-м дисплее? или на 5-м.

вот мне очень понравилось даже написал, на другое пока голова несоображает или просто непойму. Очень тяжело особено в в мои 47 для меня и это прогресс

  detectTemperature();
   temp = int(temperature);
     v[20] = 10;
     v[21] = int(temp % 10);
   if (temp > 9){  
     v[22] = int(temp / 10) % 10;
    }
   else{
     v[22] = 0xff;
   }
   if (temp > 99){
     v[23] = int(temp / 100) % 10;
   }
   else{
    v[23] = 0xff;
   }
/////////////////////////вывод температуры двигателя//////////////////////////////  
/////////////////////////вывод оборотов вентилятора//////////////////////////////     
     TaxometrRead();
       taxometr1 = int(tax1);   // пин 2
   v[8] = int(taxometr1 % 10);
          if (tax1 > 9){                //убираем 2 знак с лева
   v[9] = int(taxometr1 / 10) % 10;
   }
          else{
   v[9] = 0xff;
   }
          if (tax1 > 99){                //убираем 3 знак с лева
   v[10] = int(taxometr1 / 100) % 10; 
   }
          else{
    v[10] = 0xff;
   }
          if (tax1 > 999){                    //убираем 4 знак с лева
   v[11] = int(taxometr1 / 1000) % 10;
   }
          else{
    v[11] = 0xff;
   }
/////////////////////////вывод оборотов вентилятора///////////////////

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если Вы думаете, что здесь толкуются малолетки, то я Вас разочарую. Здесь Ваши ровесники и старше. 

byte v[24];
/*вывод на первый экран*/
void print1(int val) {
}
/*вывод на второй экран*/
void print2(int val) {
}
/*вывод на третий экран*/
void print3int val) {
}
/*вывод на четвертый экран*/
void print4(int val) {
}
/*вывод на пятый экран*/
void print5(int val) {
}
/*вывод на шестой экран*/
void print6(int val) {
}
void setup() {


}

void loop() {


}

 

awladimer
Offline
Зарегистрирован: 13.02.2017

qwone пишет:

Если Вы думаете, что здесь толкуются малолетки, то я Вас разочарую. Здесь Ваши ровесники и старше. 


byte v[24];
/*вывод на первый экран*/
void print1(int val) {
}
/*вывод на второй экран*/
void print2(int val) {
}
/*вывод на третий экран*/
void print3int val) {
}
/*вывод на четвертый экран*/
void print4(int val) {
}
/*вывод на пятый экран*/
void print5(int val) {
}
/*вывод на шестой экран*/
void print6(int val) {
}
void setup() {


}

void loop() {


}

 

вы имели виду так

byte v[24];
/*вывод на первый экран*/
void print1(int val) {
 temp = int(temperature);
  v[20] = 10;
  v[21] = int(temp % 10);
  if (temp > 9){
    v[22] = int(temp / 10) % 10;
  }
  else{
    v[22] = 0xff;
  }
  if (temp > 99){
    v[23] = int(temp / 100) % 10;
  }
  else{
    v[23] = 0xff;
  }  
}
/*вывод на второй экран*/
void print2(int val) {
}
void loop() {
  
  print1(0); // а здесь что прописывать
}