Ответить Создать тему

Arduino кто разбирается?

ZhenyaKa
post Nov 12 2018, 01:41 
Отправлено #16


Активный

Сообщений: 1 393
Из: Чебоксары



Цитата(Sovest @ Nov 11 2018, 21:27)
Ребят! Вопрос такой, с ардуинкой вообще не связывался (да и с микроконтроллерами). Но ужеи не знаю как быть. Перелопатил инэт но нашел только промышленные решения. Исходящее. Нужно измерять температуру с 3-х 5-и температурных датчиков, запись на карту значений. Желательно с показометром на дисплее. Может кто набросает схему (хотя бы примерно) и сборку скетча (ну или какие нужны библиотеки).
*

цена вопроса?

--------------------
Profile CardPM
  0/0  
Отнюдь
post Nov 12 2018, 07:54 
Отправлено #17


Активный

Сообщений: 23 561
Из: раненный душою



Цитата(Sovest @ Nov 11 2018, 21:27)
Может кто набросает схему (хотя бы примерно) и сборку скетча (ну или какие нужны библиотеки).
*

какая схема? пучок терморезисторов в делители с постоянными резисторами на аналоговые входы ардуины. шилд с SD-слотом на SPI. индикаторы на MAX7219 или что больше нравится - на SPI или на любые свободные порты.
софт гуглится по "max7219 arduino library" и "arduino sd card dataloger"
года два назад лепил что-то такое на макетке-хлеборезке. схемы нету, скетч толком не закомментирован. выкладываю как есть - ковыряйте
скетч
Исходный код

/*
 SD card datalogger

подключения:
* терморезисторы на входах 0 - 3
* SD сидит на SPI:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/

#include <SPI.h>
#include <SD.h>
#include "LedControl.h"
#include "math.h"

LedControl lc=LedControl(9,8,7,2);

unsigned long previousMillis = 0;     //тут будем хранить предыдущее время с момента включения
boolean sec=false;
const int chipSelect = 4;
const long interval = 1000;           //интервал между отсчетами в мс

void setup()
{
   // открытие канала связи UART
   Serial.begin(9600);
 
         /*включение и очистка индикаторов
          The MAX72XX is in power-saving mode on startup,
          we have to do a wakeup call
          */
         lc.shutdown(0,false);
         lc.shutdown(1,false);
         /* Set the brightness to a medium values */
         lc.setIntensity(0,8);
         lc.setIntensity(1,8);
         /* and clear the display */
         lc.clearDisplay(0);
         lc.clearDisplay(1);
   
   while (!Serial) {
   ; // для экзотики - ждем отклика последовательного канала
   }

   Serial.print("Initializing SD card...");
 
   // проверяем доступность SD
   if (!SD.begin(chipSelect)) {
       Serial.println("Card failed, or not present");

       return;
   }
   Serial.println("card initialized.");
 
   // откроем файл на запись
   File dataFile = SD.open("datalog.txt", FILE_WRITE);
 
   // если файл доступен - пишем в него шапку
   if (dataFile) {
       dataFile.println("time (s),ADC0,ADC1,ADC2,ADC3");
       dataFile.close();
       // в последовательный порт тоже закинем шапку
       
   }
   Serial.println("time (s),ADC0,ADC1,ADC2,ADC3");
}

//**********вывод номера датчика и его температуры на индикатор
void printNumber(int v, int ind, int pos, boolean sec) {
   int ones;
   int tens;
   int hundreds;
   boolean negative = false;  

   if (v < -99 || v > 999) return;

   if (v < 0) {
       negative = true;
       v=v*-1;
   }
   ones=v%10;
   v=v/10;
   tens=v%10;
   v=v/10;
   hundreds=v;
   lc.setChar(ind,pos*4+3,(byte)(ind*2+1-pos),sec);
   if (negative == true) {
       lc.setChar(ind,pos*4+2,'-',false);
   }
   else {
       lc.setChar(ind,pos*4+2,' ',false);
   }
   //пишем '-' в крайний левый знак

   //пишем число
   if(hundreds==0) {
       lc.setDigit(ind,pos*4+2,' ',false);
       if(tens==0) {
           lc.setDigit(ind,pos*4+1,' ',false);
       }
       else {
           lc.setDigit(ind,pos*4+1,(byte)tens,false);
       }
   }
   else {
     lc.setDigit(ind,pos*4+2,(byte)hundreds,false);
     lc.setDigit(ind,pos*4+1,(byte)tens,false);
   }
   lc.setDigit(ind,pos*4+0,(byte)ones,true);
}

//********** пересчет оцифрованного значения в градусы Цельсия
double Thermister(int RawADC) {
  double Temp;
  Temp = log((5222400/RawADC)-5100);
  Temp = ((1+(0.006*Temp*Temp))*Temp)*10.2-102.5;
  return Temp;
}

