Tuesday, June 20, 2023

DIY Arduino Uno Data Logger







Another great project that you can make with arduino is the datalogger. The basic design of a logger calls for a timer, a memory and converter that will translate analog signals from the sensor into a digital data. Today, all of these components are readily available and cheap too. So here are the things you need.

1. Arduino Uno microcontroller.
    

2. 16 x 2 LCD module.


3. DS1307 RTC module.

4. MicroSD Card module.



Start connecting the modules to the arduino by following the picture below. Take note that LCD module is not included in the wiring diagram.




DA1307 RTC module also uses the A4 and A5 pins of the Arduino for its SCL and SDA line. This leaves A0, A1, A2 and A3 as your remaining analog inputs. Never the less, it is still sufficient for this project.







Above is the picture of my completed datalogger. Sampling time is set every 5 minutes. The LCD displays the current time and data but during a short sampling period, it will display **** to tell the user that analog signals at A0, A1, A2 and A3 has been sampled and logged into the sd card successfully.

Below is the code I wrote for my arduino datalogger.

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <uRTCLib.h>
#include <LiquidCrystal.h>
#include <SPI.h>
#include <SD.h>

File myFile;
uRTCLib rtc;

const int rs = 9, en = 8, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);


void setup() {
delay (2000);

lcd.begin(16, 2);  //initialize LCD module.


if (!SD.begin(10))   //initialize SD module. Chipselect is 10
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("SD Init Failed");
  while(1);
}

lcd.print("SD Init Done");
delay(1000);


  #ifdef ARDUINO_ARCH_ESP8266
    URTCLIB_WIRE.begin(0, 2); // D3 and D4 on ESP8266
  #else
    URTCLIB_WIRE.begin();
  #endif


  rtc.set_rtc_address(0x68);

  // Only used once, then disabled
  //  rtc.set(0, 42, 16, 6, 2, 5, 15);
  //  RTCLib::set(byte second, byte minute, byte hour, byte dayOfWeek,
// byte dayOfMonth, byte month, byte year)

  //rtc.set(0, 19, 12, 6, 3, 6, 23);
 
}

void loop()

{
  rtc.refresh();
  lcd.clear();
 

  lcd.setCursor(0, 0);

 
 
  lcd.print(rtc.month());
  lcd.print('/');
  lcd.print(rtc.day());
  lcd.print('/');
  lcd.print(rtc.year());


  lcd.print(' ');
 

  lcd.print(rtc.hour());
  lcd.print(':');
  lcd.print(rtc.minute());
  lcd.print(':');
  lcd.print(rtc.second());
 
  lcd.setCursor(0, 1);
//  lcd.print("DOW: ");
//  lcd.print(rtc.dayOfWeek());

if  (rtc.dayOfWeek() == 1)
{lcd.print("Monday");}

if (rtc.dayOfWeek() == 2)
{lcd.print("Tuesday");}

if (rtc.dayOfWeek() == 3)
{lcd.print("Wednesday");}

if (rtc.dayOfWeek() == 4)
{lcd.print("Thursday");}

if (rtc.dayOfWeek() == 5)
{lcd.print("Friday");}

if (rtc.dayOfWeek() == 6)
{lcd.print("Saturday");}

else if (rtc.dayOfWeek() == 7)
{lcd.print("Sunday");}

  delay(1000);

  ////////////Code for data logger begins here....

  int x = (rtc.minute() % 5); /// minute value is divided by 5,
/// the remainder is stored
                               /// in integer x.

  if (x + rtc.second() == 0)  /// Sampling of the logger.
{

  float voltA0 = (analogRead(A0) * (5.0 / 1023.0));
  float voltA1 = (analogRead(A1) * (5.0 / 1023.0));
  float voltA2 = (analogRead(A2) * (5.0 / 1023.0));
  float voltA3 = (analogRead(A3) * (5.0 / 1023.0));





  myFile = SD.open("Logs.csv", FILE_WRITE);
 
  myFile.print(rtc.month());
  myFile.print('/');
  myFile.print(rtc.day());
  myFile.print('/');
  myFile.print(rtc.year());
  myFile.print(",");
  myFile.print(rtc.hour());
  myFile.print(":");
  myFile.print(rtc.minute());
  myFile.print(",");
  myFile.print(" ");
  myFile.print(" ");
  myFile.print(" ");
  myFile.print(" ");  
  myFile.print(voltA0);
  myFile.print(",");
  myFile.print(voltA1);
  myFile.print(",");
  myFile.print(voltA2);
  myFile.print(",");
  myFile.print(voltA3);
  myFile.println(" ");
 

  myFile.close();

  lcd.setCursor(12, 1);
  lcd.print("XXXX"); ///Prints XXXXXX in the lcd after
  delay(200);        ///recording all the analog channels.
}

else
{
 

}

}





 

