4-канальный измеритель длины кабеля витой пары по емкости.

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Всем привет! Я новичек в программировании Ардуино и очень нужна помощь в доработке кода... Бьюсь уже месяца 4 с этим кодом и никак не получается запустить его, чтобы одновременно измерял 2-4 пары лан кабеля.

Причем если измерять чисто конденсаторы, то можно измерять одновременно все 4 конденсатора и все норм показывает.

По отдельности каждый из 4 каналов измеряет длину любой одной витой пары нормально, но как только подключаю одновременно вторую и более пар, все показания показывают непонятно что.

Например:

Подключаю одну пару ЛАН кабеля на 34 метра к одному из входов измерителя, измерение показывает 1500 пф, но когда подключаю одновременно вторую пару ко второму входу измерителя, показания падают до 40-50 пф на обоих входах... С четырьмя одновременно подключенными парами происходит тоже самое, на всех 4 каналах показания в 40-50 пф.

---------------------------

Измеряемые емкости подключаются:

1канал: A3 - D6

2канал: A1 - D8

3канал: A2 - D7

4канал: A0 - D9

-----------------------------

Скетч:

#include <SPI.h>
#include <Adafruit_GFX.h>      // include adafruit graphics library
#include <Adafruit_PCD8544.h>
 
// Software SPI (slower updates, more flexible pin options):
// pin 7 - Serial clock out (SCLK)
// pin 6 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
//Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
 
// Hardware SPI (faster, but must use certain hardware pins):
// SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
// MOSI is LCD DIN - this is pin 11 on an Arduino Uno
// pin 5 - Data/Command select (D/C)
// pin 4 - LCD chip select (CS)
// pin 3 - LCD reset (RST)
Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);
 
// ADC reference voltage / calibration value
#define V_REF    5.045 
 
const int IN_PIN = A3;
const int OUT_PIN = 6;
 
const int IN_PIN2 = A1;
const int OUT_PIN2 = 8;
 
const int IN_PIN3 = A2;
const int OUT_PIN3 = 7;
 
const int IN_PIN4 = A0;
const int OUT_PIN4 = 9;
 
const float IN_CAP_TO_GND  = 70.00;
const float R_PULLUP = 34.80;
const int MAX_ADC_VALUE = 1023;
 
