This is an adaptation of a Processing.js example originally written by Jim Bumgardner.
His tutorial entitled "Circles, Spirals and Sunflowers" can be found here: http://krazydad.com/tutorials/circles_js/
Following code adapts Jim's example #10.
Credit also goes to TonioElGringo on stackexchange, for the help he provided here: http://tex.stackexchange.com/questions/192028/

Edit and compile if you like:
% Phyllotaxy% Author: David Convent\documentclass[tikz,border=10pt]{standalone}\usetikzlibrary{calc}\def\nbrcircles {377}\def\outerradius {30mm}\def\deviation {.9}\def\fudge {.62}\newcounter{cumulArea}\setcounter{cumulArea}{0}\begin{document}\begin{tikzpicture}[scale=.32]\pgfmathsetmacro {\goldenRatio} {(1+sqrt(5))}\pgfmathsetmacro {\meanArea}{pow(\outerradius * 10 / \nbrcircles, 2) * pi}\pgfmathsetmacro {\minArea} {\meanArea * (1 - \deviation)}\pgfmathsetmacro {\midArea} {\meanArea * (1 + \deviation) - \minArea}\foreach \b in {0,...,\nbrcircles}{% mod() must be used in order to calculate the right angle.% otherwise, when \b is greater than 28 the angle is greater% than 16384 and an error is raised ('Dimension too large').% -- thx Tonio for this one.\pgfmathsetmacro{\angle}{mod(\goldenRatio * \b, 2) * 180}\pgfmathsetmacro{\sratio}{\b / \nbrcircles}\pgfmathsetmacro{\smArea}{\minArea + \sratio * \midArea}\pgfmathsetmacro{\smRadius}{sqrt(\smArea / pi) / 2 * \fudge}\addtocounter{cumulArea}{\smArea};\pgfmathparse{sqrt(\value{cumulArea} / pi) / 2}\fill[] (\angle:\pgfmathresult) circle [radius=\smRadius] ;}\end{tikzpicture}\end{document}
Click to download: phyllotaxy.tex • phyllotaxy.pdf
Open in Overleaf: phyllotaxy.tex