void loop()
{
   //проверим, прошла ли секунда с прошлого раза
   unsigned long currentMillis = millis();

     if((currentMillis - previousMillis >= interval/2) && sec==true) {
         lc.setDigit(0,7,0,false);
         lc.setDigit(0,3,1,false);
         lc.setDigit(1,7,2,false);
         lc.setDigit(1,3,3,false);
         sec=false;
     }
     
     if(currentMillis - previousMillis >= interval) {
         previousMillis = currentMillis;
         sec=true;
         // обработаем аналоговые входы и запишем результаты с меткой времени
         String dataString = ""; //строка для записи на карту памяти
         String dataString1 = "°C: "; //строка с температурами в градусах Цельсия
         // начать строку с метки времени от момента включения в мс
         dataString += int(millis()/1000);
         dataString += ",";
     
         // считаем четыре датчика и запишем в строку и на индикатор
         for (int analogPin = 0; analogPin < 4; analogPin++) {
             int sensor = analogRead(analogPin);
             dataString += String(sensor);

             if (sensor<32) sensor=32;
             if (sensor>1011) sensor=1011;
             int dannye=int(Thermister(sensor));
             dataString1 += String(dannye)+",";
             printNumber(dannye,int(analogPin/2),(int(analogPin*3+1)%2),sec);
           
             if (analogPin < 3) {
                 dataString += ",";
             }
         }
     
         // откроем файл на запись. может быть открыт только один файл,
         // поэтому перед открытием другого, текущий должен быть закрыт.
         File dataFile = SD.open("datalog.txt", FILE_WRITE);
       
         // если файл доступен, пишем в него:
         if (dataFile) {
             dataFile.println(dataString);
             dataFile.close();
         }
         // если файл не открывается, отправим в UART сообщение об ошибке:
         else {
             Serial.println("error opening datalog.txt");
         }
         // отправим строку и в UART:
         Serial.println(dataString);
         Serial.println(dataString1);
   }
}



UPD:
4 термодатчика K45-4k7 производства EPCOS. что с ними в делителях стояло не помню - считайте. пересчет в градусы сделан методом тыка в самой ардуине через логарифм - потребовалась математическая библиотека.
индикаторы - две платы по восемь разрядов на MAX7219
и еще у меня была довольно шумное окружение, возможно поэтому SD-карта иногда отваливалась. а может быть из-за плохого контакта - для моих целей хватало, для себя ковыряйте самостоятельно

Сообщение отредактировал Отнюдь - Nov 12 2018, 08:00

--------------------
Мощность распределять нужно плавно и равномерно (ц) Гена21
Profile CardPM
  0/+3  
Valeriy
post Mar 20 2019, 21:49 
Отправлено #18


Гуру

Сообщений: 15 810



Где в Чебах можно приобрести программатор USBASP для ATMEGA?

--------------------
Да воздастся каждому по мыслям и делам...
Profile CardPM
  0/0  
Отнюдь
post Mar 21 2019, 07:51 
Отправлено #19


Активный

Сообщений: 23 561
Из: раненный душою



Цитата(Valeriy @ Mar 20 2019, 21:49)
Где в Чебах можно приобрести программатор USBASP для ATMEGA?
*

www.ntk-ic.ru
какой-то конструктор совместимый предлагают

--------------------
Мощность распределять нужно плавно и равномерно (ц) Гена21
Profile CardPM
  0/+1  
ap@chi
post Mar 21 2019, 12:43 
Отправлено #20


Покинул этот форум 19.02.21

Сообщений: 11 265



Цитата(Valeriy @ Mar 20 2019, 21:49)
Где в Чебах можно приобрести программатор USBASP для ATMEGA?
*

В радиодеталях на заливе видел, что то около 300р.
Profile CardPM
  0/0  
Valeriy
post Mar 22 2019, 16:29 
Отправлено #21


Гуру

Сообщений: 15 810



Цитата(ap@chi @ Mar 21 2019, 12:43)
В радиодеталях на заливе видел, что то около 300р.
*


Это электротовары? Там нет, спрашивал.

--------------------
Да воздастся каждому по мыслям и делам...
Profile CardPM
  0/0  
batyr
post Nov 7 2021, 11:50 
Отправлено #22


Активный

Сообщений: 1 197



Может кто знает, какова максимальная частота переключения у драйвера MX1508? Подойдет-ли он для замены транзисторной сборки из этой схемы:

Присоединённое изображение
Нагрузка это ультразвуковой пьезоизлучатель 20-40кГц.

--------------------
"Ты хочешь знать, как мне это удалось? Я не оставлял сил на обратный путь."
Profile CardPM
  0/0  

ОтветитьTopic Options
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
Быстрый ответ
Кнопки кодов
 Расширенный режим
 Нормальный режим
    Закрыть все тэги


Открытых тэгов: 
Введите сообщение
Смайлики
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
         
Показать все

Опции сообщения