void setup() {
  display.clearDisplay();              // Очищаем дисплей.
  display.begin();               // Инициализируем дисплея.
  display.display();
 
  pinMode(IN_PIN, OUTPUT);
  pinMode(OUT_PIN, OUTPUT);
 
  pinMode(IN_PIN2, OUTPUT);
  pinMode(OUT_PIN2, OUTPUT);
 
  pinMode(IN_PIN3, OUTPUT);
  pinMode(OUT_PIN3, OUTPUT);
 
  pinMode(IN_PIN4, OUTPUT);
  pinMode(OUT_PIN4, OUTPUT);
}
///////////////////////////////////КОНЕЦ(VOID SETUP)////////////////////////////
 
 
//-----------------------------НАЧАЛО(1СТР. ИЗМЕРЕНИЕ ЕМКОСТИ)--------------------------//
  void loop() 
  {
    display.setCursor(5, 0);
    display.print("TyT:");
    display.setCursor(5, 8);
    display.print("TaM:");
    display.setCursor(28, 0);
    display.print("1");
    display.setCursor(35, 0);
    display.print("2");
    display.setCursor(42, 0);
    display.print("3");
    display.setCursor(49, 0);
    display.print("4");
    display.setCursor(56, 0);
    display.print("5");
    display.setCursor(63, 0);
    display.print("6");
    display.setCursor(70, 0);
    display.print("7");
    display.setCursor(77, 0);
    display.print("8");
 
    display.setCursor(0, 16);
    display.print("(1-2)=");
    display.setCursor(0, 24);
    display.print("(3-6)=");
    display.setCursor(0, 32);
    display.print("(4-5)=");
    display.setCursor(0, 40);
    display.print("(7-8)=");
 
  /////////////////////////////////1 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ///////////////////////////////
  pinMode(IN_PIN, INPUT);
  digitalWrite(OUT_PIN, HIGH);
  int val = analogRead(IN_PIN);
  digitalWrite(OUT_PIN, LOW);
 
if (val < 1000)
  {
    pinMode(IN_PIN, OUTPUT);
 
    float capacitance = (float)val * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val);
 
    display.setCursor(36, 16);
    display.print(capacitance, 0);
    display.setCursor(72, 16);
    display.print("pF");
 
    if (capacitance < 45) {
      display.setCursor(28, 8);
      display.print("-");
      display.setCursor(35, 8);
      display.print("-");
    }
 
    else if (capacitance > 45) {
      display.setCursor(28, 8);
      display.print("|");
      display.setCursor(35, 8);
      display.print("|");
    }
    
  }
  else
  {
    pinMode(IN_PIN, OUTPUT);
    pinMode(OUT_PIN, INPUT_PULLUP);
    unsigned long u1 = micros();
    unsigned long t;
    int digVal;
 
    do
    {
      digVal = digitalRead(OUT_PIN);
      unsigned long u2 = micros();
      t = u2 > u1 ? u2 - u1 : u1 - u2;
    }
 
    while ((digVal < 1) && (t < 40000L));
 
    pinMode(OUT_PIN, INPUT);
    val = analogRead(OUT_PIN);
    digitalWrite(IN_PIN, HIGH);
 
    int dischargeTime = (int)(t / 1000L) * 5;
    delay(dischargeTime);
    pinMode(OUT_PIN, OUTPUT);
    digitalWrite(OUT_PIN, LOW);
    digitalWrite(IN_PIN, LOW);
 
    float capacitance = +(float)t / R_PULLUP / log(2.84 - (float)val / (float)MAX_ADC_VALUE);
 
    if (capacitance > 10.0)
    {
      display.setCursor(36, 16);
      display.print("switch");
      display.setCursor(28, 8);
      display.print("1");
      display.setCursor(35, 8);
      display.print("2");
    }
    else
    {
      display.setCursor(36, 16);
      display.print(capacitance, 0);
      display.setCursor(72, 16);
      display.print("nF");
      display.setCursor(28, 8);
      display.print("|");
      display.setCursor(35, 8);
      display.print("|");
    }
  }
  ///////////////////////////////2 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ////////////////////////////
  pinMode(IN_PIN2, INPUT);
  digitalWrite(OUT_PIN2, HIGH);
  int val2 = analogRead(IN_PIN2);
  digitalWrite(OUT_PIN2, LOW);
 
  if (val2 < 1000)
  {
    pinMode(IN_PIN2, OUTPUT);
 
    float capacitance2 = (float)val2 * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val2);
 
    display.setCursor(36, 24);
    display.print(capacitance2, 0);
    display.setCursor(72, 24);
    display.print("pF");
 
    if (capacitance2 < 45) {
      display.setCursor(42, 8);
      display.print("-");
      display.setCursor(63, 8);
      display.print("-");
    }
 
      else if (capacitance2 > 45) {
      display.setCursor(42, 8);
      display.print("|");
      display.setCursor(63, 8);
      display.print("|");
    }
    
  }
  else
  {
    pinMode(IN_PIN2, OUTPUT);
    pinMode(OUT_PIN2, INPUT_PULLUP);
    unsigned long u3 = micros();
    unsigned long t2;
    int digVal2;
 
    do
    {
      digVal2 = digitalRead(OUT_PIN2);
      unsigned long u4 = micros();
      t2 = u4 > u3 ? u4 - u3 : u3 - u4;
    }
 
    while ((digVal2 < 1) && (t2 < 40000L));
 
    pinMode(OUT_PIN2, INPUT);
    val2 = analogRead(OUT_PIN2);
    digitalWrite(IN_PIN2, HIGH);
 
    int dischargeTime2 = (int)(t2 / 1000L) * 5;
    delay(dischargeTime2);
    pinMode(OUT_PIN2, OUTPUT);
    digitalWrite(OUT_PIN2, LOW);
    digitalWrite(IN_PIN2, LOW);
 
    float capacitance2 = +(float)t2 / R_PULLUP / log(1.90 - (float)val2 / (float)MAX_ADC_VALUE);
 
    if (capacitance2 > 10.0)
    {
      display.setCursor(36, 24);
      display.print("switch");
      display.setCursor(42, 8);
      display.print("3");
      display.setCursor(63, 8);
      display.print("6");
    }
    else
    {
      display.setCursor(36, 24);
      display.print(capacitance2, 0);
      display.setCursor(72, 24);
      display.print("nF");
      display.setCursor(42, 8);
      display.print("|");
      display.setCursor(63, 8);
      display.print("|");
    }
  }
  ////////////////////////////////3 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ///////////////////////////////
  pinMode(IN_PIN3, INPUT);
  digitalWrite(OUT_PIN3, HIGH);
  int val3 = analogRead(IN_PIN3);
  digitalWrite(OUT_PIN3, LOW);
 
  if (val3 < 1000)
  {
    pinMode(IN_PIN3, OUTPUT);
 
    float capacitance3 = (float)val3 * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val3);
 
    display.setCursor(36, 32);
    display.print(capacitance3, 0);
    display.setCursor(72, 32);
    display.print("pF");
    
    if (capacitance3 < 45) {
      display.setCursor(49, 8);
      display.print("-");
      display.setCursor(56, 8);
      display.print("-");
    }
 
      else if (capacitance3 > 45) {
      display.setCursor(49, 8);
      display.print("|");
      display.setCursor(56, 8);
      display.print("|");
    }
  }
  else
  {
    pinMode(IN_PIN3, OUTPUT);
    pinMode(OUT_PIN3, INPUT_PULLUP);
    unsigned long u5 = micros();
    unsigned long t3;
    int digVal3;
 
    do
    {
      digVal3 = digitalRead(OUT_PIN3);
      unsigned long u6 = micros();
      t3 = u6 > u5 ? u6 - u5 : u5 - u6;
    }
 
    while ((digVal3 < 1) && (t3 < 40000L));
 
    pinMode(OUT_PIN3, INPUT);
    val3 = analogRead(OUT_PIN3);
    digitalWrite(IN_PIN3, HIGH);
 
    int dischargeTime3 = (int)(t3 / 1000L) * 5;
    delay(dischargeTime3);
    pinMode(OUT_PIN3, OUTPUT);
    digitalWrite(OUT_PIN3, LOW);
    digitalWrite(IN_PIN3, LOW);
 
    float capacitance3 = +(float)t3 / R_PULLUP / log(2.90 - (float)val3 / (float)MAX_ADC_VALUE);
 
    if (capacitance3 > 10.0)
    {
      display.setCursor(36, 32);
      display.print("switch");
      display.setCursor(49, 8);
      display.print("4");
      display.setCursor(56, 8);
      display.print("5");
    }
    else
    {
      display.setCursor(36, 32);
      display.print(capacitance3, 0);
      display.setCursor(72, 32);
      display.print("nF");
      display.setCursor(49, 8);
      display.print("|");
      display.setCursor(56, 8);
      display.print("|");
    }
  }
  //////////////////////////////4 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ////////////////////////////////
  pinMode(IN_PIN4, INPUT);
  digitalWrite(OUT_PIN4, HIGH);
  int val4 = analogRead(IN_PIN4);
  digitalWrite(OUT_PIN4, LOW);
 
  if (val4 < 1000)
  {
    pinMode(IN_PIN4, OUTPUT);
 
    float capacitance4 = (float)val4 * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val4);
 
    display.setCursor(36, 40);
    display.print(capacitance4, 0);
    display.setCursor(72, 40);
    display.print("pF");
    
    if (capacitance4 < 45) {
      display.setCursor(70, 8);
      display.print("-");
      display.setCursor(77, 8);
      display.print("-");
    }
 
      else if (capacitance4 > 45) {
      display.setCursor(70, 8);
      display.print("|");
      display.setCursor(77, 8);
      display.print("|");
    }
    
  }
  else
  {
    pinMode(IN_PIN4, OUTPUT);
    pinMode(OUT_PIN4, INPUT_PULLUP);
    unsigned long u7 = micros();
    unsigned long t4;
    int digVal4;
 
    do
    {
      digVal4 = digitalRead(OUT_PIN4);
      unsigned long u8 = micros();
      t4 = u8 > u7 ? u8 - u7 : u7 - u8;
    }
 
    while ((digVal4 < 1) && (t4 < 40000L));
 
    pinMode(OUT_PIN4, INPUT);
    val4 = analogRead(OUT_PIN4);
    digitalWrite(IN_PIN4, HIGH);
 
    int dischargeTime4 = (int)(t4 / 1000L) * 5;
    delay(dischargeTime4);
    pinMode(OUT_PIN4, OUTPUT);
    digitalWrite(OUT_PIN4, LOW);
    digitalWrite(IN_PIN4, LOW);
 
    float capacitance4 = +(float)t4 / R_PULLUP / log(1.97 - (float)val4 / (float)MAX_ADC_VALUE);
 
    if (capacitance4 > 10.0)
    {
      display.setCursor(36, 40);
      display.print("switch");
      display.setCursor(70, 8);
      display.print("7");
      display.setCursor(77, 8);
      display.print("8");
    }
    else
    {
      display.setCursor(36, 40);
      display.print(capacitance4, 0);
      display.setCursor(72, 40);
      display.print("nF");
      display.setCursor(70, 8);
      display.print("|");
      display.setCursor(77, 8);
      display.print("|");
    }
  }
 
    display.display();
    display.clearDisplay();
 
  }
  /////////////////////////////////////КОНЕЦ(1СТР. ИЗМЕРЕНИЕ ЕМКОСТИ)///////////////////////////////
Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Я так понимаю, что все 4 канала постоянно включены и работают, поэтому и получается такая шляпа с наложениями межвходной емкости, от этого происходит типа компенсации одной емкости и второй и они вычитаются, а показывается разница этих емкостей, как-то так...

