нужна программа на ардуино ТАХОМЕТР

Тема в разделе "Закажу проект", создана пользователем Алекс_76_СССР, 14 ноя 2019.

  1. KindMan

    KindMan Гик

    А человек чего говорит на это?
     
  2. я уж программу вдоль и поперек менял , смотрел, загружал заново, менял три платы, пять датчиков, дисплей менял, ноутбук другой задействовал, просто с ума схожу.
     
  3. человек намекает что я идиот и что-то сам не так делаю.
    а как не так то , три файла скинул в папку , загрузил в плату , а тупо тишина на дисплее и на мониторе порта . программа труп
     
  4. KindMan

    KindMan Гик

    Выложите сюда, посмотрим.
     
  5. у меня простой счетчик импульсов с выводом на дисплей 7219 , я же не умную теплицу строю с 20 датчиками .........
    сам да, не могу разобраться, в этом не силен , просто не ожидал что получу продукт , а поддержки НОЛЬ будет.
     
  6. Выложу исходный код и что прислали после редактирования
     
  7. выложил сам INO, ссылку незнаю как выложить

    может я правда идиот и что то не так делаю
     
  8. // 4-р тахометр MAX7219

    #define DEBUG 0
    #define NAME "Tahometr-7219"
    #define VERSION "v0.1"
    #define UART_BAUDRATE 9600

    #define MAX7219_CS 10 //индикаторов
    #define MAX7219_DIN 11
    #define MAX7219_CLK 13


    #include <Wire.h>
    #include "LiquidCrystal_I2C.h"
    #include "HCMAX7219.h"

    LiquidCrystal_I2C lcd(0x27,16,2);
    HCMAX7219 MAX7219(MAX7219_CS);


    const int pinPhoto = A0; // порт для считывания данных с фоторизистора
    int light = 0; // переменная для хранения данных с фоторизистора
    int numTurn = 0; // номер итерации проверки оборотов
    int valArray[100]; // массив для хранения данных с фоторезистора, нужные для начальной настройки
    int maxLight = 1024; // порог, при котором будем считать, что светодиод закрыт
    int sum = -1; // сумма количеств оборотов
    int count_zamer = 20; // количество итераций, после которых будет высчитано среднее значение скорости
    unsigned long lastMillis = 0; // переменная для хранения времени предыдущего перекрытия светодиода
    bool work = true; // флаг, который поднимается после открытия светодиода


    void setup()
    {
    Serial.begin(UART_BAUDRATE);
    Serial.println(F(NAME " " VERSION " " __DATE__ " " __TIME__));

    MAX7219.Intensity(7, 0);
    MAX7219.Clear();
    MAX7219.print7Seg((uint16_t)1234, (uint8_t)8);
    MAX7219.Refresh();

    #if DEBUG
    maxLight = 500;
    #else
    pinMode(pinPhoto, INPUT);
    delay(1000); // ждем пока светодиод прогреется
    for (int i = 0; i < 100; i++) { // многократное чтение с фоторезистора
    valArray = analogRead(pinPhoto);
    delay(10);
    }
    for (int i = 0; i < 100; i++) // выбираем минимальное значение
    if (maxLight > valArray)
    maxLight = valArray;
    maxLight -= 10; // снизим порог
    Serial.println(maxLight);
    #endif
    lcd.init(); // вывод с большой задержкой!?
    // lcd.backlight();
    // lcd.clear();
    // lcd.setCursor(0, 0); lcd.print("S"); //к чему эта ахинея?
    // lcd.setCursor(1, 0); lcd.print("T");
    // lcd.setCursor(2, 0); lcd.print("A");
    // lcd.setCursor(3, 0); lcd.print("R");
    // lcd.setCursor(4, 0); lcd.print("T");
    // lcd.setCursor(5, 0); lcd.print("!");
    lcd.print("START!");
    Serial.println("START!");
    delay(500);
    lastMillis = millis();
    }


    void loop()
    {
    light = analogRead(pinPhoto); // считаем показания с фоторезистора
    if (light < maxLight && work) { // значение ниже порога - светодиод загорожен
    work = false; // не считаем пока светодиод перекрыт
    if (sum == -1) { // не считаем первую итерацию
    lastMillis = millis(); // записываем время старта
    sum = 0;
    }
    else {
    unsigned long currentMillis = millis();// количество миллисекунд между оборотами
    sum += currentMillis - lastMillis;
    numTurn++;
    if (numTurn == count_zamer) { // многократно, для большей точности
    numTurn = 0;
    uint16_t sredSpeed = 60000 / (sum / count_zamer); // усредняем, оборотов в минуту
    Serial.print("speed: ");
    Serial.println(sredSpeed);
    sum = -1;

    lcd.clear();
    lcd.setCursor(0, 0); lcd.print("S");
    lcd.setCursor(1, 0); lcd.print("P");
    lcd.setCursor(2, 0); lcd.print("E");
    lcd.setCursor(3, 0); lcd.print("E");
    lcd.setCursor(4, 0); lcd.print("D");
    lcd.setCursor(5, 0); lcd.print(":");
    char string_turn[] = "";
    sprintf(string_turn,"%d", (int)sredSpeed);
    char *current = string_turn;
    int count_numbers = 0;
    while ( *current != '\0' ) {
    lcd.setCursor(6+count_numbers, 0);
    lcd.print(*current);
    count_numbers++;
    current++;
    }
    lcd.setCursor(count_numbers+7, 0); lcd.print("r");
    lcd.setCursor(count_numbers+8, 0); lcd.print("/");
    lcd.setCursor(count_numbers+9, 0); lcd.print("m");
    lcd.setCursor(count_numbers+10, 0); lcd.print("i");
    lcd.setCursor(count_numbers+11, 0); lcd.print("n");

    // HCMAX7219.Clear();
    MAX7219.print7Seg((uint16_t)sredSpeed, 8);
    MAX7219.Refresh();
    }
    lastMillis = currentMillis;
    }
    }
    if (light >= maxLight) // светодиод открыт
    work = true;
    }
     
  9. а исходный скетч в начале моей темы .
    изменения не большие, но мой дисплей 1602 на этом скетче не работает и на новом дисплее тоже и монитор .... тишина , только слово СТАРТ
     
  10. любой пример с программы шьется и работает , любой пример, т.е. плата рабочая и дисплей и датчик.
    загружаю как обычно, мне 43 года , я конечно в этом не шарю , но не идиот же , портить программу и потом жаловаться.
    просто от этой программы много чего зависит и я без нее как без рук.
    почему попросил переделать под другой дисплей, заказал двухдюймовые семисегментники и хочу к ним подпаяться , увеличив тем самым размер цифр и видимость издалека
     
  11. понятно , надписи start speed r\min Я УБЕРУ, МНЕ ОНИ НЕ К ЧЕМУ
     
  12. КАКИЕ ТО ОШИБКИ ПРИ КОМПИЛЯЦИИ , ИТОГ ----- ВЫСВЕЧИВАЕТСЯ 1234 и все.....

    могу и без ардуино подать питание и зажечь цифры 1234 , это ж не гирлянда е мае

    хочется прямо уже ноут разбить , от не понимания
     
  13. вот оригинал в порте , все работает.
    не приятно , что человек которому оплатил проект , с меня идиота делает.
     
  14. SergeiL

    SergeiL Оракул Модератор

    Так у вас COM6 порт не открывается и скетч не заливается в плату.
    Попробуйте закрыть все, что может использовать Com порт
     
  15. KindMan

    KindMan Гик

    У вас другая программа в контроллере, судя по скиншоту, а не та, что выложили выше. Этот код криво, но работает у меня.

    Код (C++):
    #define DEBUG 0
    #define NAME "Tahometr-7219"
    #define VERSION "v0.1"
    #define UART_BAUDRATE 9600

    #define MAX7219_CS 10 //индикаторов
    #define MAX7219_DIN 11
    #define MAX7219_CLK 13


    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <HCMAX7219.h>

    LiquidCrystal_I2C lcd(0x27,16,2);
    HCMAX7219 MAX7219(MAX7219_CS);


    const int pinPhoto = A0; // порт для считывания данных с фоторизистора
    int light = 0; // переменная для хранения данных с фоторизистора
    int numTurn = 0; // номер итерации проверки оборотов
    int valArray[100]; // массив для хранения данных с фоторезистора, нужные для начальной настройки
    int maxLight = 1024; // порог, при котором будем считать, что светодиод закрыт
    int sum = -1; // сумма количеств оборотов
    int count_zamer = 20; // количество итераций, после которых будет высчитано среднее значение скорости
    unsigned long lastMillis = 0; // переменная для хранения времени предыдущего перекрытия светодиода
    bool work = true; // флаг, который поднимается после открытия светодиода


    void setup()
    {
    Serial.begin(UART_BAUDRATE);
    Serial.println(F(NAME " " VERSION " " __DATE__ " " __TIME__));

    MAX7219.Intensity(7, 0);
    MAX7219.Clear();
    MAX7219.print7Seg((uint16_t)1234, (uint8_t)8);
    MAX7219.Refresh();

    #if DEBUG
    maxLight = 500;
    #else
    pinMode(pinPhoto, INPUT);
    delay(1000); // ждем пока светодиод прогреется
    for (int i = 0; i < 100; i++) { // многократное чтение с фоторезистора
    valArray[i] = analogRead(pinPhoto);
    delay(10);
    }
    for (int i = 0; i < 100; i++) // выбираем минимальное значение
    if (maxLight > valArray[i])
    maxLight = valArray[i];
    maxLight -= 10; // снизим порог
    Serial.println(maxLight);
    #endif
    lcd.begin(); // вывод с большой задержкой!?
    // lcd.backlight();
    // lcd.clear();
    // lcd.setCursor(0, 0); lcd.print("S"); //к чему эта ахинея?
    // lcd.setCursor(1, 0); lcd.print("T");
    // lcd.setCursor(2, 0); lcd.print("A");
    // lcd.setCursor(3, 0); lcd.print("R");
    // lcd.setCursor(4, 0); lcd.print("T");
    // lcd.setCursor(5, 0); lcd.print("!");
    lcd.print("START!");
    Serial.println("START!");
    delay(500);
    lastMillis = millis();
    }


    void loop()
    {
    light = analogRead(pinPhoto); // считаем показания с фоторезистора
    if (light < maxLight && work) { // значение ниже порога - светодиод загорожен
    work = false; // не считаем пока светодиод перекрыт
    if (sum == -1) { // не считаем первую итерацию
    lastMillis = millis(); // записываем время старта
    sum = 0;
    }
    else {
    unsigned long currentMillis = millis();// количество миллисекунд между оборотами
    sum += currentMillis - lastMillis;
    numTurn++;
    if (numTurn == count_zamer) { // многократно, для большей точности
    numTurn = 0;
    uint16_t sredSpeed = 60000 / (sum / count_zamer); // усредняем, оборотов в минуту
    Serial.print("speed: ");
    Serial.println(sredSpeed);
    sum = -1;

    lcd.clear();
    lcd.setCursor(0, 0); lcd.print("S");
    lcd.setCursor(1, 0); lcd.print("P");
    lcd.setCursor(2, 0); lcd.print("E");
    lcd.setCursor(3, 0); lcd.print("E");
    lcd.setCursor(4, 0); lcd.print("D");
    lcd.setCursor(5, 0); lcd.print(":");
    char string_turn[] = "";
    sprintf(string_turn,"%d", (int)sredSpeed);
    char *current = string_turn;
    int count_numbers = 0;
    while ( *current != '\0' ) {
    lcd.setCursor(6+count_numbers, 0);
    lcd.print(*current);
    count_numbers++;
    current++;
    }
    lcd.setCursor(count_numbers+7, 0); lcd.print("r");
    lcd.setCursor(count_numbers+8, 0); lcd.print("/");
    lcd.setCursor(count_numbers+9, 0); lcd.print("m");
    lcd.setCursor(count_numbers+10, 0); lcd.print("i");
    lcd.setCursor(count_numbers+11, 0); lcd.print("n");

    MAX7219.Clear();
    MAX7219.print7Seg((uint16_t)sredSpeed, 8);
    MAX7219.Refresh();
    }
    lastMillis = currentMillis;
    }
    }
    if (light >= maxLight) // светодиод открыт
    work = true;
    }
     
    Daniil и Алекс_76_СССР нравится это.
  16. другая, исходная, до изменений
     
  17. вот чудо , что то хоть запрыгало , но блин хаотичное не зависящее от оборотов
    как Вы оживили дисплей
     
  18. Все заливается, просто ком порт влючил нечайно до конца заливки , а так все отлично загружается