Digispark attini85

Gofen
Offline
Зарегистрирован: 02.12.2019

Други, прошу хелпа!
Есть скетч.

 

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), как описано в http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

 

При компилировании выдает ошибку:
Fridge_Door_Detector_Alarm_ATtiny85_v03_Sleep_Enabled.ino:60: undefined reference to `timer0_overflow_count'
Я выделил в скетче.
Вопрос: когда убираю extern компилируется но подозреваю что работает не правильно, хотя по внешним признакам не понятно.
работаю на arduino IDE 1.6.13 под windows XP. Скетч для платы digispark. Проект отсюда https://www.instructables.com/id/Fridge-Door-Detector-Alarm/
Исходя из того что код писал вроде знающий чел и все у него работает, подозреваю что проблема связана с версией компилятора.
Может кто нить скомпилирует у себя и пришлет hex, моя благодарность не знала бы границ. Или поскажите что нить дельное.

 

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

Други, прошу хелпа по Attiny85!

Есть скетч.

/*
  Fridge Door Alarm Detector
  Version 03
  
  Written by Pavel Mihaylov and Tatqna Mihaylova
  09 October 2012
  
  This version is ready to be uploaded to ATtiny85 microcontroller using Arduino Uno as a programmer.
  For full instructions see: http://www.instructables.com/id/Fridge-Door-Detector-Alarm/
 */

// Following lines are essential to enable sleep mode
#include <avr/sleep.h>
#include <avr/wdt.h>

#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
volatile boolean f_wdt = 1;


int pwr = 1; //(Could be pin 3 on Arduino) hard pin 6 on ATtiny
int alarm = 0; //(Could be pin   on Arduino) hard pin 5 on ATtiny
int door  = 2; //(Could be pin 5 on Arduino) hard pin 7 on ATtiny
int LDR = 3; //(Could be pin A0 on Arduino) hard pin 2 on ATtiny
int time_door_open = (30)*1000; //Time that sets the beep alarm on after the fridge door is opened
int time = 50; //Time delay
int time_tone = 80;  //Time delay to make the beep tone
int time_tone2 = 60;  //Time delay to make the beep tone
float trig = 2.5; //Trigger level for the LDR
float LDRval = 0; //Initial value of the LDR measurement level
int door_left = 0; //Variable to set whether the door is left opened (1) or closed (0)
extern volatile unsigned long timer0_overflow_count; //This is required to know when a rollover occurs

//Pins setup
void setup() {                
  pinMode(pwr, OUTPUT);
  pinMode(alarm, OUTPUT);
  pinMode(door, OUTPUT);  
  pinMode(LDR, INPUT); 
  setup_watchdog(8); // approximately 4 seconds sleep
  // 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
}
  
  //Main program loop
void loop() {
   //
   if (f_wdt==1) {  // wait for timed out watchdog / flag is set when a watchdog timeout occurs
    f_wdt=0;       // reset flag
    //
    
    if(read_light()) //In case the door is opened this statement will be true
    {
    
      door_left = 1;
    
      timer0_overflow_count = 0;
      unsigned long start = millis(); // This is the time countdown when the door is opened
      while( (millis() - start) <= time_door_open )
      {
        if(millis() - start > 0) break; //break while loop if rollover occures

        if(read_light() == 0) // If door is closed the program does nothing and starts again
        {
          door_left = 0;
          break;
        }
        delay(time); //delay needed
      }
    
      if(door_left == 1) alarm_sound(); // If door is opened start the beep sound!
       
    }     
      //Now put the system to sleep
      system_sleep();
  }
}



//Function to read the light sensor (LDR) and return either 0 (door is closed) or 1 (door is opened)

int read_light()
{
  digitalWrite(pwr, HIGH);    // turn the pwr pin on by making the voltage high to allow a measurement to be taken
  
  LDRval = analogRead(LDR); // read the sensor value

  digitalWrite(pwr, LOW);    // turn the pwr pin off by making the voltage low  
  
  LDRval = LDRval/1024*5; // sensor value is in the range 0 to 1023 and we need it between 0 and 5 - this is the calculation required
  
  if(LDRval<trig) // This compares the reading to the trigger level
  {
    digitalWrite(door, HIGH); // Turn the external LED ON to show that the door is opened
    return 1; // Means door is opened
  }
  else
  {
    digitalWrite(door, LOW); // Turn the external LED OFF to show that the door is closed
    return 0; // Means door is closed
  }
}


/*
   Loop to make the beep sounds
   First makes three 3-beep sounds
   Then makes 4-beep spunds for ever if the door remains opened
*/

void alarm_sound()
{
  int looop_1_count=0;
  int sound_loop1_skip = 0;
  while(read_light() && looop_1_count<3 && sound_loop1_skip == 0) // This makes the loop beep 3 times a 3-beep tone
  {
      
    tone(alarm, 4000); //make beep sound on
    delay(time_tone);
    delay(time_tone2);
    
    noTone(); //make beep sound stop
    delay(time_tone2);
    
    tone(alarm, 4000); //make beep sound on
    delay(time_tone2);
    noTone(); //make beep sound stop
    delay(time_tone2);
    
    tone(alarm, 4000); //make beep sound on
    delay(time_tone2);
    noTone(); //make beep sound stop
    delay(time_tone2);
    
    looop_1_count++;
    read_light();
    delay(60000);
  }
   
  //second beep loop now begins
  
  looop_1_count = 0;
  while(read_light())
  {
    tone(alarm, 4000); //make beep sound on
    delay(time_tone);
    delay(time_tone);
    noTone();; //make beep sound stop
    delay(time_tone2);
    
    tone(alarm, 4000); //make beep sound on 
    delay(time_tone2);
    noTone(); //make beep sound stop
    delay(time_tone2);
    
    tone(alarm, 4000); //make beep sound on
    delay(time_tone2);
    noTone(); //make beep sound stop
    delay(time_tone2);
    
    tone(alarm, 4000); //make beep sound on
    delay(time_tone2);
    noTone(); //make beep sound stop
    delay(time_tone2);
    
    delay(10000);

  }
  
  //now go on beeping if door is still opened
  if(read_light())
  {
    sound_loop1_skip = 1; // This will make the program skip the 3-beep sound and continue the 4-beep sound
    delay(2000);             
    if(read_light()) alarm_sound();
  }
  else sound_loop1_skip = 0;
}


// set system into the sleep state 
// system wakes up when wtchdog is timed out
void system_sleep() {
  cbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter OFF

  set_sleep_mode(SLEEP_MODE_PWR_DOWN); // sleep mode is set here
  sleep_enable();

  sleep_mode();                        // System sleeps here

  sleep_disable();                     // System continues execution here when watchdog timed out 
  sbi(ADCSRA,ADEN);                    // switch Analog to Digitalconverter ON
}

// 0=16ms, 1=32ms,2=64ms,3=128ms,4=250ms,5=500ms
// 6=1 sec,7=2 sec, 8=4 sec, 9= 8sec
void setup_watchdog(int ii) {

  byte bb;
  int ww;
  if (ii > 9 ) ii=9;
  bb=ii & 7;
  if (ii > 7) bb|= (1<<5);
  bb|= (1<<WDCE);
  ww=bb;

  MCUSR &= ~(1<<WDRF);
  // start timed sequence
  WDTCR |= (1<<WDCE) | (1<<WDE);
  // set new watchdog timeout value
  WDTCR = bb;
  WDTCR |= _BV(WDIE);

}
  
// Watchdog Interrupt Service / is executed when watchdog timed out
ISR(WDT_vect) {
  f_wdt=1;  // set global flag
}

При компилировании выдает ошибку:
Fridge_Door_Detector_Alarm_ATtiny85_v03_Sleep_Enabled.ino:60: undefined reference to `timer0_overflow_count'
Вопрос: когда убираю extern компилируется но подозреваю что работает не правильно, хотя по внешним признакам не понятно.
работаю на arduino IDE 1.6.13 под windows XP. Скетч для платы digispark. Проект отсюда https://www.instructables.com/id/Fridge-Door-Detector-Alarm/
Исходя из того что код писал вроде знающий чел и все у него работает, подозреваю что проблема связана с версией компилятора.
Может кто нить скомпилирует у себя и пришлет hex, моя благодарность не знала бы границ. Или поскажите что нить дельное.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Перечитываем п.5 правил. http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov#commen...