Надо каким-то образом сделать, чтобы после измерения 1 канала, он отключался и включался 2 канал, и т.д.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ну так это неудивительно "абрам исакович" !!! как оно может работать если ты даже код по правилам форума вставить не можешь...

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022
001#include <SPI.h>
002#include <Adafruit_GFX.h>      // include adafruit graphics library
003#include <Adafruit_PCD8544.h>
004  
005// Software SPI (slower updates, more flexible pin options):
006// pin 7 - Serial clock out (SCLK)
007// pin 6 - Serial data out (DIN)
008// pin 5 - Data/Command select (D/C)
009// pin 4 - LCD chip select (CS)
010// pin 3 - LCD reset (RST)
011//Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
012  
013// Hardware SPI (faster, but must use certain hardware pins):
014// SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
015// MOSI is LCD DIN - this is pin 11 on an Arduino Uno
016// pin 5 - Data/Command select (D/C)
017// pin 4 - LCD chip select (CS)
018// pin 3 - LCD reset (RST)
019Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);
020  
021// ADC reference voltage / calibration value
022#define V_REF    5.045
023  
024const int IN_PIN = A3;
025const int OUT_PIN = 6;
026  
027const int IN_PIN2 = A1;
028const int OUT_PIN2 = 8;
029  
030const int IN_PIN3 = A2;
031const int OUT_PIN3 = 7;
032  
033const int IN_PIN4 = A0;
034const int OUT_PIN4 = 9;
035  
036const float IN_CAP_TO_GND  = 70.00;
037const float R_PULLUP = 34.80;
038const int MAX_ADC_VALUE = 1023;
039  
040void setup() {
041  display.clearDisplay();              // Очищаем дисплей.
042  display.begin();               // Инициализируем дисплея.
043  display.display();
044  
045  pinMode(IN_PIN, OUTPUT);
046  pinMode(OUT_PIN, OUTPUT);
047  
048  pinMode(IN_PIN2, OUTPUT);
049  pinMode(OUT_PIN2, OUTPUT);
050  
051  pinMode(IN_PIN3, OUTPUT);
052  pinMode(OUT_PIN3, OUTPUT);
053  
054  pinMode(IN_PIN4, OUTPUT);
055  pinMode(OUT_PIN4, OUTPUT);
056}
057///////////////////////////////////КОНЕЦ(VOID SETUP)////////////////////////////
058  
059  
060//-----------------------------НАЧАЛО(1СТР. ИЗМЕРЕНИЕ ЕМКОСТИ)--------------------------//
061  void loop()
062  {
063    display.setCursor(5, 0);
064    display.print("TyT:");
065    display.setCursor(5, 8);
066    display.print("TaM:");
067    display.setCursor(28, 0);
068    display.print("1");
069    display.setCursor(35, 0);
070    display.print("2");
071    display.setCursor(42, 0);
072    display.print("3");
073    display.setCursor(49, 0);
074    display.print("4");
075    display.setCursor(56, 0);
076    display.print("5");
077    display.setCursor(63, 0);
078    display.print("6");
079    display.setCursor(70, 0);
080    display.print("7");
081    display.setCursor(77, 0);
082    display.print("8");
083  
084    display.setCursor(0, 16);
085    display.print("(1-2)=");
086    display.setCursor(0, 24);
087    display.print("(3-6)=");
088    display.setCursor(0, 32);
089    display.print("(4-5)=");
090    display.setCursor(0, 40);
091    display.print("(7-8)=");
092  
093  /////////////////////////////////1 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ///////////////////////////////
094  pinMode(IN_PIN, INPUT);
095  digitalWrite(OUT_PIN, HIGH);
096  int val = analogRead(IN_PIN);
097  digitalWrite(OUT_PIN, LOW);
098  
099if (val < 1000)
100  {
101    pinMode(IN_PIN, OUTPUT);
102  
103    float capacitance = (float)val * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val);
104  
105    display.setCursor(36, 16);
106    display.print(capacitance, 0);
107    display.setCursor(72, 16);
108    display.print("pF");
109  
110    if (capacitance < 45) {
111      display.setCursor(28, 8);
112      display.print("-");
113      display.setCursor(35, 8);
114      display.print("-");
115    }
116  
117    else if (capacitance > 45) {
118      display.setCursor(28, 8);
119      display.print("|");
120      display.setCursor(35, 8);
121      display.print("|");
122    }
123     
124  }
125  else
126  {
127    pinMode(IN_PIN, OUTPUT);
128    pinMode(OUT_PIN, INPUT_PULLUP);
129    unsigned long u1 = micros();
130    unsigned long t;
131    int digVal;
132  
133    do
134    {
135      digVal = digitalRead(OUT_PIN);
136      unsigned long u2 = micros();
137      t = u2 > u1 ? u2 - u1 : u1 - u2;
138    }
139  
140    while ((digVal < 1) && (t < 40000L));
141  
142    pinMode(OUT_PIN, INPUT);
143    val = analogRead(OUT_PIN);
144    digitalWrite(IN_PIN, HIGH);
145  
146    int dischargeTime = (int)(t / 1000L) * 5;
147    delay(dischargeTime);
148    pinMode(OUT_PIN, OUTPUT);
149    digitalWrite(OUT_PIN, LOW);
150    digitalWrite(IN_PIN, LOW);
151  
152    float capacitance = +(float)t / R_PULLUP / log(2.84 - (float)val / (float)MAX_ADC_VALUE);
153  
154    if (capacitance > 10.0)
155    {
156      display.setCursor(36, 16);
157      display.print("switch");
158      display.setCursor(28, 8);
159      display.print("1");
160      display.setCursor(35, 8);
161      display.print("2");
162    }
163    else
164    {
165      display.setCursor(36, 16);
166      display.print(capacitance, 0);
167      display.setCursor(72, 16);
168      display.print("nF");
169      display.setCursor(28, 8);
170      display.print("|");
171      display.setCursor(35, 8);
172      display.print("|");
173    }
174  }
175  ///////////////////////////////2 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ////////////////////////////
176  pinMode(IN_PIN2, INPUT);
177  digitalWrite(OUT_PIN2, HIGH);
178  int val2 = analogRead(IN_PIN2);
179  digitalWrite(OUT_PIN2, LOW);
180  
181  if (val2 < 1000)
182  {
183    pinMode(IN_PIN2, OUTPUT);
184  
185    float capacitance2 = (float)val2 * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val2);
186  
187    display.setCursor(36, 24);
188    display.print(capacitance2, 0);
189    display.setCursor(72, 24);
190    display.print("pF");
191  
192    if (capacitance2 < 45) {
193      display.setCursor(42, 8);
194      display.print("-");
195      display.setCursor(63, 8);
196      display.print("-");
197    }
198  
199      else if (capacitance2 > 45) {
200      display.setCursor(42, 8);
201      display.print("|");
202      display.setCursor(63, 8);
203      display.print("|");
204    }
205     
206  }
207  else
208  {
209    pinMode(IN_PIN2, OUTPUT);
210    pinMode(OUT_PIN2, INPUT_PULLUP);
211    unsigned long u3 = micros();
212    unsigned long t2;
213    int digVal2;
214  
215    do
216    {
217      digVal2 = digitalRead(OUT_PIN2);
218      unsigned long u4 = micros();
219      t2 = u4 > u3 ? u4 - u3 : u3 - u4;
220    }
221  
222    while ((digVal2 < 1) && (t2 < 40000L));
223  
224    pinMode(OUT_PIN2, INPUT);
225    val2 = analogRead(OUT_PIN2);
226    digitalWrite(IN_PIN2, HIGH);
227  
228    int dischargeTime2 = (int)(t2 / 1000L) * 5;
229    delay(dischargeTime2);
230    pinMode(OUT_PIN2, OUTPUT);
231    digitalWrite(OUT_PIN2, LOW);
232    digitalWrite(IN_PIN2, LOW);
233  
234    float capacitance2 = +(float)t2 / R_PULLUP / log(1.90 - (float)val2 / (float)MAX_ADC_VALUE);
235  
236    if (capacitance2 > 10.0)
237    {
238      display.setCursor(36, 24);
239      display.print("switch");
240      display.setCursor(42, 8);
241      display.print("3");
242      display.setCursor(63, 8);
243      display.print("6");
244    }
245    else
246    {
247      display.setCursor(36, 24);
248      display.print(capacitance2, 0);
249      display.setCursor(72, 24);
250      display.print("nF");
251      display.setCursor(42, 8);
252      display.print("|");
253      display.setCursor(63, 8);
254      display.print("|");
255    }
256  }
257  ////////////////////////////////3 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ///////////////////////////////
258  pinMode(IN_PIN3, INPUT);
259  digitalWrite(OUT_PIN3, HIGH);
260  int val3 = analogRead(IN_PIN3);
261  digitalWrite(OUT_PIN3, LOW);
262  
263  if (val3 < 1000)
264  {
265    pinMode(IN_PIN3, OUTPUT);
266  
267    float capacitance3 = (float)val3 * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val3);
268  
269    display.setCursor(36, 32);
270    display.print(capacitance3, 0);
271    display.setCursor(72, 32);
272    display.print("pF");
273     
274    if (capacitance3 < 45) {
275      display.setCursor(49, 8);
276      display.print("-");
277      display.setCursor(56, 8);
278      display.print("-");
279    }
280  
281      else if (capacitance3 > 45) {
282      display.setCursor(49, 8);
283      display.print("|");
284      display.setCursor(56, 8);
285      display.print("|");
286    }
287  }
288  else
289  {
290    pinMode(IN_PIN3, OUTPUT);
291    pinMode(OUT_PIN3, INPUT_PULLUP);
292    unsigned long u5 = micros();
293    unsigned long t3;
294    int digVal3;
295  
296    do
297    {
298      digVal3 = digitalRead(OUT_PIN3);
299      unsigned long u6 = micros();
300      t3 = u6 > u5 ? u6 - u5 : u5 - u6;
301    }
302  
303    while ((digVal3 < 1) && (t3 < 40000L));
304  
305    pinMode(OUT_PIN3, INPUT);
306    val3 = analogRead(OUT_PIN3);
307    digitalWrite(IN_PIN3, HIGH);
308  
309    int dischargeTime3 = (int)(t3 / 1000L) * 5;
310    delay(dischargeTime3);
311    pinMode(OUT_PIN3, OUTPUT);
312    digitalWrite(OUT_PIN3, LOW);
313    digitalWrite(IN_PIN3, LOW);
314  
315    float capacitance3 = +(float)t3 / R_PULLUP / log(2.90 - (float)val3 / (float)MAX_ADC_VALUE);
316  
317    if (capacitance3 > 10.0)
318    {
319      display.setCursor(36, 32);
320      display.print("switch");
321      display.setCursor(49, 8);
322      display.print("4");
323      display.setCursor(56, 8);
324      display.print("5");
325    }
326    else
327    {
328      display.setCursor(36, 32);
329      display.print(capacitance3, 0);
330      display.setCursor(72, 32);
331      display.print("nF");
332      display.setCursor(49, 8);
333      display.print("|");
334      display.setCursor(56, 8);
335      display.print("|");
336    }
337  }
338  //////////////////////////////4 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ////////////////////////////////
339  pinMode(IN_PIN4, INPUT);
340  digitalWrite(OUT_PIN4, HIGH);
341  int val4 = analogRead(IN_PIN4);
342  digitalWrite(OUT_PIN4, LOW);
343  
344  if (val4 < 1000)
345  {
346    pinMode(IN_PIN4, OUTPUT);
347  
348    float capacitance4 = (float)val4 * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE - val4);
349  
350    display.setCursor(36, 40);
351    display.print(capacitance4, 0);
352    display.setCursor(72, 40);
353    display.print("pF");
354     
355    if (capacitance4 < 45) {
356      display.setCursor(70, 8);
357      display.print("-");
358      display.setCursor(77, 8);
359      display.print("-");
360    }
361  
362      else if (capacitance4 > 45) {
363      display.setCursor(70, 8);
364      display.print("|");
365      display.setCursor(77, 8);
366      display.print("|");
367    }
368     
369  }
370  else
371  {
372    pinMode(IN_PIN4, OUTPUT);
373    pinMode(OUT_PIN4, INPUT_PULLUP);
374    unsigned long u7 = micros();
375    unsigned long t4;
376    int digVal4;
377  
378    do
379    {
380      digVal4 = digitalRead(OUT_PIN4);
381      unsigned long u8 = micros();
382      t4 = u8 > u7 ? u8 - u7 : u7 - u8;
383    }
384  
385    while ((digVal4 < 1) && (t4 < 40000L));
386  
387    pinMode(OUT_PIN4, INPUT);
388    val4 = analogRead(OUT_PIN4);
389    digitalWrite(IN_PIN4, HIGH);
390  
391    int dischargeTime4 = (int)(t4 / 1000L) * 5;
392    delay(dischargeTime4);
393    pinMode(OUT_PIN4, OUTPUT);
394    digitalWrite(OUT_PIN4, LOW);
395    digitalWrite(IN_PIN4, LOW);
396  
397    float capacitance4 = +(float)t4 / R_PULLUP / log(1.97 - (float)val4 / (float)MAX_ADC_VALUE);
398  
399    if (capacitance4 > 10.0)
400    {
401      display.setCursor(36, 40);
402      display.print("switch");
403      display.setCursor(70, 8);
404      display.print("7");
405      display.setCursor(77, 8);
406      display.print("8");
407    }
408    else
409    {
410      display.setCursor(36, 40);
411      display.print(capacitance4, 0);
412      display.setCursor(72, 40);
413      display.print("nF");
414      display.setCursor(70, 8);
415      display.print("|");
416      display.setCursor(77, 8);
417      display.print("|");
418    }
419  }
420  
421    display.display();
422    display.clearDisplay();
423  
424  }
425  /////////////////////////////////////КОНЕЦ(1СТР. ИЗМЕРЕНИЕ ЕМКОСТИ)///////////////////////////////
Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Так ? :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

