Страница 5 из 18 ПерваяПервая 123456789101112131415161718 ПоследняяПоследняя
Показано с 41 по 50 из 178
  1. #41
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    34
    Сообщений
    825
    Вес репутации
    311

    По умолчанию Re: Бортовой компьютер мотоцикла

    Нет не успеет, либо смастерить схему так что бы ардуинка выключалась с задержкой, например питание на нее завести через оптопару или транзистор и параллельно аноду и катоду повесить конденсатор микрофарат на 470 но при этом +5v (питание ардуино) должно оставаться включенным после отключения питания. Лучше сделать запись по какому то событию типа завел заглушил, или положение зажигания ступень 1 ступень 2
    хороший модем должен качать пиво!
    Мой проект

  2. #42
    Местный
    Регистрация
    07.12.2014
    Сообщений
    102
    Вес репутации
    57

    По умолчанию Re: Бортовой компьютер мотоцикла

    Наверно всё таки придётся на постоянную включить ардуину.

    Вчера старательно игнорировал библиотеку EEPROM2.h, пытался написать свою мини функцию для чтения больших чисел (например 12546 ) из EEPROM... получилось конечно но если записать скетч в ардуину она зависает и игнорирует последующие попытки записать, что либо. Спасает только запись скетча BLINK из стандартных примеров.

    Просьба посмотреть, что не так.

    PHP код:
    #include <EEPROM.h>

    int SERVIS[5][3] = {
    5,3,SERVIS[0][0]*SERVIS[0][1], // размер массива 5 строк[0][0],  3 столбца[0][1], 15 число ячеек [0][2]
    0,0,0//1 < например 12, 00, 00  = должно получится 12000
    0,0,0//2
    0,0,0//3
    0,0,0//4
    };

    int _Read_Eeprom()
    {
      
    int iii,x;
      
      for (
    int x 0SERVIS[0][2]; x++)
      {
        for (
    int i 1SERVIS[0][0] - 1i++) // i = 1-4
        
    {
          for (
    int ii 0ii SERVIS[0][1]; ii++) // ii = 0-3
          
    {
            
    SERVIS[i][ii] = EEPROM.read(x);    
          }
        }

      }
      
    }

    void setup()
    {
       
    _Read_Eeprom();
       
      
    String stringVar String(SERVIS[1][0]) + String(SERVIS[1][1] + String(SERVIS[1][2]);
      
    int intVar=stringVar.toInt();  
      
    Serial.println(intVar
       
    }

    void loop()
    {

    Последний раз редактировалось Oleg_33; 09.01.2015 в 18:21.

  3. #43
    Продвинутый
    Регистрация
    15.12.2008
    Возраст
    31
    Сообщений
    216
    Вес репутации
    311

    По умолчанию Re: Бортовой компьютер мотоцикла

    А не проще побайтно считать? Типа: var=(EEPROM.read(1)<<8)|EEPROM.read(0); ну или большее количество

  4. #44
    Местный
    Регистрация
    07.12.2014
    Сообщений
    102
    Вес репутации
    57

    По умолчанию Re: Бортовой компьютер мотоцикла

    Может и проще я не знаю ... у меня всегда проблемы были с байтами (надо отдельно с ними разбираться), не знаю чего с байтами потом делать . Уже начал читать книжку по С++, так как в общедоступной справке много чего нет.

    А можно рабочий пример ?
    Последний раз редактировалось Oleg_33; 09.01.2015 в 23:16.

  5. #45
    Продвинутый
    Регистрация
    15.12.2008
    Возраст
    31
    Сообщений
    216
    Вес репутации
    311

    По умолчанию Re: Бортовой компьютер мотоцикла

    Пример с записью/чтением через терминал. Запись двухбайтной переменной от 0 до 65535.
    Запись: в терминале отправляем 12345> в еепром пишется 12345
    Чтение: R. Возвращает считанное значение
    PHP код:
    #include <EEPROM.h>

    unsigned int invar=0;//переменная, которая будет записываться в еепром
    String instring="";//строка входящая для порта

    unsigned int eeprom_read()//чтение из еепром
    {
      
    unsigned int res=0;
      
    res=(EEPROM.read(2)<<8)|EEPROM.read(1);//читаем оба байта и собираем значение
      
    return res;
    }

    void eeprom_write(unsigned int val)//запись в еепром
    {
      
    EEPROM.write(1, (val 0xFF)); //пишем младший байт
      
    EEPROM.write(2, ((val 0xFF00) >> 8));//пишем старший байт
    }

    void setup(void)
    {
      
    Serial.begin(9600);//порт
    }

    void loop(void)
    {
      if(
    Serial.available()!=0)//есть входящий байт
      
    {
        
    byte inchar=Serial.read();//читаем его
        
    if(inchar=='>')//если пришел символ ">", то формируем из строки переменную и пишем ее в еепром
        
    {
          
    invar=instring.toInt();//строка в int
          
    Serial.print("Val to write:");
          
    Serial.println(invar);//для отладки выводим в порт то значение, которое получили
          
    eeprom_write(invar);//пишем его в еепром
          
    instring="";//обнуляем строку входящих
        
    }
        else if(
    inchar=='R')//пришел символ R. читаем еепром и выводим в порт
        
    {
          
    Serial.print("Read:");
          
    Serial.println(eeprom_read(),DEC);//выводим в порт то, что прочитали
          
    instring="";//обнуляем строку входящих
        
    }
        else
    //пришло что-то еше
        
    {
          if (
    isDigit(inchar))//проверяем цифра ли это
          
    {
            
    instring += (char)inchar//если да, то добавляем ее в строку
          
    }
        }
      }


  6. #46
    Местный
    Регистрация
    07.12.2014
    Сообщений
    102
    Вес репутации
    57

    По умолчанию Re: Бортовой компьютер мотоцикла

    Немного переделал схему.

    A0 - Датчик уровня топлива
    А1 - Датчик температуры
    А4 - Герконы (повышение и понижение скорости) кнопка меню.
    А5 - К замку зажигания клемма +15

    ---------------------------------------------------------------------------
    0RX - Вход датчика скорости, внешнее прерывание (джампер 1)
    D2 - Датчик температуры DS18B20
    D3 - [SCL]
    D4 - Минус датчика нейтрали для синхронизации индикатора скорости
    D5 - Контроль работы вентилятора охлаждения
    D6 - Контроль работы топливной помпы
    D7 - Вход датчика скорости, внешнее прерывание для настройки (джампер 2) \ свободен
    D11,12 - Принудительное включение вентилятора охлаждения и помпы
    SCL, SDA - Дисплей 0.96 128X64 OLED LCD

    Название: Arduino.jpg
Просмотров: 690

Размер: 103.2 Кб
    Последний раз редактировалось Oleg_33; 10.01.2015 в 18:35.

  7. #47
    Местный
    Регистрация
    07.12.2014
    Сообщений
    102
    Вес репутации
    57

    По умолчанию Re: Бортовой компьютер мотоцикла

    Вчера экспериментировал с дисплеем от NOKIA 5110, написал код таймера (одной поездки) единственное не учтено это переполнение milis(). Возможно не пригодится, так ради практики.
    Есть ли другой способ оперировать двух разрядными числами которые начинаются с нуля - 00 - 09 ? дисплей этого не понимает, при попытке сделать счётчик с одним нулём в разряде часов, минут и секунд "0:0:0" начинается голиматья при переходе на второй разряд числа - например секунды протикали с (0 - 60сек) ... дальше повтор и начинает меняться по счётчику не вторая цифра а первая (10,20,30 - 90, 10, 11сек) таймер правильно показывает но всё же это не дело

    Конечно поставлю модуль реального времени и не буду заморачиваться, но всё же хотелось разобраться.

    http://www.youtube.com/watch?feature...&v=XhUdxDRlDYk

    PHP код:
    #include <PCD8544.h>

    static PCD8544 lcd;
    static 
    unsigned long timee;
    byte time[6] = {1,3,2,5}; //hh:mm:ss
    boolean bmin falsebhour false;
    byte random1random2;
    String str ":";

    void setup(){lcd.begin(8448);pinMode(13OUTPUT);}

    void loop(){_HourTime();}

    void _Random(){lcd.setCursor(random1random2);lcd.print("          ");}

    int _HourTime()
    {
      
    lcd.setCursor(00);
     
      if ((
    millis()-timee)>1000
       { 
         
    digitalWrite(13HIGH);
         
    timee millis(); 
         
    str ":";
         
    time[5] ++;
         if (
    time[5] > 9){time[5] = 0time[4] ++; _Random(); random1 random(030); random2 random(05);}// Sec
         
    if (time[4] == && time[5] == 0){time[4] = 0time[5] = 0bmin true;}

         if (
    bmin == true) {time[3]++; bmin false;} //Min
         
    if (time[3] == 10){time[3] = 0time[2]++;}
         if (
    time[2] == && time[3] == 0){time[2] = 0time[3] = 0bhour true;}
          
         if (
    bhour == true) {time[1]++; bhour false;}//Hour
         
    if (time[1] == 10){time[1] = 0time[0]++;}
         if (
    time[0] == && time[1] == 4){time[0] = 0time[1] = 0;}
       }  
       if ((
    millis()-timee)>500){str " "digitalWrite(13LOW);}


      
    lcd.setCursor(random1random2);
      
    lcd.print(time[0]);
      
    lcd.print(time[1]);
      
    lcd.print(str);
      
    lcd.print(time[2]);
      
    lcd.print(time[3]);
      
    lcd.print(str);
      
    lcd.print(time[4]);
      
    lcd.print(time[5]);


  8. #48
    Местный
    Регистрация
    07.12.2014
    Сообщений
    102
    Вес репутации
    57

    По умолчанию Re: Бортовой компьютер мотоцикла

    Индикатор включенной передачи.

    Пока вместо герконов ,пока использую кнопки, они подключены к аналоговому входу через делитель напряжения.
    Принцип работы : при замыкании геркона UP номер передачи прирастает от 1 до 5, при замыкании геркона DOWN убывает от 5 до 1, время удержания геркона замкнутым роли не играет. Для сигнала о нейтральной передаче используется цифровой вход (кнопки не нашёл, просто замыкаю на массу ), поскольку нейтральная передача возможна только между первой и второй передачей, после нейтрали можно включить либо первую либо вторую скорость (герконы UP и DOWN), так же минус с датчика нейтрали нужен для синхронизации счётчика, ведь мотоцикл можно завести не только на нейтрали но и на скорости

    http://www.youtube.com/watch?feature...&v=RLtfptgGj3s

    PHP код:
    #include <PCD8544.h>

    static PCD8544 lcd;

    const 
    int GEAR_ANALOG_CONTROL_PIN 4;
    const 
    int GEAR_DIGITAL_NEITRAL_PIN 12;

    const 
    int UP_GEAR 300 // Делитель напряжения А4
    const int DOWN_GEAR 550// Делитель напряжения А4

    int GEAR_CURENT;
    int gearneital;
    int ug;

    boolean flag_gearH falseflag_gearL false;

    void setup()
    {
      
    pinMode(GEAR_DIGITAL_NEITRAL_PININPUT);         
      
    digitalWrite(GEAR_DIGITAL_NEITRAL_PINHIGH);       // включить подтягивающий резистор
      
    lcd.begin(8448);
    }

    int _Gear_Switch(int abcint gear1)// напряжение ацп, up или down
    {
      
    abcgear1;

      if (
    g) {flag_gearL true;}
      if (
    == && flag_gearL == true) {flag_gearH true;}
      if (
    flag_gearH == true && flag_gearL == true)
      {
        
    flag_gearH false
        
    flag_gearL false
        if (
    == UP_GEAR && GEAR_CURENT 5GEAR_CURENT++; //Ограничиваем наивысшую передачу на 5
        
    if (== DOWN_GEAR && GEAR_CURENT 1GEAR_CURENT--;//Ограничиваем низшую передачу на 1
        
    lcd.print("               ");
        
    lcd.setCursor(00);
        
    lcd.print("Gear - ");
        
    lcd.print(GEAR_CURENT);
       }
    }

    void loop()
    {   
      
    int anread analogRead(GEAR_ANALOG_CONTROL_PIN);
      if (
    anread DOWN_GEAR) {_Gear_Switch(anread,DOWN_GEAR);gear DOWN_GEAR;} // Если напряжение на делителе "равно" константе (замкнут геркон DOWN) то передаём в функцию напряжение и константу
        
    else if (anread UP_GEAR) {_Gear_Switch(anread,UP_GEAR);gear UP_GEAR;} // Замкнут геркон UP

      
    if (anread == && gear == DOWN_GEAR) {_Gear_Switch(0,DOWN_GEAR);gear 0;} // Передам в функцию ноль, геркон отключен
      
    if (anread == && gear == UP_GEAR) {_Gear_Switch(0,UP_GEAR);gear 0;} //
      
      
    if ( digitalRead(GEAR_DIGITAL_NEITRAL_PIN)== LOW ) {lcd.setCursor(00); lcd.print("Neitral        "); GEAR_CURENT 1;} //Если нейтраль то номер передачи равен одному
     

    Последний раз редактировалось Oleg_33; 15.01.2015 в 10:44.

  9. #49
    Новичок
    Регистрация
    15.03.2014
    Сообщений
    17
    Вес репутации
    50

    По умолчанию Re: Бортовой компьютер мотоцикла

    А что за байк, у которого помпу можно включать и отключать? Обычно вроде крыльчатка на валу и крутится постоянно.
    Экранчик от Nokia на солнце слепнуть не будет?
    Зачем провод от зажигания не понял. Чтобы сохранять пробег? Так его можно просто писать раз в раз в 10км или переключении на нейтраль (на нейтраль не всегда перед выключением есть возможность перейти, напр. при падении; хотя, при наличии stop engine можно только ей и обойтись).
    Вместо DS1820 можно использовать LM35 - одна аналоговая нога нужна, а питания с ардуины снять.

    Также хочу делать бортовик, но со следующими особенностями: полной ликвидацией приборки, на китай-arduino pro mini (размер!) и 4-х разрядным 7-сегментным LED-индикатором.
    Вход 12В с датчика скорости. Как преобразовать в 5В?
    Я собираюсь просто датчик холла или геркон свои поставить, запитав от ардуино, и магнитик на колесо. У меня тросиковый, так что без вариантов.

    Код:
    lcd.print(time[0]);
    lcd.print(time[1]);
    lcd.print(str);
    lcd.print(time[2]);
    lcd.print(time[3]);
    lcd.print(str);
    lcd.print(time[4]);
    lcd.print(time[5]); 
    ...
    if (flag_gearH == true && flag_gearL == true)
    Я бы написал так
    Код:
    char buff[256];
    sprintf (buff,"%i%i:%i%i:%i%i", time[0], time[1], time[2], time[3], time[4], time[5]);
    lcd.print (buff);
    ...
    if (flag_gearH && flag_gearL)
    Кстати, рекомендую забить на макетку. Для прототипирования лучше взять breadboard + набор перемычек (провода мне меньше понравились). А итоговую плату лучше потравить самому (перекись + лимонка + соль - отлично получилось с первого раза), засверлив дырки мини-дрелью из любого моторчика.

    P.S. Думал задать свои вопросы, как опознать наличие 12В на проводе, но XsanderS на них уже ответил У меня YBR125
    Последний раз редактировалось Aikon; 17.01.2015 в 03:19.

  10. #50
    Продвинутый
    Регистрация
    15.12.2008
    Возраст
    31
    Сообщений
    216
    Вес репутации
    311

    По умолчанию Re: Бортовой компьютер мотоцикла

    Oleg_33, по часам можно обойтись меньшим количеством переменных:
    PHP код:
    if ((millis()-timee)>1000
        { 
          
    timee millis(); 
          
    sec++;
          if (
    sec>= 60)
          {
            
    mm++;
            if(
    mm>=60)
            {
              
    hour++;
              if(
    hour>=24)
              {
                
    hour=0;
              }
              
    mm=0;
            }
            
    sec=0;
          }
          
    sprintf(lcd_buffer,"%02i:%02i:%02i",hour,mm,sec);
          
    lcd.print(lcd_buffer);
        } 
    Aikon,
    4-х разрядным 7-сегментным LED-индикатором
    На солнце (прямое попадание) нечитаемо. Проверено.
    Я бы смотрел на ЖК с трансфлективной матрицей. Не слепнет, на солнце отлично читается.

Страница 5 из 18 ПерваяПервая 123456789101112131415161718 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Яндекс.Метрика