1 (edited by gorchakov 2023-03-31 04:15:49)

Topic: Учебный эксперимент

Разные поделки конечно интересны,но их польза только для забавы или для домашних дел. А вот в образовании можно сделать много разных экспериментальных установок, при создании которых студент одновременно осваивает и физику и электронику и программирование. Вот пример такой установки был разработан мною для учебных занятий студентов. Основан он на известном опыте Кундта по изучению стоячих волн в трубе. Опыт позволяет измерить скорость звука в воздухе и вычислить связанные с ним величины. Для создания такой установки нужно найти трубку подходящего размера, купить на алиэкспрессе зумммер, микрофон и какой-нибудь микроконтроллер, соединить все это и написать программу. ОБойдется все это в пару сотен рублей. Вся сложность здесь в самой программе, так как микроконтроллер должен одновременно и генерировать звук и оцифровывать его. да еще и выводить график на экран. А если это еще и через интернет запустить, то вообще получается удаленный лабораторный практикум. Вот текст программы


// определение режима соединения и подключение библиотеки RemoteXY
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#include <ESP8266WiFi.h>

#include <RemoteXY.h>

// настройки соединения
#define REMOTEXY_WIFI_SSID "one"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377
const byte dynPin=2;
//генерация звука на втором пине
const int IN_PIN = A0;
//прием звука на аналоговом пине а0
const int MAX_ADC_VALUE = 1023;//возможно изменить на 255
int frec;

// конфигурация интерфейса 
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =   // 45 bytes
  { 255,1,0,4,0,38,0,16,126,0,68,49,7,7,87,42,94,186,97,109,
  112,108,105,116,117,100,101,0,2,0,33,51,22,11,2,26,31,31,79,78,
  0,79,70,70,0 };
 
// структура определяет все переменные и события вашего интерфейса управления
struct {

    // input variables
  uint8_t switch_1; // =1 если переключатель включен и =0 если отключен

    // output variables
  float onlineGraph_1;

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////



void setup()
{
  RemoteXY_Init ();
   pinMode(dynPin,OUTPUT);
  pinMode(IN_PIN, INPUT);
frec=3000;//исходное значение частоты 3000 Гц
 
 
 
}

void loop()
{
  RemoteXY_Handler ();
  if ((RemoteXY.switch_1!=0)and (frec<5000)){
//инициализируем переменные
int mn = 1024;
int mx = 0;
tone(dynPin,frec);//запускаем генератор звука
for (int i=0; i < 1000; ++i) {//ищем макс и мин значения амплитуды
int val = analogRead(IN_PIN);
mn = min(mn, val);
mx = max(mx, val);
}
//нашли размах амплитуды
       frec=frec+100;//увеличиваем частоту на 100 для следующего измерения
    noTone(dynPin);//отключаем звук
       RemoteXY.onlineGraph_1 = float (5.0 / MAX_ADC_VALUE* (mx - mn));
}
else {
    /*  выключатель выключен */
  }
  }
Правда не удается вывести график почему-то, хотя без вай-фая все работает.Что-то тут конфликтует с фай-фаем, а что я понять не могу, так как не знаю как реализован интерфейс с фай-фаем.

2

Re: Учебный эксперимент

Сделал я вывод графика на сотовый телефон, используя советы из этого раздела.

gorchakov wrote:

Разные поделки конечно интересны,но их польза только для забавы или для домашних дел. А вот в образовании можно сделать много разных экспериментальных установок, при создании которых студент одновременно осваивает и физику и электронику и программирование. Вот пример такой установки был разработан мною для учебных занятий студентов. Основан он на известном опыте Кундта по изучению стоячих волн в трубе. Опыт позволяет измерить скорость звука в воздухе и вычислить связанные с ним величины. Для создания такой установки нужно найти трубку подходящего размера, купить на алиэкспрессе зумммер, микрофон и какой-нибудь микроконтроллер, соединить все это и написать программу. ОБойдется все это в пару сотен рублей. Вся сложность здесь в самой программе, так как микроконтроллер должен одновременно и генерировать звук и оцифровывать его. да еще и выводить график на экран. А если это еще и через интернет запустить, то вообще получается удаленный лабораторный практикум. Вот текст программы


// определение режима соединения и подключение библиотеки RemoteXY
#define REMOTEXY_MODE__ESP8266WIFI_LIB_POINT
#include <ESP8266WiFi.h>

#include <RemoteXY.h>

// настройки соединения
#define REMOTEXY_WIFI_SSID "one"
#define REMOTEXY_WIFI_PASSWORD "12345678"
#define REMOTEXY_SERVER_PORT 6377
const byte dynPin=2;
//генерация звука на втором пине
const int IN_PIN = A0;
//прием звука на аналоговом пине а0
const int MAX_ADC_VALUE = 1023;//возможно изменить на 255
int frec;

// конфигурация интерфейса 
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =   // 45 bytes
  { 255,1,0,4,0,38,0,16,126,0,68,49,7,7,87,42,94,186,97,109,
  112,108,105,116,117,100,101,0,2,0,33,51,22,11,2,26,31,31,79,78,
  0,79,70,70,0 };
 
// структура определяет все переменные и события вашего интерфейса управления
struct {

    // input variables
  uint8_t switch_1; // =1 если переключатель включен и =0 если отключен

    // output variables
  float onlineGraph_1;

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////



void setup()
{
  RemoteXY_Init ();
   pinMode(dynPin,OUTPUT);
  pinMode(IN_PIN, INPUT);
frec=3000;//исходное значение частоты 3000 Гц
 
 
 
}

void loop()
{
  RemoteXY_Handler ();
  if ((RemoteXY.switch_1!=0)and (frec<5000)){
//инициализируем переменные
int mn = 1024;
int mx = 0;
tone(dynPin,frec);//запускаем генератор звука
for (int i=0; i < 1000; ++i) {//ищем макс и мин значения амплитуды
int val = analogRead(IN_PIN);
mn = min(mn, val);
mx = max(mx, val);
}
//нашли размах амплитуды
       frec=frec+100;//увеличиваем частоту на 100 для следующего измерения
    noTone(dynPin);//отключаем звук
       RemoteXY.onlineGraph_1 = float (5.0 / MAX_ADC_VALUE* (mx - mn));
}
else {
    /*  выключатель выключен */
  }
  }
Правда не удается вывести график почему-то, хотя без вай-фая все работает.Что-то тут конфликтует с фай-фаем, а что я понять не могу, так как не знаю как реализован интерфейс с фай-фаем.