первую часть одолел, можно переходить ко второй части, теоретической, а каковы будут наводки на не нагруженном стандартном куске кабеля в упаковке 305 метров к примеру, то-есть правильно ли выбран принцип измерения длины кабеля

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

ua6em пишет:

первую часть одолел, можно переходить ко второй части, теоретической, а каковы будут наводки на не нагруженном стандартном куске кабеля в упаковке 305 метров к примеру, то-есть правильно ли выбран принцип измерения длины кабеля

Ну смотрите, у меня есть максимум 34 метра витой пары на руках, наводки вроде как не мешают измерению. Кстати вот полная схема:

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

ua6em пишет:

первую часть одолел, можно переходить ко второй части, теоретической, а каковы будут наводки на не нагруженном стандартном куске кабеля в упаковке 305 метров к примеру, то-есть правильно ли выбран принцип измерения длины кабеля

Кстати в процессе экспериментов, были нестабильные показания и ввел резисторы по 1 Мом на 4 цифровых пина, вот схема измененная:

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ну во первых, если измерять ёмкость пары, достаточно остановиться на одной, к примеру зелёной, по ней и откалиброваться, все четыре пары имеют разный шаг повива, соответственно и разную длину 

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

ua6em пишет:

ну во первых, если измерять ёмкость пары, достаточно остановиться на одной, к примеру зелёной, по ней и откалиброваться, все четыре пары имеют разный шаг повива, соответственно и разную длину 