Поскольку код не твой, то и обращайся к автору.

Если бы ты мог объяснить, для чего вот этот "timer0_overflow_count" нужен, то и ошибку бы исправил моментально. ;))))

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

Вам же на ua уже всё сказали, чего Вы ещё ждёте? Обращайтесь к автору, т.к. никто не знает что он там наваял, какая у него поддержка тини и т.п. Скорее всего у Вас поддержка тини стоит не та, что к него.

Gofen
Offline
Зарегистрирован: 02.12.2019

Ну спасибо, что не отказали. Если бы я мог и знал то и не обращался бы. Ну да ладно.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Gofen,

#include <wiring.c>

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Gofen пишет:

Ну спасибо, что не отказали. Если бы я мог и знал то и не обращался бы. Ну да ладно.

 

Ну как же задолбали!

Вот тебе аналогия: сейчас как раз пришло время переобуваться в зимнюю резину, скоро снег пойти должен, я про МО, если что.

В "гаражах" мужики помогут, потому, что общие интересы. Но Если кто-то приедет в гаражи без общих интересов "про машинки", то бесплатно помогать никто не станет. Как и стремно попросить на шиномонтаже: "Мужики, подсобите резину перекинуть".

Вот так и тут - если ты интересен, как будущий коллега по хобби, то тебе помогут и объяснят. Если ты пришел с какой-то примитивной глупостью и не собираешься заниматься программированием, то зачем ты тут нужен? Зачем тебе помогать - из человеколюбия? Ты тут видел баннер "Армия спасения"? А знаешь почему не видел? Потому что его тут нет!

=====================

В приведенном тобой коде обе строки с timer0_overflow_count (и объявление и использование) вообще не нужны. Их написал дурак и из глупости. Почему так - ты объяснений не поймешь. Это было написано как якобы-защита-от-переполнения. Просто выкинь.

Gofen
Offline
Зарегистрирован: 02.12.2019

Спасибо большое!

И не нужно философии, я и сам могу... Может со временем и я найчусь писать код, но все с чего то начинают, зачем сразу какашками бросаться?

 

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Gofen пишет:

 Может со временем и я найчусь писать код

Так ты телегу впереди лошади не ставь. Сначала найчись, а потом уж проекты делай.

Клапауций 003
Offline
Зарегистрирован: 20.07.2019

Gofen пишет:

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

найчись вначале просто - писать.

затем, перейдёшь на какашки.