---73 de du1vss


Wednesday, September 28, 2022

Homebrew SWR / Power Meter for HF and VHF

 


A friend is asking if I can fabricate a low-cost SWR/power meter with accurate performance up to  144MHz. One of the designs I have attempted is the modified Bruene directional coupler from Roy Lewallen, W7EL.




The above circuit represents a portion of W7EL's original article. I have extracted only the directional coupler circuit, as we intend to employ an analog 200uA meter for indication.

The toroidal transformers were made from FT37-43 cores, using 10 turns in the secondary winding and a single turn in the primary winding. While wire thickness is not critical, I have opted for #24awg enamel wire for the secondary winding. The two diodes employed are a closely matched pair of 1N4148, and the two resistors are rated at 47 ohms (1/2 watt). Measures have been taken to maintain minimal lead lengths, and the compact PCB housing the circuit is conveniently positioned adjacent to the SO239 connectors.






The meter circuit incorporates toggle switches and calibration trimmers essential for precise meter calibration.

Toggle switch S1 serves the purpose of selecting between forward and reflected power, whereas toggle switch S2 facilitates the choice between power and SWR modes for measurement.







During the calibration process, I am using my Diamond SX200 meter as a reference standard, and my ICOM IC-2200H is employed to verify the power readings for both power meters. Additionally, I have prepared three distinct dummy loads – each with impedance values of 50 ohms, 75 ohms, and 100 ohms respectively. These dummy loads are necessary components for SWR calibration.




Meter calibration using SX200 as reference standard.





Actual dummy load used in the swr calibration.



Testing power response at 88MHz to 108MHz.


Testing the power response from 26MHz to 27MHz.



Testing the power response from 136MHz to 150MHz,


Assembling this project is relatively straightforward for me; however, the calibration process presents challenges. Notably, around 150MHz, there is a noticeable decline in power response. It appears that this might already be pushing the upper limits of my power meter's capabilities. Moreover, I've observed toroid transformer heating, particularly during continuous 60W testing.


I extend my heartfelt gratitude to my friend, Sir Leandro, for placing trust in and providing unwavering support for this undertaking. --- 73 de DU1VSS



Monday, September 26, 2022

Digital Tank Level Meter




At my current workplace, we operate with large tanks designed for storing huge quantities of chocolates. Regrettably, these tanks lack built-in sight glasses, imposing a burden on operators who must climb ladders frequently to gauge tank levels before initiating product transfers from the ball mill. One unfortunate incident occurred previously due to insufficient level awareness, resulting in chocolate overflow atop the tank. In response, we proposed  a solution: constructing a dual-function digital level meter.


Firstly, the meter communicates with the PLC, notifying it when the tank reaches full capacity. This triggers an immediate signal to halt the transfer pump, averting potential overflows.


Secondly, a digital display unit was installed adjacent to the tank, facilitating quick and convenient monitoring of the chocolate product's current level within the tank.


Collaborating with a friend, we divided tasks: he managed sensor mounting fabrication, while I undertook sensor selection and the microcontroller's wiring and programming.


At the heart of this project lies an important hardware component – an IFM photoelectric distance sensor. Operating on the principle of laser light measurement, it generates a standard current output (4-20mA). The sensor boasts a maximum measurement range of 10 meters, aligning perfectly with our tank's height and volume parameters.


The 16 x 2 dot matrix LCD together with the Arduino Uno microcontroller  will take care of the sampling of the analog signal from the sensor, do a simultaneous computation and display the level of the tank in real time.





To start the design we have to measure the dimension of the storage tank so that important values can be set in the sensor. The sensor will be mounted just below the lid  so this will be also the sensor origin.
Start of signal (4mA) will appear at 1,450mm below from the sensor origin and the end of signal (20mA) will be at 250mm below the sensor origin.







Given that the sensor generates a current output, we need to convert this current into a 0-5V range, which is in line with the analog channels' specifications of our microcontroller. To fulfill this task, my chosen approach involves adding a 150 ohm resistor soldered in parallel with the (A0) analog channel of the microcontroller. This configuration effectively transforms the sensor's current output into an analog voltage range spanning from 0.6V to 3.0V.


Pin 1 of the sensor serves as the +24V power input, while the sensor's current output is directed to pin 2. This output will be directly connected to the A0 analog channel of our microcontroller. Pin 4 is a normally closed (NC) contact embedded within the sensor. When the product level exceeds the container's lid, this contact will open, triggering a signal sent to the PLC and prompting the transfer pump to halt. Finally, pin 3 functions as the common ground connection.