Нет, вы не поняли суть проблемы. Одна пара измеряется без проблем. Проблема как раз в том, что при подключении одновременно 2 и более пар, измерения снижаются десятки раз, вместо 1500 пф показывают каждый из входов по 40-50 пф

NikShel
Offline
Зарегистрирован: 21.01.2018

Я в середине 2000-х как-то измерял параметры линков LAN в одной организации. Тестер был взят на прокат, мерил кажется 10 параметров, включая длину каждой пары. Длина измерялась посылкой импульсов и подсчётом времени их прохождения.
В кабеле всегда есть паразитные ёмкости между парами, это тоже тестируемый параметр.
Хотел вставить фотку, не вижу как.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

наводки, это был мой изначальный посыл

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

ua6em пишет:

наводки, это был мой изначальный посыл

Для начала бы справится с этой проблемой, а потом, если понадобится буду что-то думать с наводками

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

тогда 4х-канальный осциллограф тебе в помощь... и как реплика, ёмкость ты заряжаешь, а чем разряжаешь перед измерением?

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

ua6em пишет:

тогда 4х-канальный осциллограф тебе в помощь... и как реплика, ёмкость ты заряжаешь, а чем разряжаешь перед измерением?

Все, заработало как надо!

Полностью рабочий скетч и схема для самостоятельной сборки:

