Спидометр на велик (Digispark ATtiny85, TM74HC595Display и датчик хола)

Zaur.

✩✩✩✩✩✩✩
15 Апр 2020
17
1
Всем привет! Хотел сделать Спидометр для велика, смотрел видео Алекса он делал его на Arduino nano. Но у меня его нет( . Решил сделать на Digispark, Взял скетч Алекса там что-то переделал но ничего не заработало( . Памогите кто шарит в этом.

Скетч:
C++:
/*
Created 2016
by AlexGyver
AlexGyver Home Labs Inc.
*/

//-----------дисплей-----------
#include <TimerOne.h>
#include <TM74HC595Display.h>
int SCLK = 4;
int RCLK = 3;
int DIO = 2;
TM74HC595Display disp(SCLK, RCLK, DIO);
unsigned char LED_0F[29];
//--------дисплей-------

unsigned long lastturn, time_press; //переменные хранения времени
float SPEED; //переменная хранения скорости в виде десятичной дроби
float DIST; //переменная хранения расстояния в виде десятичной дроби
float w_length=2.090; //длина окружности колеса в метрах
boolean flag; //флажок для хранения (что выводим на дисплее, скорость или расстояние)
boolean state, button; //флажки для обработчика нажатия кнопки

void setup() {
  Serial.begin(9600);  //открыть порт
  attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
  pinMode(1, OUTPUT);   //3 пин как выход
  digitalWrite(1, HIGH);  //подать 5 вольт на 3 пин
  pinMode(8, INPUT);   //сюда подключена кнопка

  //для дисплея цифры----------
  LED_0F[0] = 0xC0; //0
  LED_0F[1] = 0xF9; //1
  LED_0F[2] = 0xA4; //2
  LED_0F[3] = 0xB0; //3
  LED_0F[4] = 0x99; //4
  LED_0F[5] = 0x92; //5
  LED_0F[6] = 0x82; //6
  LED_0F[7] = 0xF8; //7
  LED_0F[8] = 0x80; //8
  LED_0F[9] = 0x90; //9

  LED_0F[10] = 0b01000000; //.0
  LED_0F[11] = 0b01111001; //.1
  LED_0F[12] = 0b00100100; //.2
  LED_0F[13] = 0b00110000; //.3
  LED_0F[14] = 0b00011001; //.4
  LED_0F[15] = 0b00010010; //.5
  LED_0F[16] = 0b00000010; //.6
  LED_0F[17] = 0b01111000; //.7
  LED_0F[18] = 0b00000000; //.8
  LED_0F[19] = 0b00010000; //.9
  Timer1.initialize(1500); // set a timer of length 1500
  //--------------
}

void sens() {
  if (millis()-lastturn > 80) {  //защита от случайных измерений (основано на том, что велосипед не будет ехать быстрее 120 кмч)
    SPEED=w_length/((float)(millis()-lastturn)/1000)*3.6;  //расчет скорости, км/ч
    lastturn=millis();  //запомнить время последнего оборота
    DIST=DIST+w_length/1000;  //прибавляем длину колеса к дистанции при каждом обороте оного
  }
}

void loop() {
  int cel_sp=floor(SPEED);
  int sot_sp=(((float)cel_sp/1000)-floor((float)cel_sp/1000))*10;
  int des_sp=(((float)cel_sp/100)-floor((float)cel_sp/100))*10;
  int ed_sp=(((float)cel_sp/10)-floor((float)cel_sp/10))*10;
  int dr_sp=(float)(SPEED-floor(SPEED))*10;

  if (flag==0) {
    //disp.set(LED_0F[sot_sp],3);  //вывод сотен скорости (для велосипеда не нужно =)
    disp.send(LED_0F[des_sp],2);  //вывод десятков скорости
    disp.send(LED_0F[ed_sp+10],1);  //вывод единиц скорости, с точкой
    disp.send(LED_0F[dr_sp],0);  //вывод после точки  
  }

  int cel_di=floor(DIST);  //целые
  int sot_di=(((float)cel_di/1000)-floor((float)cel_di/1000))*10;  //сотни
  int des_di=(((float)cel_di/100)-floor((float)cel_di/100))*10;  //десятки
  int ed_di=floor(((float)((float)cel_di/10)-floor((float)cel_di/10))*10);  //единицы (с точкой)
  int dr_di=(float)(DIST-floor(DIST))*10;  //десятые части

  if (flag==1) {
    disp.send(LED_0F[sot_di],3);  //вывод сотен расстояния
    disp.send(LED_0F[des_di],2);  //вывод десятков расстояния
    disp.send(LED_0F[ed_di+10],1);  //вывод единиц расстояния, с точкой
    disp.send(LED_0F[dr_di],0);  //вывод после точки
  }

  if ((millis()-lastturn)>1500){ //если сигнала нет больше 2 секунды
    SPEED=0;  //считаем что SPEED 0
  }

    if (digitalRead(8)==1 && state==0) {        //выбор режимов кнопкой. Если кнопка нажата
    state=1;
    button=1;
    time_press=millis();              //запомнить время нажатия
    while (millis()-time_press<500) {        //выполнять, пока кнопка нажата не менее 500 миллисекунд
      if (digitalRead(8)==0) {            //если кнопка отпущена, выйти из цикла и принять button=0
        button=0;
        break;
      }
    }        //если кнопка не отпущена 500мс, то button будет равен 1
    switch (button) {
    case 0:
      break;
    case 1:
      break;
    }
  }
}
 

b707

★✩✩✩✩✩✩
4 Июн 2020
54
18
а новый код хотя бы компилируется?
Ну и кроме того - как пины подбирали? похоже, просто написали абы как.
Пин прерывания для спидометра пересекается с пинами дисплея, в сетапе используется какой-то пин 8, которого на Аттини в принципе не может быть, у нее пинов всего 8, с номерами от 0 до 7 :)

Так коды не переделывают, вдумчивее надо :)
 

Zaur.

✩✩✩✩✩✩✩
15 Апр 2020
17
1
а новый код хотя бы компилируется?
Ну и кроме того - как пины подбирали? похоже, просто написали абы как.
Пин прерывания для спидометра пересекается с пинами дисплея, в сетапе используется какой-то пин 8, которого на Аттини в принципе не может быть, у нее пинов всего 8, с номерами от 0 до 7 :)

Так коды не переделывают, вдумчивее надо :)
Я там внутреннюю память стёр, т.к скетч не загружался. Если вы знаете как скетч переделать для Digispark, то сделайте это пж
 

b707

★✩✩✩✩✩✩
4 Июн 2020
54
18
Я там внутреннюю память стёр, т.к скетч не загружался.
не знаю, что значит "стер внутреннюю память". но какое это отношение имеет к коду?
Если вы знаете как скетч переделать для Digispark, то сделайте это пж
закажите в разделе помощи, кто-нить сделает