The tank's content will be visually reported as a percentage level, which we can achieve through mathematical calculations. Employing the Microsoft Excel application, we can create a chart and derive a linear expression from the sensor's range and the corresponding % level data. This linear expression, representing a calibration curve, will then be utilized by the microcontroller to execute calculations and accurately display the tank's % level.



calibration curve linear expression: Y= 41.667X-25
where Y is the  % Level and X is the analog voltage sampled by the microcontroller at channel A0.



The difference in voltage between the photoelectric distance sensor and the microcontroller is efficiently managed by LM2596 buck down converter. This setup accommodates the sensor's operation at a 24Vdc rail while ensuring the microcontroller operates on a 5Vdc supply. Opting for a linear regulator like the 7805 proves unfeasible in this scenario due to the substantial difference between the input and output voltage levels.




After completing the hardware wiring and testing, our functional level meter is now put to test. Below are the actual pictures taken of the display unit installed near the tank.







 I would like to thank my friend, sir Cliff for helping me complete this project. ---73 de du1vss



Sunday, June 23, 2019

Programming TK-3000:M6






My new company just bought 10 pcs of Kenwood TK-3000:M6 radio to help our communication inside the plant but the supplier only provide a single programmed frequency in the channel knob. Another problem arise after we found out that the typical range of this unit is not sufficient to cover the entire plant and the only way to solve the problem is to deploy a repeater.

To begin with my repeater project, I need to construct first a programmer and found some some useful circuit here. "http://www.repeater-builder.com/kenwood/kenwood-software-and-cable-list.html" . I just use 2sc9013 NPN transistor and 1N4148 as required in the schematic.





Using my trusted "ugly construction technique", my programmer is now ready. Few more things needed in order to start programming and these are;

  • KPG-137D software from Kenwood
  • USB-Serial converter




Some settings in the KPG-137D needs to be set correctly such as the port number assigned in the usb-serial converter and the model / frequency range of the radio.


If you need a copy of the software just drop me a message below. ---73 de du1vss

Saturday, November 3, 2018

Voice Activated Repeater Controller Using LB1403N


Here is my first attempt to construct a voice activated repeater controller using a VU driver IC LB1403N. Instead of driving a group of LEDs, the first pin is used to pull down the PTT (push to talk) of the transmitter. A small portion of the received audio is routed to the transmitter via the 100K, 0.1uF and 10K potentiometer.




The entire circuit is relatively simple and the only drawback is that it needs a high level of audio input coming from the receiver to keep the PTT close all the time during transmission. The protoype board is connected to my Icom IC-2200H as the transmitter and Icom IC-V80 as the receiver. ---73 de du1vss

Saturday, March 31, 2018

Mosfet Replacement in Pallet Amp Trick


I would like to share my trick in replacing the mosfet from pallet amplifier which I learned from my experiences in pallet fabrication and repairs. Most of us would like to unsolder those mosfet legs first one by one and is the most difficult to do since too much heating on those pcb pads would accidentally delaminate the copper from the board.

My shortcut in doing this is to cut the legs of the mosfet using a cutter blade but before doing this please make sure that the mosfet is verified defective!



After freeing the mosfet, now unsolder the remaining mosfet legs from the board using a soldering iron. Cleaned the board, apply fresh thermal paste and mount the new mosfet.  73 de du1vss

Sunday, January 28, 2018

DDS based VFO



Another weekend project is this variable frequency oscillator based from dds chip. I found this project useful in my home brew dsb transceiver and testing several filters and rf amplifiers.

I bought the dds chip from Lazada, the cloned arduino is from Alexan, and the lcd module is from E-Gizmo. The dds is able to generate an rf signal from 1MHz to 30MHz with adjustable tuning steps from 10Hz, 50Hz, 100Hz, 500Hz, 1KHz, 2.5KHz, 5KHz, 10KHz, 100KHz and 1Mhz.


A broadband rf amplifier is also included to boost the amplitude of the dds signal. Around 3V peak to peak was measured at 7Mhz and decrease gradually on higher frequencies.


Credit is given to AD7C in which the schematic and the arduino code was copied. The broadband rf amplifier is not shown however.




A beautiful 7MHz sinusoidal wave  can be seen in my Tektonix oscilloscope. One thing I observed however, the 125MHz reference clock is heating specially when the dds module is supplied with 5V but this did not affect the quality of the signal output generated by the module. One option is to use the 3.3V supply found in arduino uno but the signal level from the module is reduced. EMI and other interference could also stop the module from generating rf signal.    ---73 de du1vss