001#include <SPI.h>
002#include <Adafruit_GFX.h>      // include adafruit graphics library
003#include <Adafruit_PCD8544.h>
004 
005// Hardware SPI (faster, but must use certain hardware pins):
006// SCK is LCD serial clock (SCLK) - this is pin 13 on Arduino Uno
007// MOSI is LCD DIN - this is pin 11 on an Arduino Uno
008// pin 5 - Data/Command select (D/C)
009// pin 4 - LCD chip select (CS)
010// pin 3 - LCD reset (RST)
011Adafruit_PCD8544 display = Adafruit_PCD8544(5, 4, 3);
012 
013const int IN_PIN = A3;
014const int OUT_PIN = 6;
015const int IN_PIN2 = A1;
016const int OUT_PIN2 = 8;
017const int IN_PIN3 = A2;
018const int OUT_PIN3 = 7;
019const int IN_PIN4 = A0;
020const int OUT_PIN4 = 9;
021 
022const float IN_CAP_TO_GND1  =  70.00;
023const float IN_CAP_TO_GND2  =  71.00;
024const float IN_CAP_TO_GND3  =  68.00;
025const float IN_CAP_TO_GND4  =  70.00;
026 
027const float R_PULLUP = 34.80;
028const int MAX_ADC_VALUE = 1023;
029 
030void setup() {
031  display.clearDisplay();              // Очищаем дисплей.
032  display.begin();               // Инициализируем дисплея.
033  display.display();
034  //display.setContrast(50);             // Задаем контрастность дисплея.
035  display.setRotation(0);              // Переворачиваем дисплей.
036  display.invertDisplay(0);            // Инвертируем дисплей.
037  //display.setTextSize(1);            // Задаем размер текста дисплея.
038  //display.setTextColor(BLACK,WHITE);       // Задаем цвет шрифта дисплея.
039}
040//////////////////////////////КОНЕЦ(VOID SETUP)//////////////////////////////////
041 
042//--------------------------------НАЧАЛО(VOID LOOP)-------------------------------//
043void loop() {
044  display.setCursor(5, 0);
045  display.print("TyT:");
046  display.setCursor(5, 8);
047  display.print("TaM:");
048  display.setCursor(28, 0);
049  display.print("1");
050  display.setCursor(35, 0);
051  display.print("2");
052  display.setCursor(42, 0);
053  display.print("3");
054  display.setCursor(49, 0);
055  display.print("4");
056  display.setCursor(56, 0);
057  display.print("5");
058  display.setCursor(63, 0);
059  display.print("6");
060  display.setCursor(70, 0);
061  display.print("7");
062  display.setCursor(77, 0);
063  display.print("8");
064 
065  display.setCursor(0, 16);
066  display.print("(1-2)=");
067  display.setCursor(0, 24);
068  display.print("(3-6)=");
069  display.setCursor(0, 32);
070  display.print("(4-5)=");
071  display.setCursor(0, 40);
072  display.print("(7-8)=");
073 
074 
075  //----------------------------НАЧАЛО(1СТР. ИЗМЕРЕНИЕ ЕМКОСТИ)--------------------------//
076 
077  /////////////////////////////1 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ/////////////////////////
078  pinMode(IN_PIN, INPUT);
079  digitalWrite(OUT_PIN, HIGH);
080  int val = analogRead(IN_PIN);
081  digitalWrite(OUT_PIN, LOW);
082 
083  if (val < 970)
084  {
085    pinMode(IN_PIN, OUTPUT);
086 
087    float capacitance = (float)val * IN_CAP_TO_GND1 / (float)(MAX_ADC_VALUE - val);
088    delay (50);
089    display.setCursor(36, 16);
090    display.print(capacitance / 90, 0);
091    display.setCursor(65, 16);
092    display.print("M*C");
093 
094    if (capacitance < 100) {
095      display.setCursor(28, 8);
096      display.print("-");
097      display.setCursor(35, 8);
098      display.print("-");
099    }
100 
101    else if (capacitance > 100) {
102      display.setCursor(28, 8);
103      display.print("|");
104      display.setCursor(35, 8);
105      display.print("|");
106    }
107  }
108  else
109  {
110    pinMode(IN_PIN, OUTPUT);
111 
112    pinMode(OUT_PIN, INPUT_PULLUP);
113    unsigned long u1 = micros();
114    unsigned long t;
115    int digVal;
116 
117    do
118    {
119      digVal = digitalRead(OUT_PIN);
120      unsigned long u2 = micros();
121      t = u2 > u1 ? u2 - u1 : u1 - u2;
122    }
123 
124    while ((digVal < 1) && (t < 400000L));
125 
126    pinMode(OUT_PIN, INPUT);
127    val = analogRead(OUT_PIN);
128    digitalWrite(IN_PIN, HIGH);
129    int dischargeTime = (int)(t / 10L) * 5;
130    delay(dischargeTime);
131    pinMode(OUT_PIN, OUTPUT);
132    digitalWrite(OUT_PIN, LOW);
133    digitalWrite(IN_PIN, LOW);
134 
135    float capacitance = +(float)t / R_PULLUP / log(2.94  - (float)val / (float)MAX_ADC_VALUE);
136 
137      display.setCursor(36, 16);
138      display.print(capacitance / 0.041, 0);
139      display.setCursor(65, 16);
140      display.print("M*C");
141      display.setCursor(28, 8);
142      display.print("|");
143      display.setCursor(35, 8);
144      display.print("|");
145  }
146  pinMode(IN_PIN, INPUT);
147  pinMode(OUT_PIN, INPUT);
148   
149  /////////////////////////////2 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ/////////////////////////////
150  pinMode(IN_PIN2, INPUT);
151  digitalWrite(OUT_PIN2, HIGH);
152  int val2 = analogRead(IN_PIN2);
153  digitalWrite(OUT_PIN2, LOW);
154 
155  if (val2 < 970)
156  {
157    pinMode(IN_PIN2, OUTPUT);
158 
159    float capacitance2 = (float)val2 * IN_CAP_TO_GND2 / (float)(MAX_ADC_VALUE - val2);
160    delay (50);
161    display.setCursor(36, 24);
162    display.print(capacitance2 / 90, 0);
163    display.setCursor(65, 24);
164    display.print("M*C");
165 
166    if (capacitance2 < 100) {
167      display.setCursor(42, 8);
168      display.print("-");
169      display.setCursor(63, 8);
170      display.print("-");
171    }
172 
173    else if (capacitance2 > 100) {
174      display.setCursor(42, 8);
175      display.print("|");
176      display.setCursor(63, 8);
177      display.print("|");
178    }
179  }
180  else
181  {
182    pinMode(IN_PIN2, OUTPUT);
183 
184    pinMode(OUT_PIN2, INPUT_PULLUP);
185    unsigned long u3 = micros();
186    unsigned long t2;
187    int digVal2;
188 
189    do
190    {
191      digVal2 = digitalRead(OUT_PIN2);
192      unsigned long u4 = micros();
193      t2 = u4 > u3 ? u4 - u3 : u3 - u4;
194    }
195 
196    while ((digVal2 < 1) && (t2 < 400000L));
197 
198    pinMode(OUT_PIN2, INPUT);
199    val2 = analogRead(OUT_PIN2);
200    digitalWrite(IN_PIN2, HIGH);
201 
202    int dischargeTime2 = (int)(t2 / 10L) * 5;
203    delay(dischargeTime2);
204 
205    pinMode(OUT_PIN2, OUTPUT);
206    digitalWrite(OUT_PIN2, LOW);
207    digitalWrite(IN_PIN2, LOW);
208 
209    float capacitance2 = +(float)t2 / R_PULLUP / log(2.22 - (float)val2 / (float)MAX_ADC_VALUE);
210 
211      display.setCursor(36, 24);
212      display.print(capacitance2 / 0.041, 0);
213      display.setCursor(65, 24);
214      display.print("M*C");
215      display.setCursor(42, 8);
216      display.print("|");
217      display.setCursor(63, 8);
218      display.print("|");
219  }
220  pinMode(IN_PIN2, INPUT);
221  pinMode(OUT_PIN2, INPUT);
222   
223  //////////////////////////////3 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ//////////////////////////////
224  pinMode(IN_PIN3, INPUT);
225  digitalWrite(OUT_PIN3, HIGH);
226  int val3 = analogRead(IN_PIN3);
227  digitalWrite(OUT_PIN3, LOW);
228 
229  if (val3 < 970)
230  {
231    pinMode(IN_PIN3, OUTPUT);
232 
233    float capacitance3 = (float)val3 * IN_CAP_TO_GND3 / (float)(MAX_ADC_VALUE - val3);
234    delay (50);
235    display.setCursor(36, 32);
236    display.print(capacitance3 / 90, 0);
237    display.setCursor(65, 32);
238    display.print("M*C");
239 
240    if (capacitance3 < 100) {
241      display.setCursor(49, 8);
242      display.print("-");
243      display.setCursor(56, 8);
244      display.print("-");
245    }
246 
247    else if (capacitance3 > 100) {
248      display.setCursor(49, 8);
249      display.print("|");
250      display.setCursor(56, 8);
251      display.print("|");
252    }
253  }
254  else
255  {
256    pinMode(IN_PIN3, OUTPUT);
257 
258    pinMode(OUT_PIN3, INPUT_PULLUP);
259    unsigned long u5 = micros();
260    unsigned long t3;
261    int digVal3;
262 
263    do
264    {
265      digVal3 = digitalRead(OUT_PIN3);
266      unsigned long u6 = micros();
267      t3 = u6 > u5 ? u6 - u5 : u5 - u6;
268    }
269 
270    while ((digVal3 < 1) && (t3 < 400000L));
271 
272    pinMode(OUT_PIN3, INPUT);
273    val3 = analogRead(OUT_PIN3);
274    digitalWrite(IN_PIN3, HIGH);
275 
276    int dischargeTime3 = (int)(t3 / 10L) * 5;
277    delay(dischargeTime3);
278    pinMode(OUT_PIN3, OUTPUT);
279    digitalWrite(OUT_PIN3, LOW);
280    digitalWrite(IN_PIN3, LOW);
281 
282    float capacitance3 = +(float)t3 / R_PULLUP / log(2.93 - (float)val3 / (float)MAX_ADC_VALUE);
283 
284      display.setCursor(36, 32);
285      display.print(capacitance3 / 0.041, 0);
286      display.setCursor(65, 32);
287      display.print("M*C");
288      display.setCursor(49, 8);
289      display.print("|");
290      display.setCursor(56, 8);
291      display.print("|");
292  }
293  pinMode(IN_PIN3, INPUT);
294  pinMode(OUT_PIN3, INPUT);
295   
296  ////////////////////////////////4 КАНАЛ ВЫЧИСЛЕНИЯ И ЦИФРЫ///////////////////////////
297  pinMode(IN_PIN4, INPUT);
298  digitalWrite(OUT_PIN4, HIGH);
299  int val4 = analogRead(IN_PIN4);
300  digitalWrite(OUT_PIN4, LOW);
301 
302  if (val4 < 970)
303  {
304    pinMode(IN_PIN4, OUTPUT);
305 
306    float capacitance4 = (float)val4 * IN_CAP_TO_GND4 / (float)(MAX_ADC_VALUE - val4);
307    delay (50);
308    display.setCursor(36, 40);
309    display.print(capacitance4 / 90, 0);
310    display.setCursor(65, 40);
311    display.print("M*C");
312 
313    if (capacitance4 < 100) {
314      display.setCursor(70, 8);
315      display.print("-");
316      display.setCursor(77, 8);
317      display.print("-");
318    }
319 
320    else if (capacitance4 > 100) {
321      display.setCursor(70, 8);
322      display.print("|");
323      display.setCursor(77, 8);
324      display.print("|");
325    }
326 
327  }
328  else
329  {
330    pinMode(IN_PIN4, OUTPUT);
331 
332    pinMode(OUT_PIN4, INPUT_PULLUP);
333    unsigned long u7 = micros();
334    unsigned long t4;
335    int digVal4;
336 
337    do
338    {
339      digVal4 = digitalRead(OUT_PIN4);
340      unsigned long u8 = micros();
341      t4 = u8 > u7 ? u8 - u7 : u7 - u8;
342    }
343 
344    while ((digVal4 < 1) && (t4 < 400000L));
345 
346    pinMode(OUT_PIN4, INPUT);
347    val4 = analogRead(OUT_PIN4);
348    digitalWrite(IN_PIN4, HIGH);
349 
350    int dischargeTime4 = (int)(t4 / 10L) * 5;
351    delay(dischargeTime4);
352    pinMode(OUT_PIN4, OUTPUT);
353    digitalWrite(OUT_PIN4, LOW);
354    digitalWrite(IN_PIN4, LOW);
355 
356    float capacitance4 = +(float)t4 / R_PULLUP / log(2.23 - (float)val4 / (float)MAX_ADC_VALUE);
357 
358      display.setCursor(36, 40);
359      display.print(capacitance4 / 0.041, 0);
360      display.setCursor(65, 40);
361      display.print("M*C");
362      display.setCursor(70, 8);
363      display.print("|");
364      display.setCursor(77, 8);
365      display.print("|");
366  }
367  pinMode(IN_PIN4, INPUT);
368  pinMode(OUT_PIN4, INPUT);
369   
370  ////////////////////////////////КОНЕЦ(1СТР. ИЗМЕРЕНИЕ ЕМКОСТИ)////////////////////////////////
371 
372  display.display();
373  display.clearDisplay();
374}
375/////////////////////////////////КОНЕЦ(VOID LOOP)////////////////////////////////////

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

мой пинок помог )))

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Как говорится - С миру по нитке :))

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

1) Такую "простынку" надо прятать под "спойлер"

2) Чуть напильником пильнуть и со свистом в 168ю мегу влезет.

Вот так уже (даже с бутлоадером) влазит:

Скетч использует 14762 байт (93%) памяти устройства. Всего доступно 15872 байт.
Глобальные переменные используют 727 байт (70%) динамической памяти, оставляя 297 байт для локальных переменных. Максимум: 1024 байт.

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А если учесть, что 4 раза практически один и тот же код повторяется, то можно ещё сократить. Но не сильно. Библиотеки тяжёлые.

b707
Offline
Зарегистрирован: 26.05.2017

классика жанра...

Как написать код для 4х-канального измерителя емкости? - написать для 1-канального и потом скопировать 4 раза...

 

Gladiator - чтобы в следующий раз не выкладывать подобную х-ню вместо кода, почитайте что-нибудь про циклы и процедуры.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

Gladiator - чтобы в следующий раз

да, код написан в лоб, не умеет пока человек, но это исправимо )))

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

b707 пишет:

классика жанра...

Как написать код для 4х-канального измерителя емкости? - написать для 1-канального и потом скопировать 4 раза...

 

Gladiator - чтобы в следующий раз не выкладывать подобную х-ню вместо кода, почитайте что-нибудь про циклы и процедуры.

Я вообще не программист, и не знаю ни одного языка программирования, я электрощик :) Но очень интересно ковыряться с ардуиной и совмещать с электроникой, пробовать делать то, что необходимо. И мне кажется не важно, что я кучу кода написал может ненужного, зато работает :) Сейчас этот приборчик использую на работе, а работаю интернетчиком. 

И кстати, это только часть кода, которую я запихнул в ардуинку нано.  У меня скетч с меню на одной кнопке, где 7 подпрограмм:

1 - это 4 канальный измеритель длины витой пары по емкости . С индикацией по каждой паре, в случае подключенного кабеля к свитчу или роутеру.

2 - это 4 канальный измеритель длины витой пары по сопротивлению, с сигнализацией (пищалка) перекоса между парами на 1 Ом (можно настраивать). 

3 - это 4 канальный измеритель длины витой пары по сопротивлению, со звуковой сигнализацией (пищалка) целостности каждой пары с разными тонами.

4 - это 4 канальный измеритель длины витой пары по сопротивлению, с переводом в метраж.

5 - Двухканальный Тон генератор на 1 Кгц

6 - Двухканальный Тон генератор на 9 Кгц

7 - Двухканальный Тон генератор на 18 Кгц

Тональные генераторы для поиска нужного кабеля в пучке кабелей.

Сегодня кстати испытал Тональный генератор на 18Кгц и приборчик отлично справился с поиском нужного мне кабеля. Вместо приемника использовал смартфон с прогой Анализатор спектра и приблудой (на полевом транзисторе) втыкаемой в разьем для гарнитуры.

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

b707 пишет:

классика жанра...

Как написать код для 4х-канального измерителя емкости? - написать для 1-канального и потом скопировать 4 раза...

 

Gladiator - чтобы в следующий раз не выкладывать подобную х-ню вместо кода, почитайте что-нибудь про циклы и процедуры.

И на счет выкладывания... я бы и не выкладывал, но не мог справится с той проблемой, что описывал в самом начале. Поэтому и решил спросить у народа подсказку.

Ну ок, больше не буду ничего выкладывать :)) Буду для себя изобретать :)

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

BOOM пишет:

1) Такую "простынку" надо прятать под "спойлер"

2) Чуть напильником пильнуть и со свистом в 168ю мегу влезет.

Вот так уже (даже с бутлоадером) влазит:

Скетч использует 14762 байт (93%) памяти устройства. Всего доступно 15872 байт.
Глобальные переменные используют 727 байт (70%) динамической памяти, оставляя 297 байт для локальных переменных. Максимум: 1024 байт.

 

Не влезет :) У меня же не только измеритель длины кабеля по емкости, а приборчик 10 в 1. Я выше писал :) Хотя профи я думаю сможет всунуть и такой код в 168 атмегу :) У меня сейчас код занимает 23 840 байт

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

кстати тональный генератор с приёмником весьма хорошая вещь для монтажников, надысь пришлось из полсотни кабелей два десятка отбирать, генератора не было, обошлось разделкой всех кабелей на две патч-панели, с последующей переразделкой на рабочую, а был бы генератор кучу времени сэкономил бы

На Али имеется, надо будет заказать )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Можно покумекать, как засунуть/улучшить. Штука полезная, если действительно работает.
Напишите мне на wrk.sadman@gmail.com, если хотите - на выходных посмотрю, что сделать можно.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Gladiator пишет:

BOOM пишет:

1) Такую "простынку" надо прятать под "спойлер"

2) Чуть напильником пильнуть и со свистом в 168ю мегу влезет.

Вот так уже (даже с бутлоадером) влазит:

Скетч использует 14762 байт (93%) памяти устройства. Всего доступно 15872 байт.
Глобальные переменные используют 727 байт (70%) динамической памяти, оставляя 297 байт для локальных переменных. Максимум: 1024 байт.

 

Не влезет :) У меня же не только измеритель длины кабеля по емкости, а приборчик 10 в 1. Я выше писал :) Хотя профи я думаю сможет всунуть и такой код в 168 атмегу :) У меня сейчас код занимает 23 840 байт

Да я же даже не разбирался в коде, просто «пильнул чтобы влезло», садмана послушай (если интересно).

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

ua6em пишет:

кстати тональный генератор с приёмником весьма хорошая вещь для монтажников, надысь пришлось из полсотни кабелей два десятка отбирать, генератора не было, обошлось разделкой всех кабелей на две патч-панели, с последующей переразделкой на рабочую, а был бы генератор кучу времени сэкономил бы

На Али имеется, надо будет заказать )))

Вместо приемника использовал смартфон с прогой Анализатор спектра и приблудой (на полевом транзисторе) втыкаемой в разьем для гарнитуры.

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

sadman41 пишет:
Можно покумекать, как засунуть/улучшить. Штука полезная, если действительно работает. Напишите мне на wrk.sadman@gmail.com, если хотите - на выходных посмотрю, что сделать можно.

Что именно засунуть/улучшить ? :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Gladiator пишет:

sadman41 пишет:
Можно покумекать, как засунуть/улучшить. Штука полезная, если действительно работает. Напишите мне на wrk.sadman@gmail.com, если хотите - на выходных посмотрю, что сделать можно.

Что именно засунуть/улучшить ? :)

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

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Вот кстати я снял видео обзор моего приборчика со всеми функциями - https://www.youtube.com/watch?v=P69QBf6Dyfo

xfvlad
Offline
Зарегистрирован: 06.02.2021

Возможно делать измерения по одному входу как здесь https://vrtp.ru/index.php?s=0b11e4a95abe4123cc7f0b60b53c49da&showtopic=26444&st=0

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

xfvlad пишет:

Возможно делать измерения по одному входу как здесь https://vrtp.ru/index.php?s=0b11e4a95abe4123cc7f0b60b53c49da&showtopic=26444&st=0

Нет, один вход для измерения длины кабеля по емкости, также поиск обрыва.

Второй вход - для измерения длины кабеля по сопротивлению + звуковая сигнализация некачественного кабеля , окисленных контактов RJ45 и плохого обжима коннекторов.

Третий выход для поиска кабеля в пучке кабелей тон генератором и анализатором спектра на смартфоне.

xfvlad
Offline
Зарегистрирован: 06.02.2021

Возможно выложить вашу полную схему и скетч? Есть у вас защита по входах? Есть практика применения подобных устройств и бывали случаи что на линиях было напряжение больше 5В.

sadman41
Offline
Зарегистрирован: 19.10.2016

Passive POE может поджарить атмегу - это верно.

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

xfvlad пишет:

Возможно выложить вашу полную схему и скетч? Есть у вас защита по входах? Есть практика применения подобных устройств и бывали случаи что на линиях было напряжение больше 5В.

Приборчик пока ещё в процессе разработки и экспериментов, что-то добавляется, что-то убирается. Защиты по входу еще не ставил. Пока не было случаев, чтобы на линии связи было более 5 вольт. В основном пассивные, управляемые свитчи, роутеры, все без POE

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Gladiator пишет:

xfvlad пишет:

Возможно выложить вашу полную схему и скетч? Есть у вас защита по входах? Есть практика применения подобных устройств и бывали случаи что на линиях было напряжение больше 5В.

Приборчик пока ещё в процессе разработки и экспериментов, что-то добавляется, что-то убирается. Защиты по входу еще не ставил. Пока не было случаев, чтобы на линии связи было более 5 вольт. В основном пассивные, управляемые свитчи, роутеры, все без POE

Схемка пока такая:

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Можно увидеть схему детектора на полевом транзисторе резисторе и конденсаторе и кусок кода, который формирует для них сигнал ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Кусок кода - простой tone на определенных частотах.

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Komandir пишет:

Можно увидеть схему детектора на полевом транзисторе резисторе и конденсаторе и кусок кода, который формирует для них сигнал ?

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Komandir пишет:

Можно увидеть схему детектора на полевом транзисторе резисторе и конденсаторе и кусок кода, который формирует для них сигнал ?

01void str_5()
02{
03  display.setCursor(2, 1);
04  display.print("<- GENERATOR");
05  display.setCursor(15, 12);
06  display.print("13 KHZ(1-2)");
07 
08  tone(6, 13000);  // ТОН на пине 6 (13 кГц)
09}
10 
11void str_6()
12{
13  display.setCursor(2, 1);
14  display.print("<- GENERATOR");
15  display.setCursor(15, 12);
16  display.print("18 KHZ(3-6)");
17 
18  noTone(6);
19  tone(9, 18000);  // ТОН на пине 9 (18 кГц)
20}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
Maximroot1
Offline
Зарегистрирован: 21.07.2022

всем привет! накидал в редакторе плату и заказал ее изготовление в китае, вдохновившись успехом автора, но допустил ошибку в проектировании и не задействовал функционал кнопки. теперь у меня получилось хоть и функциональное (на что я надеюсь) устройство, но без кнопки. сейчас стал разбираться в рисунке схемы подключения автора оригинального поста и вижу, что пин D2 подтягивается резистором к земле, и дальше уходит пунктирная линия, но, я не понимаю куда. хотел бы попросить помощи: как можно подключить кнопку, чтобы не сильно вмешиваться в печатную плату, пусть даже навесным монтажом? еще очень было бы интересно посмотреть, как выглядит устройство у тех, кто его уже собрал

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

На +5 через кнопку. Контакты замкнуты на пине HIGH, разомкнуты - LOW...

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Maximroot1 пишет:

всем привет! накидал в редакторе плату и заказал ее изготовление в китае, вдохновившись успехом автора, но допустил ошибку в проектировании и не задействовал функционал кнопки. теперь у меня получилось хоть и функциональное (на что я надеюсь) устройство, но без кнопки. сейчас стал разбираться в рисунке схемы подключения автора оригинального поста и вижу, что пин D2 подтягивается резистором к земле, и дальше уходит пунктирная линия, но, я не понимаю куда. хотел бы попросить помощи: как можно подключить кнопку, чтобы не сильно вмешиваться в печатную плату, пусть даже навесным монтажом? еще очень было бы интересно посмотреть, как выглядит устройство у тех, кто его уже собрал

Пин D2 замыкается через кнопку на +5 вольт, тем самым осуществляется переключение подпунктов меню. 

Но вы рано плату заказали, ещё ведутся экспериментальные работы по модернизации прошивки и схемы измерителя. На данный момент ведутся работы по устранению межканального влияния витой пары (межпарная емкость) на корректность показаний.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

к такой плате просится цветной дисплейчик на st7735

Maximroot1
Offline
Зарегистрирован: 21.07.2022

Gladiator пишет:

Но вы рано плату заказали, ещё ведутся экспериментальные работы по модернизации прошивки и схемы измерителя.

ничего страшного, меня интересует только возможность поиска провода (режим генератора) и прозвонка розеток на предмет перепутанных пар

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

ua6em пишет:

к такой плате просится цветной дисплейчик на st7735

Я пробовал на st7735, но потребляемый ток намного больше и на солнце плохо видно, зато красиво )

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Maximroot1 пишет:

Gladiator пишет:

Но вы рано плату заказали, ещё ведутся экспериментальные работы по модернизации прошивки и схемы измерителя.

ничего страшного, меня интересует только возможность поиска провода (режим генератора) и прозвонка розеток на предмет перепутанных пар

Ну скажем так, поиск кабеля получится только в том случае, если с другой стороны кабель никуда не подключен, иначе через свитч этот сигнал будет наводится на все кабеля, которые вставлены в свитч или роутер.

Перепутанность пар этот приборчик не определит. Задумка была сделать приборчик только для измерения длины кабеля каждой пары по емкости и по сопротивлению. По емкости - для поиска обрыва кабеля. По сопротивлению - для определения качества обжима коннекторов и определения длины кабеля до свитча. 

Gladiator
Gladiator аватар
Offline
Зарегистрирован: 05.06.2022

Maximroot1 пишет:

Gladiator пишет:

Но вы рано плату заказали, ещё ведутся экспериментальные работы по модернизации прошивки и схемы измерителя.

ничего страшного, меня интересует только возможность поиска провода (режим генератора) и прозвонка розеток на предмет перепутанных пар

На предмет перепутанности пар можно использовать самый дешевый тестер на светодиодах.

Иван_
Offline
Зарегистрирован: 23.02.2018

Не совсем понял по схеме как подключать провод для измерения его емкости. Прошу пояснить.